Initial
authorChris Jaekl <cejaekl@yahoo.com>
Fri, 12 Dec 2014 05:36:40 +0000 (00:36 -0500)
committerChris Jaekl <cejaekl@yahoo.com>
Fri, 12 Dec 2014 05:36:40 +0000 (00:36 -0500)
100 files changed:
COPYING [new file with mode: 0644]
README [new file with mode: 0644]
WEB-INF/classes/frank.properties [new file with mode: 0644]
WEB-INF/lib/commons-codec-1.6.jar [new file with mode: 0644]
WEB-INF/lib/commons-logging-1.1.3.jar [new file with mode: 0644]
WEB-INF/lib/fluent-hc-4.3.5.jar [new file with mode: 0644]
WEB-INF/lib/httpclient-4.3.5.jar [new file with mode: 0644]
WEB-INF/lib/httpclient-cache-4.3.5.jar [new file with mode: 0644]
WEB-INF/lib/httpcore-4.3.2.jar [new file with mode: 0644]
WEB-INF/lib/httpmime-4.3.5.jar [new file with mode: 0644]
WEB-INF/lib/xml-apis.jar [new file with mode: 0644]
WEB-INF/web.xml [new file with mode: 0644]
cov.sh [new file with mode: 0755]
go.sh [new file with mode: 0755]
index.html [new file with mode: 0644]
jcov/jcov.jar [new file with mode: 0644]
jcov/jcov_file_saver.jar [new file with mode: 0644]
jcov/jcov_network_saver.jar [new file with mode: 0644]
jcov/jtobserver.jar [new file with mode: 0644]
prod/frank.properties [new file with mode: 0644]
prod/net/jaekl/frank/FrankBundle.java [new file with mode: 0644]
prod/net/jaekl/frank/FrankException.java [new file with mode: 0644]
prod/net/jaekl/frank/Schedule.java [new file with mode: 0644]
prod/net/jaekl/frank/ViewSchedule.java [new file with mode: 0644]
prod/net/jaekl/frank/octranspo/NextTrips.java [new file with mode: 0644]
prod/net/jaekl/frank/octranspo/Route.java [new file with mode: 0644]
prod/net/jaekl/frank/octranspo/RouteSummary.java [new file with mode: 0644]
prod/net/jaekl/frank/octranspo/Server.java [new file with mode: 0644]
prod/net/jaekl/frank/octranspo/StopInfo.java [new file with mode: 0644]
prod/net/jaekl/frank/octranspo/Trip.java [new file with mode: 0644]
prod/net/jaekl/qd/QDBundleFactory.java [new file with mode: 0644]
prod/net/jaekl/qd/QDException.java [new file with mode: 0644]
prod/net/jaekl/qd/http/RequestBroker.java [new file with mode: 0644]
prod/net/jaekl/qd/util/ExceptionUtils.java [new file with mode: 0644]
prod/net/jaekl/qd/util/ParseUtils.java [new file with mode: 0644]
prod/net/jaekl/qd/util/StringUtils.java [new file with mode: 0644]
prod/net/jaekl/qd/xml/MismatchedTagsException.java [new file with mode: 0644]
prod/net/jaekl/qd/xml/MissingInfoException.java [new file with mode: 0644]
prod/net/jaekl/qd/xml/ParseHandler.java [new file with mode: 0644]
prod/net/jaekl/qd/xml/ParseResult.java [new file with mode: 0644]
prod/net/jaekl/qd/xml/XmlParseException.java [new file with mode: 0644]
report/allclasses-frame.html [new file with mode: 0644]
report/index.html [new file with mode: 0644]
report/net/jaekl/frank/FrankBundle.html [new file with mode: 0644]
report/net/jaekl/frank/FrankException.html [new file with mode: 0644]
report/net/jaekl/frank/Schedule.html [new file with mode: 0644]
report/net/jaekl/frank/ViewSchedule.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/NextTrips.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/Route.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/RouteSummary.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/Server.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/StopInfo.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/Trip.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/package-frame.html [new file with mode: 0644]
report/net/jaekl/frank/octranspo/package-summary.html [new file with mode: 0644]
report/net/jaekl/frank/package-frame.html [new file with mode: 0644]
report/net/jaekl/frank/package-summary.html [new file with mode: 0644]
report/net/jaekl/qd/QDBundleFactory.html [new file with mode: 0644]
report/net/jaekl/qd/QDException.html [new file with mode: 0644]
report/net/jaekl/qd/http/RequestBroker.html [new file with mode: 0644]
report/net/jaekl/qd/http/package-frame.html [new file with mode: 0644]
report/net/jaekl/qd/http/package-summary.html [new file with mode: 0644]
report/net/jaekl/qd/package-frame.html [new file with mode: 0644]
report/net/jaekl/qd/package-summary.html [new file with mode: 0644]
report/net/jaekl/qd/util/ExceptionUtils.html [new file with mode: 0644]
report/net/jaekl/qd/util/ParseUtils.html [new file with mode: 0644]
report/net/jaekl/qd/util/StringUtils.html [new file with mode: 0644]
report/net/jaekl/qd/util/package-frame.html [new file with mode: 0644]
report/net/jaekl/qd/util/package-summary.html [new file with mode: 0644]
report/net/jaekl/qd/xml/MismatchedTagsException.html [new file with mode: 0644]
report/net/jaekl/qd/xml/MissingInfoException.html [new file with mode: 0644]
report/net/jaekl/qd/xml/ParseHandler.html [new file with mode: 0644]
report/net/jaekl/qd/xml/ParseResult.html [new file with mode: 0644]
report/net/jaekl/qd/xml/XmlParseException.html [new file with mode: 0644]
report/net/jaekl/qd/xml/package-frame.html [new file with mode: 0644]
report/net/jaekl/qd/xml/package-summary.html [new file with mode: 0644]
report/overview-frame.html [new file with mode: 0644]
report/overview-summary.html [new file with mode: 0644]
report/sorttable.js [new file with mode: 0644]
report/style.css [new file with mode: 0644]
result.xml [new file with mode: 0644]
setcp.sh [new file with mode: 0644]
template.xml [new file with mode: 0644]
test/net/jaekl/frank/Main.java [new file with mode: 0644]
test/net/jaekl/frank/ScheduleTest.java [new file with mode: 0644]
test/net/jaekl/frank/ViewScheduleTest.java [new file with mode: 0644]
test/net/jaekl/frank/octranspo/RouteMock.java [new file with mode: 0644]
test/net/jaekl/frank/octranspo/RouteSummaryMock.java [new file with mode: 0644]
test/net/jaekl/frank/octranspo/ServerMock.java [new file with mode: 0644]
test/net/jaekl/frank/octranspo/ServerTest.java [new file with mode: 0644]
test/net/jaekl/frank/octranspo/TripMock.java [new file with mode: 0644]
test/net/jaekl/qd/QDBundleFactoryTest.java [new file with mode: 0644]
test/net/jaekl/qd/http/HttpServletRequestMock.java [new file with mode: 0644]
test/net/jaekl/qd/http/RequestBrokerMock.java [new file with mode: 0644]
test/net/jaekl/qd/http/RequestBrokerTest.java [new file with mode: 0644]
test/net/jaekl/qd/util/ExceptionUtilsTest.java [new file with mode: 0644]
test/net/jaekl/qd/util/ParseUtilsTest.java [new file with mode: 0644]
test/net/jaekl/qd/util/StringUtilsTest.java [new file with mode: 0644]
test/net/jaekl/qd/xml/MissingInfoExceptionTest.java [new file with mode: 0644]
test/net/jaekl/qd/xml/ParseResultTest.java [new file with mode: 0644]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..10926e8
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,675 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..3a7f751
--- /dev/null
+++ b/README
@@ -0,0 +1,55 @@
+------------
+Introduction
+------------
+
+This is the source code for Frank, a simple Java Servlet that 
+will query the OC Transpo (www.octranspo.com) GPS data API.
+
+Frank uses parts of QuanDocs, which is released under the GPL
+(GNU Public Licence version 3 or, at your option, any later
+version) and, thus, Frank is also available under GPLv3-or-later.
+Please see the file COPYING for the full terms of this licence.
+
+------------
+Dependencies
+------------
+
+Frank's production code depends on the following external libraries:
+
+    - Jenkins-WinStone (LGPL, Debian package libjenkins-winstone-java)
+      You could substitute a different servlet engine if you modif go.sh
+    - Apache HttpComponents 4.3 (Apache Licence, packaged with Frank
+      because as of this writing Debian stable doesn't yet provide it)
+
+The Unit Tests (invoked via cov.sh) rely on a couple of additional 
+libraries:
+
+    - JUnit 4 (Eclipse Public Licence, Debian package junit4)
+      the same reason as HttpComponents 4.3)
+    - Oracle jcov (GPLv2 + classpath exception, also packaged with 
+      Frank because Debian doesn't yet include it)
+
+If you are not building on Debian Linux, then you'll need to 
+download WinStone and JUnit4 separately, and edit setcp.sh to 
+point to the correct paths.
+
+---------------------
+Compiling and Running
+---------------------
+    
+To build the source code, run its unit tests, and generate 
+a code coverage report:
+
+    $ . ./setcp.sh
+    $ ./cov.sh
+    $ www-browser ./report/index.html
+
+To build the source code and run it in the WinStone Servlet Engine:
+
+    $ . ./setcp.sh
+    $ ./go.sh
+
+Note that the OC Transpo server will refuse to answer unless you have 
+a valid AppID + APIKey combination, but my APIKey is not included in this 
+source distribution.  You'll need to get your own from octranspo.com.
+
diff --git a/WEB-INF/classes/frank.properties b/WEB-INF/classes/frank.properties
new file mode 100644 (file)
index 0000000..e508d3f
--- /dev/null
@@ -0,0 +1,12 @@
+data.collected=Data collected <SPAN ID="elapsed">0m 0s</SPAN> ago at {0}.
+destination=Destination
+error.page=Error Page
+eta=ETA
+frank=Frank
+gps.off=GPS off
+gps.read=GPS Read
+m=m
+remain=Remain
+route=Route
+s=s
+unexpected.error=Unexpected Error
diff --git a/WEB-INF/lib/commons-codec-1.6.jar b/WEB-INF/lib/commons-codec-1.6.jar
new file mode 100644 (file)
index 0000000..ee1bc49
Binary files /dev/null and b/WEB-INF/lib/commons-codec-1.6.jar differ
diff --git a/WEB-INF/lib/commons-logging-1.1.3.jar b/WEB-INF/lib/commons-logging-1.1.3.jar
new file mode 100644 (file)
index 0000000..ab51254
Binary files /dev/null and b/WEB-INF/lib/commons-logging-1.1.3.jar differ
diff --git a/WEB-INF/lib/fluent-hc-4.3.5.jar b/WEB-INF/lib/fluent-hc-4.3.5.jar
new file mode 100644 (file)
index 0000000..83fc91e
Binary files /dev/null and b/WEB-INF/lib/fluent-hc-4.3.5.jar differ
diff --git a/WEB-INF/lib/httpclient-4.3.5.jar b/WEB-INF/lib/httpclient-4.3.5.jar
new file mode 100644 (file)
index 0000000..1db1225
Binary files /dev/null and b/WEB-INF/lib/httpclient-4.3.5.jar differ
diff --git a/WEB-INF/lib/httpclient-cache-4.3.5.jar b/WEB-INF/lib/httpclient-cache-4.3.5.jar
new file mode 100644 (file)
index 0000000..8f923b5
Binary files /dev/null and b/WEB-INF/lib/httpclient-cache-4.3.5.jar differ
diff --git a/WEB-INF/lib/httpcore-4.3.2.jar b/WEB-INF/lib/httpcore-4.3.2.jar
new file mode 100644 (file)
index 0000000..813ec23
Binary files /dev/null and b/WEB-INF/lib/httpcore-4.3.2.jar differ
diff --git a/WEB-INF/lib/httpmime-4.3.5.jar b/WEB-INF/lib/httpmime-4.3.5.jar
new file mode 100644 (file)
index 0000000..8a02dd2
Binary files /dev/null and b/WEB-INF/lib/httpmime-4.3.5.jar differ
diff --git a/WEB-INF/lib/xml-apis.jar b/WEB-INF/lib/xml-apis.jar
new file mode 100644 (file)
index 0000000..89c72d4
Binary files /dev/null and b/WEB-INF/lib/xml-apis.jar differ
diff --git a/WEB-INF/web.xml b/WEB-INF/web.xml
new file mode 100644 (file)
index 0000000..a6d2aef
--- /dev/null
@@ -0,0 +1,26 @@
+<!--?xml version="1.0" encoding="ISO-8859-1"?-->
+<!DOCTYPE web-app
+     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
+     "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
+<web-app>
+         <display-name>Welcome to our server</display-name>
+         <description>Welcome to our server</description>
+         <servlet>
+           <servlet-name>ViewSchedule</servlet-name>
+           <servlet-class>net.jaekl.frank.ViewSchedule</servlet-class>
+         </servlet>
+        
+         <servlet-mapping>
+           <servlet-name>ViewSchedule</servlet-name>
+           <url-pattern>/ViewSchedule</url-pattern>
+         </servlet-mapping>
+        
+<!--
+         <welcome-file-list>
+           <welcome-file>index.jsp</welcome-file>
+           <welcome-file>index.html</welcome-file>
+           <welcome-file>index.htm</welcome-file>
+         </welcome-file-list>
+-->
+       </web-app>
+
diff --git a/cov.sh b/cov.sh
new file mode 100755 (executable)
index 0000000..4404b78
--- /dev/null
+++ b/cov.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+WEB_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+INSTR_DIR="${WEB_ROOT}/../instr"
+
+#####################
+echo Compiling...
+find "${WEB_ROOT}/prod" -name "*.java" | xargs javac
+find "${WEB_ROOT}/test" -name "*.java" | xargs javac -classpath ${WEB_ROOT}/prod:${CLASSPATH}
+
+#####################
+echo Cleaning old coverage files...
+for x in "${INSTR_DIR}" report
+do
+    if [ -d "${x}" ]; then
+       rm -rf "${x}"
+    fi
+    mkdir -p "${x}"
+done
+for x in result.xml template.xml
+do
+    if [ -w ${x} ]; then
+       rm ${x}
+    fi
+done
+
+#####################
+echo Instrumenting...
+java -classpath "${CLASSPATH}" -jar `pwd`/jcov/jcov.jar Instr -t template.xml -o "${INSTR_DIR}" -type all "${WEB_ROOT}/prod"
+
+#####################
+echo Running unit tests...
+
+TESTS=""
+for x in `cd ${WEB_ROOT}/test; find . -name '*Test.class'`
+do
+    #echo CANDIDATE $x
+    TEST_CLASS=`echo ${x} | sed s:\^./:: | cut -d . -f 1 | sed s:/:.:g`
+    #echo TEST_CLASS ${TEST_CLASS}
+    TESTS="${TEST_CLASS} ${TESTS}"
+done
+
+java -Djcov.template=${WEB_ROOT}/template.xml -Djcov.file=${WEB_ROOT}/result.xml -classpath "${INSTR_DIR}:${WEB_ROOT}/test:${CLASSPATH}:/usr/share/java/junit.jar:${WEB_ROOT}/jcov/jcov_file_saver.jar" org.junit.runner.JUnitCore ${TESTS}
+
+#####################
+echo Generating HTML Report...
+
+java -jar "${WEB_ROOT}/jcov/jcov.jar" RepGen -sourcepath "${WEB_ROOT}/prod" -log.level FINE result.xml
diff --git a/go.sh b/go.sh
new file mode 100755 (executable)
index 0000000..5822733
--- /dev/null
+++ b/go.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+WEB_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo Compiling...
+find "${WEB_ROOT}/prod" -name "*.java" | xargs javac -classpath ${WEB_ROOT}/prod:${CLASSPATH}
+cp -r ${WEB_ROOT}/prod/* ${WEB_ROOT}/WEB-INF/classes/
+find "${WEB_ROOT}/prod" -name '*.class' -exec rm {} \;
+echo Launching...
+java -jar /usr/share/java/jenkins-winstone.jar "${WEB_ROOT}"
diff --git a/index.html b/index.html
new file mode 100644 (file)
index 0000000..c110dd3
--- /dev/null
@@ -0,0 +1,33 @@
+<HTML>
+  <HEAD>
+    <TITLE>Frank Welcome Page</TITLE>
+  </HEAD>
+  <BODY>
+    <H1>Welcome to Frank</H1>
+    <H2>Choose a preselected stop:</H2>
+    <P>
+      <A HREF="/ViewSchedule?stop=2438&route=">Bronson at Sunnyside, NB</A><BR/>
+      <A HREF="/ViewSchedule?stop=6781&route=">Bronson at Sunnyside, SB</A><BR/>
+      <A HREF="/ViewSchedule?stop=6683&route=">Sunnyside at Seneca, EB</A><BR/>
+      <A HREF="/ViewSchedule?stop=7655&route=">Bank at Sunnyside, NB</A><BR/>
+      <A HREF="/ViewSchedule?stop=6778&route=">Bank at Hopewell, SB</A><BR/>
+      <A HREF="/ViewSchedule?stop=7649&route=">Riverdale at Sunnyside, NB</A><BR/>
+      <A HREF="/ViewSchedule?stop=3034&route=">Billings Bridge Station (All Directions)</A><BR/>
+      <A HREF="/ViewSchedule?stop=6612&route=">Carleton U (All Directions)</A><BR/>
+      <A HREF="/ViewSchedule?stop=3009&route=">Rideau Centre (All Directions)</A><BR/>
+    </P>
+    <P>
+      <A HREF="/ViewSchedule?stop=6668&route=">Somerset at LeBreton EB</A><BR/>
+      <A HREF="/ViewSchedule?stop=2363&route=">Somerset at Bronson EB</A><BR/>
+      <A HREF="/ViewSchedule?stop=6625&route=">Bronson at Somerset NB</A><BR/>
+      <A HREF="/ViewSchedule?stop=5690&route=">Bronson at Somerset SB</A><BR/>
+    </P>
+    <H2>Or, enter your stop number:</H2>
+    <P>
+      <FORM NAME="EnterStopNo" ACTION="/ViewSchedule" METHOD="get">
+        <INPUT TYPE="text" NAME="stop"/>
+        <INPUT TYPE="submit" VALUE="Submit"/>
+      </FORM>
+    </P>
+  </BODY>
+</HTML>
diff --git a/jcov/jcov.jar b/jcov/jcov.jar
new file mode 100644 (file)
index 0000000..ff0ab73
Binary files /dev/null and b/jcov/jcov.jar differ
diff --git a/jcov/jcov_file_saver.jar b/jcov/jcov_file_saver.jar
new file mode 100644 (file)
index 0000000..c6f986f
Binary files /dev/null and b/jcov/jcov_file_saver.jar differ
diff --git a/jcov/jcov_network_saver.jar b/jcov/jcov_network_saver.jar
new file mode 100644 (file)
index 0000000..ef29e13
Binary files /dev/null and b/jcov/jcov_network_saver.jar differ
diff --git a/jcov/jtobserver.jar b/jcov/jtobserver.jar
new file mode 100644 (file)
index 0000000..7823085
Binary files /dev/null and b/jcov/jtobserver.jar differ
diff --git a/prod/frank.properties b/prod/frank.properties
new file mode 100644 (file)
index 0000000..e508d3f
--- /dev/null
@@ -0,0 +1,12 @@
+data.collected=Data collected <SPAN ID="elapsed">0m 0s</SPAN> ago at {0}.
+destination=Destination
+error.page=Error Page
+eta=ETA
+frank=Frank
+gps.off=GPS off
+gps.read=GPS Read
+m=m
+remain=Remain
+route=Route
+s=s
+unexpected.error=Unexpected Error
diff --git a/prod/net/jaekl/frank/FrankBundle.java b/prod/net/jaekl/frank/FrankBundle.java
new file mode 100644 (file)
index 0000000..f0889ba
--- /dev/null
@@ -0,0 +1,61 @@
+package net.jaekl.frank;
+
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.jaekl.qd.QDBundleFactory;
+
+public class FrankBundle {
+       public static final String DATA_COLLECTED = "data.collected";
+       public static final String DESTINATION = "destination";
+       public static final String ERROR_PAGE = "error.page";
+       public static final String ETA = "eta";
+       public static final String FRANK = "frank";
+       public static final String GPS_OFF = "gps.off";
+       public static final String GPS_READ = "gps.read";
+       public static final String MINUTES = "m";       // suffix (abbreviated) for minutes
+       public static final String REMAIN = "remain";
+       public static final String ROUTE = "route";
+       public static final String SECONDS = "s";
+       public static final String UNEXPECTED_ERROR = "unexpected.error";
+       
+       final static String BUNDLE_NAME = "frank";
+       
+       static ConcurrentHashMap<Locale, FrankBundle> m_bundleMap = new ConcurrentHashMap<Locale, FrankBundle>();
+       
+       ResourceBundle m_bundle;
+       
+       public static FrankBundle getInst(Locale locale) {
+               FrankBundle result = m_bundleMap.get(locale);
+               if (null == result) {
+                       synchronized(FrankBundle.class) {
+                               result = m_bundleMap.get(locale);
+                               if (null == result) {
+                                       result = new FrankBundle(locale); 
+                               }
+                               m_bundleMap.put(locale, result);
+                       }
+               }
+               return result;
+       }
+       
+       private FrankBundle(Locale locale) {
+               m_bundle = QDBundleFactory.getInst().getBundle(BUNDLE_NAME, locale); 
+       }
+       
+       public String get(String key) {
+               try {
+                       if (null != m_bundle) {
+                               return m_bundle.getString(key);
+                       }
+               }
+               catch (MissingResourceException e) {
+                       // Make it clear that something has gone wrong.
+                       e.printStackTrace();    
+                       // Fall through to the fallback behaviour below
+               }
+               return "[" + key + "]";
+       }
+}
diff --git a/prod/net/jaekl/frank/FrankException.java b/prod/net/jaekl/frank/FrankException.java
new file mode 100644 (file)
index 0000000..e7175fc
--- /dev/null
@@ -0,0 +1,11 @@
+package net.jaekl.frank;
+
+import java.lang.Exception;
+
+public class FrankException extends Exception {
+       private static final long serialVersionUID = 1L;
+
+       public FrankException(Throwable cause) {
+               super(cause);
+       }
+}
diff --git a/prod/net/jaekl/frank/Schedule.java b/prod/net/jaekl/frank/Schedule.java
new file mode 100644 (file)
index 0000000..c7fd70b
--- /dev/null
@@ -0,0 +1,148 @@
+package net.jaekl.frank;
+
+import java.io.PrintWriter;
+import java.text.DateFormat;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import net.jaekl.frank.octranspo.Route;
+import net.jaekl.frank.octranspo.StopInfo;
+import net.jaekl.frank.octranspo.Trip;
+
+public class Schedule {
+       Locale m_locale;
+       FrankBundle m_bundle;
+       DateFormat m_hourMinFmt;
+       DateFormat m_hourMinSecFmt;
+       
+       public Schedule(Locale locale) {
+               m_locale = locale;
+               m_bundle = FrankBundle.getInst(locale);
+               m_hourMinFmt = new SimpleDateFormat("hh:mma", locale);
+               m_hourMinSecFmt = new SimpleDateFormat("hh:mm:ssa", locale);
+       }
+       
+       String trans(String key) {
+               return m_bundle.get(key);
+       }
+       
+       String mapUrl(double latitude, double longitude) {
+               return "http://www.openstreetmap.org/?mlat=" + latitude + "&mlon=" + longitude + "&zoom=15";
+       }
+       
+       void writeStyle(PrintWriter pw) {
+               pw.println("<STYLE>");
+               pw.println("  body {background-color: #F0F0C0; font-size: 1.5em; }");
+               pw.println("  #trips {border-collapse: collapse; font-size: 1.5em; }");
+               pw.println("  #trips td, #trips th {border: 1px solid #600000; padding: 3px 3px 3px 3px; text-align: center;}");
+               pw.println("  #trips th {background-color: #800000; color: #FFFFFF; }");
+               pw.println("  #trips tr.ghost td {background-color: #C0C0C0;}");
+               pw.println("</STYLE>");
+       }
+       
+       // Countdown timer that updates time remaining until each bus is expected.
+       void writeScript(PrintWriter pw, String remainArray, int remainCount) {
+               String min = trans(FrankBundle.MINUTES);
+               String sec = trans(FrankBundle.SECONDS);
+               
+               pw.println("<SCRIPT>");
+           pw.println("var start; var interval; var remain;");
+           pw.println("window.onload = function() { start = new Date(); interval = setInterval(\"Tick()\", 1000); remain = " + remainArray + "; }");
+           pw.println("function Tick() { ");
+           pw.println("  var now = new Date(); var delta = Math.floor((now.getTime() - start.getTime()) / 1000); ");
+           pw.println("  var secs = delta % 60; var mins = Math.floor(delta / 60);");
+           pw.println("  document.getElementById(\"elapsed\").innerHTML = mins + \"" + min + " \" + secs + \"" + sec + "\";");
+           pw.println("  for (var i = 0; i < " + remainCount + "; ++i) {");
+           pw.println("    var id = \"in_\" + i;");
+           pw.println("    var element = document.getElementById(id);");
+           pw.println("    var remain_delta = (remain[i] * 60) + 30 - delta;");
+           pw.println("    if (remain_delta <= 0) {");
+           pw.println("      element.innerHTML = \"----\";");
+           pw.println("    } else {");
+           pw.println("      element.innerHTML = (Math.floor(remain_delta / 60)) + \"" + trans(min) + "\";");
+           pw.println("    }");
+           pw.println("  }");
+           pw.println("}");
+           pw.println("</SCRIPT>");
+
+       }
+       
+       void writeHeader(PrintWriter pw, String title) {
+               pw.println("<HTML>");
+               pw.println("<HEAD>");
+               pw.println("<TITLE>" + title + "</TITLE>");
+               writeStyle(pw);
+               pw.println("</HEAD>");
+       }
+       
+       void writePage(PrintWriter pw, StopInfo stopInfo)
+       {
+               StringBuilder remainArray = new StringBuilder("[ ");
+               int           remainCount = 0;
+               
+               String title = stopInfo.getDescr() + " (" + stopInfo.getStopNo() + ")";
+               String min = trans(FrankBundle.MINUTES);
+               
+               writeHeader(pw, trans(FrankBundle.FRANK) + ": " + title);
+               
+               pw.println("<BODY>");
+               pw.println("  <TABLE ID=\"trips\">");
+               pw.println("    <TR><TH COLSPAN=\"5\">" + title + "</TH></TR>");
+               pw.println("    <TR><TH>" +
+                       trans(FrankBundle.ROUTE) + 
+                               "</TH><TH>" +
+                               trans(FrankBundle.DESTINATION) +
+                               "</TH><TH>" +
+                               trans(FrankBundle.ETA) +
+                               "</TH><TH>" +
+                               trans(FrankBundle.REMAIN) +  
+                               "</TH><TH>" +
+                               trans(FrankBundle.GPS_READ) +
+                               "</TH>");
+               
+               for (int routeIdx = 0; routeIdx < stopInfo.getNumRoutes(); ++routeIdx) {
+                       Route route = stopInfo.getRoute(routeIdx);
+                       for (int tripIdx = 0; tripIdx < route.getNumTrips(); ++tripIdx) {
+                               Trip trip = route.getTrip(tripIdx);
+                               boolean isGhost = ((-1) == trip.getAdjAge());
+                               if (isGhost) {
+                                       // GPS is off.  This bus may not exist.
+                                       pw.println("    <TR CLASS=\"ghost\">");
+                               } else {
+                                       pw.println("    <TR>");
+                               }
+                               pw.println("      <TD>" + route.getRouteNo() + "</TD>");
+                               pw.println("      <TD>" + trip.getDest() + "</TD>");
+                               pw.println("      <TD>" + m_hourMinFmt.format(trip.getETA()) + "</TD>");
+                               
+                               pw.println("      <TD><SPAN ID=\"in_" + remainCount + "\">"+ trip.getAdjTime()+min+"</SPAN></TD>");
+                               if (remainCount > 0) {
+                                       remainArray.append(", ");
+                               }
+                               remainArray.append(trip.getAdjTime());
+                               remainCount++;
+                               
+                               if (trip.getAdjAge() < 0) {
+                                       pw.println("      <TD>" + trans(FrankBundle.GPS_OFF) + "</TD>");
+                               }
+                               else {
+                                       pw.println("      <TD><A HREF=\"" + mapUrl(trip.getLatitude(), trip.getLongitude()) + 
+                                                          "\">" + m_hourMinSecFmt.format(trip.getGPSTime()) + "</A></TD>");
+                               }
+                               pw.println("    </TR>");
+                       }
+               }
+               
+               pw.println("  </TABLE>");
+               
+               String dataCollectedFormat = trans(FrankBundle.DATA_COLLECTED);
+               String dataCollected = MessageFormat.format(dataCollectedFormat, m_hourMinSecFmt.format(new Date()));
+               pw.println("  <P>" + dataCollected + "</P>");
+               
+               remainArray.append(" ]");
+               writeScript(pw, remainArray.toString(), remainCount);
+               pw.println("</BODY></HTML>");
+       }
+}
diff --git a/prod/net/jaekl/frank/ViewSchedule.java b/prod/net/jaekl/frank/ViewSchedule.java
new file mode 100644 (file)
index 0000000..e044f70
--- /dev/null
@@ -0,0 +1,125 @@
+package net.jaekl.frank;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.jaekl.frank.octranspo.Server;
+import net.jaekl.frank.octranspo.StopInfo;
+import net.jaekl.qd.util.ExceptionUtils;
+
+public class ViewSchedule extends HttpServlet {
+       private static final long serialVersionUID = 1L;
+       
+       static final String BUNDLE_NAME = "frank";
+       static final String STOP = "stop";
+       static final String ROUTE = "route";
+       static final String LANG = "lang";
+       
+       int getParamInt(HttpServletRequest req, String paramName) {
+               String valueStr = getParamString(req, paramName);
+               try {
+                       return Integer.parseInt(valueStr);
+               }
+               catch (NumberFormatException exc) {
+                       // TODO:  Error page
+                       return 0;
+               }
+       }
+       
+       String getParamString(HttpServletRequest req, String paramName) {
+               String valueStr = req.getParameter(paramName);
+               if (null == valueStr|| valueStr.equals("")) {
+                       // TODO:  Error page
+                       return null;
+               }
+               return valueStr;
+       }
+       
+       Locale getLocale(HttpServletRequest req) {
+               Locale result = null;
+               String lang = getParamString(req, LANG);
+               if (null != lang) {
+                       result = new Locale(lang);
+               }
+               if (null == result) {
+                       result = Locale.getDefault();
+               }
+               return result;
+       }
+
+       @Override
+       public void doGet(HttpServletRequest req, HttpServletResponse res)
+       throws ServletException, IOException
+       {
+               res.setContentType("text/html");
+               PrintWriter pw = res.getWriter();
+               
+               Locale locale = getLocale(req);
+               int stop = getParamInt(req, STOP);
+               int route = getParamInt(req, ROUTE);
+               
+               try {
+                       FileInputStream fis = new FileInputStream("apikey.txt");
+                       try {
+                               Server server = new Server("192f31d2", fis);
+                               StopInfo stopInfo = null;
+                               
+                               if (0 == route) {
+                                       stopInfo = server.getNextTripsForStopAllRoutes(stop);
+                               }
+                               else {
+                                       stopInfo = server.getNextTripsForStop(stop, route);
+                               }
+                               Schedule schedule = new Schedule(locale);
+                               
+                               schedule.writePage(pw, stopInfo);
+                       }
+                       finally {
+                               ExceptionUtils.tryClose(fis);
+                       }
+               }
+               catch (Throwable t) {
+                       writeErrorPage(pw, t, locale);
+               }
+       }
+       
+       void writeErrorPage(PrintWriter pw, Throwable t, Locale locale) {
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               PrintStream ps = new PrintStream(baos);
+               FrankBundle bundle = FrankBundle.getInst(locale);
+               
+               pw.println("<HTML><HEAD><TITLE>" + 
+                               bundle.get(FrankBundle.FRANK) + ": " +
+                               bundle.get(FrankBundle.ERROR_PAGE) + 
+                               "</TITLE></HEAD>");
+               pw.println("<BODY><H1>" +
+                               bundle.get(FrankBundle.FRANK) + ": " +
+                               bundle.get(FrankBundle.UNEXPECTED_ERROR) + 
+                               "</H1><P><PRE>");
+
+               // Note that, if we cared about security, we would log this stack trace to a
+               // server log, and only report a cross-reference to the log file back to the 
+               // end user's browser, to avoid potentially exposing internal info that we 
+               // don't want to share.
+               // At least at this point, we don't care (that much), and trade off a 
+               // potential information leak in favour of reducing our code complexity
+               // and the administrator's workload.
+               t.printStackTrace(ps);
+               String stackTrace = baos.toString(); 
+               pw.println(stackTrace);
+                               
+               pw.println("</PRE></P></BODY>");
+               pw.println("</HTML>");
+       }
+       
+
+}
diff --git a/prod/net/jaekl/frank/octranspo/NextTrips.java b/prod/net/jaekl/frank/octranspo/NextTrips.java
new file mode 100644 (file)
index 0000000..c72a651
--- /dev/null
@@ -0,0 +1,11 @@
+package net.jaekl.frank.octranspo;
+
+public class NextTrips extends StopInfo {
+       static final String ROOT_TAG = "GetNextTripsForStopResult";
+       static final String[] INTERNAL = { STOP_NO, STOP_LABEL, ERROR, ROUTES };
+       static final Object[][] EXTERNAL = { { ROUTE, Route.class} };
+
+       public NextTrips() {
+               super(ROOT_TAG, INTERNAL, EXTERNAL);
+       }
+}
diff --git a/prod/net/jaekl/frank/octranspo/Route.java b/prod/net/jaekl/frank/octranspo/Route.java
new file mode 100644 (file)
index 0000000..5bd8834
--- /dev/null
@@ -0,0 +1,72 @@
+package net.jaekl.frank.octranspo;
+
+import java.util.ArrayList;
+import net.jaekl.qd.xml.ParseResult;
+import net.jaekl.qd.xml.XmlParseException;
+
+public class Route extends ParseResult {
+       static final String ROUTE = "Route";
+       
+       static final String ROUTE_NO = "RouteNo";
+       static final String DIRECTION_ID = "DirectionID";
+       static final String DIRECTION = "Direction";
+       static final String ROUTE_HEADING = "RouteHeading";
+       static final String ROUTE_LABEL = "RouteLabel"; // What GetNextTripsForStop calls <RouteHeading>        
+       static final String TRIPS = "Trips";
+       
+       static final String TRIP = "Trip";
+       
+       static final String[] INTERNAL = { ROUTE_NO, DIRECTION_ID, DIRECTION, ROUTE_HEADING, ROUTE_LABEL, TRIPS };
+       static final Object[][] EXTERNAL = { { TRIP, Trip.class } };
+       
+       int m_routeNo;
+       int m_directionID;
+       String m_direction;
+       String m_routeHeading;
+       ArrayList<Trip> m_trips;
+
+       public Route() {
+               super(ROUTE, INTERNAL, EXTERNAL);
+               m_routeNo = 0;
+               m_directionID = 0;
+               m_direction = "";
+               m_routeHeading = "";
+               m_trips = new ArrayList<Trip>();
+       }
+
+       public int getRouteNo() { return m_routeNo; }
+       public int getDirectionID() { return m_directionID; }
+       public String getDirection() { return m_direction; }
+       public String getRouteHeading() { return m_routeHeading; } 
+       public int getNumTrips() { return m_trips.size(); }
+       public Trip getTrip(int idx) { return new Trip(m_trips.get(idx)); }
+
+       @Override
+       public void endContents(String uri, String localName, String qName, String chars) throws XmlParseException 
+       {
+               if (ROUTE_NO.equals(localName)) {
+                       m_routeNo = Integer.parseInt(chars);
+               }
+               else if (DIRECTION_ID.equals(localName)) {
+                       m_directionID = Integer.parseInt(chars);
+               }
+               else if (DIRECTION.equals(localName)) {
+                       m_direction = chars;
+               }
+               else if (ROUTE_HEADING.equals(localName) || ROUTE_LABEL.equals(localName)) {
+                       m_routeHeading = chars;
+               }
+       }
+       
+       @Override
+       public void endExternal(String uri, String localName, String qName) throws XmlParseException
+       {
+               if (localName.equals(TRIP)) {
+                       ParseResult[] collected = collectParsedChildren(Trip.class);
+                       for (ParseResult pr : collected) {
+                               assert(pr instanceof Trip);
+                               m_trips.add((Trip)pr);
+                       }
+               }
+       }
+}
diff --git a/prod/net/jaekl/frank/octranspo/RouteSummary.java b/prod/net/jaekl/frank/octranspo/RouteSummary.java
new file mode 100644 (file)
index 0000000..9689a77
--- /dev/null
@@ -0,0 +1,11 @@
+package net.jaekl.frank.octranspo;
+
+public class RouteSummary extends StopInfo {
+       static final String ROOT_TAG = "GetRouteSummaryForStopResult";
+       static final String[] INTERNAL = { STOP_NO, DESCRIPTION, ERROR, ROUTES };
+       static final Object[][] EXTERNAL = { { ROUTE, Route.class} };
+
+       public RouteSummary() {
+               super(ROOT_TAG, INTERNAL, EXTERNAL);
+       }
+}
diff --git a/prod/net/jaekl/frank/octranspo/Server.java b/prod/net/jaekl/frank/octranspo/Server.java
new file mode 100644 (file)
index 0000000..9c77da4
--- /dev/null
@@ -0,0 +1,87 @@
+package net.jaekl.frank.octranspo;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import net.jaekl.frank.FrankException;
+import net.jaekl.qd.QDException;
+import net.jaekl.qd.http.RequestBroker;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.message.BasicNameValuePair;
+
+public class Server
+{
+       static final String API_KEY = "apiKey";
+       static final String APP_ID = "appID";
+       static final String GATEWAY_URL = "https://api.octranspo1.com/v1.2/";
+       static final String ROUTE_NO = "routeNo";
+       static final String STOP_NO = "stopNo";
+       static final String GET_ROUTE_SUMMARY_FOR_STOP = "GetRouteSummaryForStop";
+       static final String GET_NEXT_TRIPS_FOR_STOP = "GetNextTripsForStop";
+       static final String GET_NEXT_TRIPS_FOR_STOP_ALL_ROUTES = "GetNextTripsForStopAllRoutes";
+
+       RequestBroker m_broker;
+       ArrayList<NameValuePair> m_baseParams;
+
+       // Constructor
+       // appID   The appID for our application
+       // is      InputStream from which to read the apiKey
+       public Server(String appID, InputStream is) throws IOException {
+               assert (null != appID);
+               assert (null != is);
+
+               BufferedReader br = new BufferedReader(new InputStreamReader(is));
+               String apiKey = br.readLine();
+
+               m_baseParams = new ArrayList<NameValuePair>();
+               m_baseParams.add(new BasicNameValuePair(APP_ID, appID));
+               m_baseParams.add(new BasicNameValuePair(API_KEY, apiKey));
+
+               m_broker = new RequestBroker(GATEWAY_URL, m_baseParams);
+       }
+
+       public StopInfo getRouteSummaryForStop(int stopNo) 
+                       throws FrankException
+       {
+               try {
+                       ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
+                       params.add(new BasicNameValuePair(STOP_NO, Integer.valueOf(stopNo).toString()));
+                       return (StopInfo) m_broker.submitAndParse(GET_ROUTE_SUMMARY_FOR_STOP, params, RouteSummary.class);
+               }
+               catch (QDException e) {
+                       throw new FrankException(e);
+               }
+       }
+
+       public StopInfo getNextTripsForStop(int stopNo, int routeNo) 
+                       throws FrankException
+       {
+               try {
+                       ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
+                       params.add(new BasicNameValuePair(STOP_NO, Integer.valueOf(stopNo).toString()));
+                       params.add(new BasicNameValuePair(ROUTE_NO, Integer.valueOf(routeNo).toString()));
+                       return (StopInfo) m_broker.submitAndParse(GET_NEXT_TRIPS_FOR_STOP, params, NextTrips.class);
+               }
+               catch (QDException e) {
+                       throw new FrankException(e);
+               }
+       }
+
+       public StopInfo getNextTripsForStopAllRoutes(int stopNo) 
+                       throws FrankException
+       {
+               try {
+                       ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
+                       params.add(new BasicNameValuePair(STOP_NO, Integer.valueOf(stopNo).toString()));
+                       return (StopInfo) m_broker.submitAndParse(GET_NEXT_TRIPS_FOR_STOP_ALL_ROUTES, params, RouteSummary.class);
+               }
+               catch (QDException e) {
+                       throw new FrankException(e);
+               }
+       }
+}
+
diff --git a/prod/net/jaekl/frank/octranspo/StopInfo.java b/prod/net/jaekl/frank/octranspo/StopInfo.java
new file mode 100644 (file)
index 0000000..88bc95c
--- /dev/null
@@ -0,0 +1,76 @@
+package net.jaekl.frank.octranspo;
+
+import java.util.ArrayList;
+
+import net.jaekl.qd.xml.ParseResult;
+import net.jaekl.qd.xml.XmlParseException;
+
+public class StopInfo extends ParseResult
+{
+       // potential child tag names
+       public static String STOP_NO = "StopNo";
+       public static String DESCRIPTION = "StopDescription";   // Present in RouteSummary
+       public static String STOP_LABEL = "StopLabel";                  // What NextTrips calls StopDescription
+       public static String ERROR = "Error";
+       public static String ROUTES = "Routes";
+       public static String ROUTE = "Route";
+
+       // data returned inside our element
+       int m_stopNo;
+       String m_descr;
+       String m_error;
+       ArrayList<Route> m_routes;
+
+       // Constructor
+       public StopInfo(String rootTagName, String[] internal, Object[][] external) {
+               super(rootTagName, internal, external);
+
+               m_stopNo = 0;
+               m_descr = "";
+               m_error = "";
+               m_routes = new ArrayList<Route>();
+       }
+
+       // -----------------------------
+       // Public methods to access data
+
+       public int getStopNo() { return m_stopNo; }
+       public String getDescr() { return m_descr; }
+       public String getError() { return m_error; }
+       public int getNumRoutes() { return m_routes.size(); }
+       public Route getRoute(int idx) { return m_routes.get(idx); }
+
+       // --------------------------
+       // ParseResult implementation
+
+       @Override
+       public void endContents(String uri, String localName, String qName, String chars) throws XmlParseException
+       {
+               assert (null != localName);
+
+               if (localName.equals(STOP_NO)) {
+                       m_stopNo = Integer.parseInt(chars);
+               }
+               else if (localName.equals(DESCRIPTION) || localName.equals(STOP_LABEL)) {
+                       m_descr = chars;
+               }
+               else if (localName.equals(ERROR)) {
+                       m_error = chars;
+               }
+       }
+       
+       @Override
+       public void endExternal(String uri, String localName, String qName) throws XmlParseException
+       {
+               if (localName.equals(ROUTE)) {
+                       ParseResult[] collected = collectParsedChildren(Route.class);
+                       for (ParseResult pr : collected) {
+                               assert (pr instanceof Route);
+                               m_routes.add((Route)pr);
+                       }
+               }
+       }
+       
+       
+}
+
diff --git a/prod/net/jaekl/frank/octranspo/Trip.java b/prod/net/jaekl/frank/octranspo/Trip.java
new file mode 100644 (file)
index 0000000..7dfbb5d
--- /dev/null
@@ -0,0 +1,140 @@
+package net.jaekl.frank.octranspo;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import net.jaekl.qd.util.ParseUtils;
+import net.jaekl.qd.xml.ParseResult;
+import net.jaekl.qd.xml.XmlParseException;
+
+public class Trip extends ParseResult {
+       static final String TRIP = "Trip";
+       
+       static final String TRIP_DESTINATION = "TripDestination";
+       static final String TRIP_START_TIME = "TripStartTime";
+       static final String ADJUSTED_SCHEDULE_TIME = "AdjustedScheduleTime";
+       static final String ADJUSTMENT_AGE = "AdjustmentAge";
+       static final String LAST_TRIP_OF_SCHEDULE = "LastTripOfSchedule";
+       static final String BUS_TYPE = "BusType";
+       static final String GPS_SPEED = "GPSSpeed";
+       static final String LATITUDE = "Latitude";
+       static final String LONGITUDE = "Longitude";
+       
+       static final String[] INTERNAL = { TRIP_DESTINATION,
+                                              TRIP_START_TIME,
+                                              ADJUSTED_SCHEDULE_TIME,
+                                              ADJUSTMENT_AGE,
+                                              LAST_TRIP_OF_SCHEDULE,
+                                              BUS_TYPE,
+                                              GPS_SPEED,
+                                              LATITUDE,
+                                              LONGITUDE };
+       static final Object[][] EXTERNAL = {};
+       
+    String  m_dest;      // destination
+    Date    m_start;     // time at which the trip started / is scheduled to start
+    int     m_adjTime;   // minutes until bus is predicted to arrive
+    double  m_adjAge;    // time since the last GPS data was received, in minutes (possibly fractional)
+    boolean m_lastTrip;  // is this the last scheduled trip of the day?
+    String  m_busType;   // type of bus
+    double  m_speed;     // speed (km/h) when last polled
+    double  m_long;      // longitude
+    double  m_lat;       // latitude
+    
+    DateFormat m_dateFormat;
+    Date       m_constructed;  // DateTime when this object was constructed
+
+    public Trip() {
+       super(TRIP, INTERNAL, EXTERNAL);
+       m_dest = "";
+       m_start = new Date();
+       m_adjTime = 0;
+       m_adjAge = 0.0;
+       m_lastTrip = false;
+       m_busType = "";
+       m_speed = 0.0;
+       m_long = 0.0;
+       m_lat = 0.0;
+       
+       m_dateFormat = new SimpleDateFormat("hh:mm");
+       m_constructed = new Date();
+    }
+    
+    public Trip(Trip other) {
+       super(TRIP, INTERNAL, EXTERNAL);
+       m_dest = other.m_dest;
+       m_start = other.m_start;
+       m_adjTime = other.m_adjTime;
+       m_adjAge = other.m_adjAge;
+       m_lastTrip = other.m_lastTrip;
+       m_busType = other.m_busType;
+       m_speed = other.m_speed;
+       m_long = other.m_long;
+       m_lat = other.m_lat;
+       m_constructed = other.m_constructed;
+       }
+
+       public String getDest() { return m_dest; }
+    public Date getStart() { return m_start; }
+    public int getAdjTime() { return m_adjTime; }
+    public double getAdjAge() { return m_adjAge; }
+    public boolean isLastTrip() { return m_lastTrip; }
+    public String getBusType() { return m_busType; }
+    public double getSpeed() { return m_speed; }
+    public double getLongitude() { return m_long; }
+    public double getLatitude() { return m_lat; }
+    
+    // Estimated (Date)Time of Arrival of this trip at the stop 
+    public Date getETA() { return new Date(m_constructed.getTime() + (long)(1000 * 60 * m_adjTime)); }
+    
+    // (Date)Time when the GPS for this bus was last read
+    public Date getGPSTime() { return new Date(m_constructed.getTime() - (long)(1000 * 60 * m_adjAge)); } 
+
+    // ---------------------------
+    // ParseResult implementation:
+    
+       @Override
+       public void endContents(String uri, String localName, String qName,     String chars) throws XmlParseException 
+       {
+               try {
+                       if (TRIP_DESTINATION.equals(localName)) {
+                               m_dest = chars;
+                       }
+                       else if (TRIP_START_TIME.equals(localName)) {
+                               m_start = m_dateFormat.parse(chars);
+                       }
+                       else if (ADJUSTED_SCHEDULE_TIME.equals(localName)) {
+                               m_adjTime = ParseUtils.parseInt(chars);
+                       }
+                       else if (ADJUSTMENT_AGE.equals(localName)) {
+                               m_adjAge = ParseUtils.parseDouble(chars);
+                       }
+                       else if (LAST_TRIP_OF_SCHEDULE.equals(localName)) {
+                               m_lastTrip = Boolean.parseBoolean(chars);
+                       }
+                       else if (BUS_TYPE.equals(localName)) {
+                               m_busType = chars;
+                       }
+                       else if (GPS_SPEED.equals(localName)) {
+                               m_speed = ParseUtils.parseDouble(chars);
+                       }
+                       else if (LONGITUDE.equals(localName)) {
+                               m_long = ParseUtils.parseDouble(chars);
+                       }
+                       else if (LATITUDE.equals(localName)) {
+                               m_lat = ParseUtils.parseDouble(chars);
+                       }
+               } catch (ParseException pe) {
+                       throw new XmlParseException(pe);
+               }
+       }
+       
+       @Override
+       public void endExternal(String uri, String localName, String qName) throws XmlParseException
+       {
+               // no externally-parsed children
+       }
+}
+
diff --git a/prod/net/jaekl/qd/QDBundleFactory.java b/prod/net/jaekl/qd/QDBundleFactory.java
new file mode 100644 (file)
index 0000000..e53c878
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+// Central spot from which to access ResourceBundles.
+// This made more sense with earlier versions of Java, where the specification did not 
+// guarantee that ResourceBundles would be cached.  Java 7 and later cache by default,
+// but it still seems prudent to centralize accesses to resources here so that we have 
+// control in case we want to implement our own cache, or override certain behaviours.
+// 
+// Note that we rely on the JVM's caching, to avoid unnecessary overhead.
+// See http://java2go.blogspot.ca/2010/03/dont-be-smart-never-implement-resource.html
+
+package net.jaekl.qd;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class QDBundleFactory {
+       static volatile QDBundleFactory m_inst; // singleton instance
+       
+       private QDBundleFactory() {
+               // no-op
+       }
+       
+       public static QDBundleFactory getInst() {
+               QDBundleFactory result = m_inst;
+               if (null == result) {
+                       synchronized(QDBundleFactory.class) {
+                               if (null == m_inst) {
+                                       m_inst = new QDBundleFactory();
+                               }
+                               result = m_inst;
+                       }
+               }
+               return result;
+       }
+       
+       public ResourceBundle getBundle(String baseName, Locale locale) {
+               return ResourceBundle.getBundle(baseName, locale);
+       }
+}
diff --git a/prod/net/jaekl/qd/QDException.java b/prod/net/jaekl/qd/QDException.java
new file mode 100644 (file)
index 0000000..f5478c1
--- /dev/null
@@ -0,0 +1,14 @@
+package net.jaekl.qd;
+
+public class QDException extends Exception
+{
+       private static final long serialVersionUID = 1L;
+
+       public QDException() {
+               super();
+       }
+       
+       public QDException(Throwable t) {
+               super(t);
+       }
+}
diff --git a/prod/net/jaekl/qd/http/RequestBroker.java b/prod/net/jaekl/qd/http/RequestBroker.java
new file mode 100644 (file)
index 0000000..1a4ba4c
--- /dev/null
@@ -0,0 +1,152 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+package net.jaekl.qd.http;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+
+import net.jaekl.qd.QDException;
+import net.jaekl.qd.util.ExceptionUtils;
+import net.jaekl.qd.xml.ParseHandler;
+import net.jaekl.qd.xml.ParseResult;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+public class RequestBroker
+{
+       final String UTF_8 = "UTF-8";
+       final int TIMEOUT_MSEC = 5000;  // Allow at most 5 seconds before we declare the server to be unresponsive
+       
+       String m_gatewayUrl;
+       ArrayList<NameValuePair> m_baseParams;
+
+       public RequestBroker(String gatewayUrl, ArrayList<NameValuePair> baseParams)
+       {
+               m_gatewayUrl = gatewayUrl;
+               m_baseParams = new ArrayList<NameValuePair>(baseParams);
+       }
+       
+       // NB:  Caller is responsible for close()ing the returned InputStream
+       //
+       InputStream doSubmit(String method, ArrayList<NameValuePair> passedParams) throws QDException
+       {
+               ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(m_baseParams);
+               params.addAll(passedParams);
+               
+               try {
+                       RequestConfig.Builder requestBuilder = RequestConfig.custom();
+                       requestBuilder = requestBuilder.setConnectTimeout(TIMEOUT_MSEC);
+                       requestBuilder = requestBuilder.setSocketTimeout(TIMEOUT_MSEC);
+                       HttpClientBuilder builder = HttpClientBuilder.create();
+                       builder.setDefaultRequestConfig(requestBuilder.build());
+                       HttpClient httpClient = builder.build(); 
+                       HttpPost httpPost = new HttpPost(m_gatewayUrl + "/" + method + "/");
+                       httpPost.setEntity(new UrlEncodedFormEntity(params, UTF_8));
+                       HttpResponse response = httpClient.execute(httpPost);
+                       HttpEntity entity = response.getEntity();
+
+                       if (null != entity) {
+                               InputStream is = entity.getContent();
+                               return is;
+                       }
+               }
+               catch (UnsupportedEncodingException uee) {
+                       // We should actually be guaranteed that this never happens, 
+                       // because all JVMs are required to support UTF-8
+                       assert(false);
+                       throw new Error(uee);
+               }
+               catch (IOException ioe) {
+                       throw new QDException(ioe);
+               }
+               
+               return null;
+       }
+
+       public String submit(String method, ArrayList<NameValuePair> passedParams) throws QDException
+       {
+               StringBuilder sb = new StringBuilder();
+               InputStream is = null;
+
+               try {
+                       is = doSubmit(method, passedParams);
+                       BufferedReader br = new BufferedReader(new InputStreamReader(is));
+                       String line = br.readLine();
+                       while (null != line) {
+                               sb.append(line).append("\n");
+                               line = br.readLine();
+                       }
+               }
+               catch (IOException ioe) {
+                       throw new QDException(ioe);
+               }
+               finally {
+                       ExceptionUtils.tryClose(is);
+               }
+
+               return sb.toString();
+       }
+       
+       public ParseResult submitAndParse(String method, 
+                         ArrayList<NameValuePair> passedParams, 
+                         Class<? extends ParseResult> rootParserClass)
+       throws QDException
+       {
+               return submitAndParse(method, passedParams, rootParserClass, null);
+       }
+       
+       public ParseResult submitAndParse(String method, 
+                                                                         ArrayList<NameValuePair> passedParams, 
+                                                                         Class<? extends ParseResult> rootParserClass,
+                                                                         String rootTagName)
+       throws QDException
+       {
+               ParseResult result = null;
+               InputStream is = null;
+               
+               try {
+                       if (null == rootTagName) {
+                               result = (ParseResult) rootParserClass.newInstance();
+                       } 
+                       else {
+                               result = (ParseResult) rootParserClass.getDeclaredConstructor(String.class).newInstance(rootTagName);
+                       }
+                       is = doSubmit(method, passedParams);
+                       XMLReader reader = XMLReaderFactory.createXMLReader();
+                       ParseHandler ph = new ParseHandler(result);
+                       reader.setContentHandler(ph);
+                       reader.parse(new InputSource(is));
+               } 
+               catch ( InstantiationException
+                               | InvocationTargetException
+                               | IllegalAccessException
+                               | IOException 
+                               | NoSuchMethodException
+                               | SAXException 
+                               e )
+               {
+                       throw new QDException(e);
+               } 
+               finally {
+                       ExceptionUtils.tryClose(is);
+               }
+               
+               return result;
+       }
+}
diff --git a/prod/net/jaekl/qd/util/ExceptionUtils.java b/prod/net/jaekl/qd/util/ExceptionUtils.java
new file mode 100644 (file)
index 0000000..5e74948
--- /dev/null
@@ -0,0 +1,19 @@
+package net.jaekl.qd.util;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import net.jaekl.qd.QDException;
+
+public class ExceptionUtils {
+       public static void tryClose(Closeable closeable) throws QDException {
+               try {
+                       if (null != closeable) {
+                               closeable.close();
+                       }
+               }
+               catch (IOException ioe) {
+                       throw new QDException(ioe);
+               }
+       }
+}
diff --git a/prod/net/jaekl/qd/util/ParseUtils.java b/prod/net/jaekl/qd/util/ParseUtils.java
new file mode 100644 (file)
index 0000000..ad663c0
--- /dev/null
@@ -0,0 +1,30 @@
+package net.jaekl.qd.util;
+
+public class ParseUtils {
+       // Attempt to parse the string as a double.
+       // Treat errors as a zero value.
+       public static double parseDouble(String string) {
+               if ((null == string) || ("".equals(string))) {
+                       return 0.0;
+               }
+               try {
+                       return Double.parseDouble(string);
+               }
+               catch (NumberFormatException exc) {
+                       return 0.0;
+               }
+       }
+       
+       public static int parseInt(String string) {
+               if ((null == string) || ("".equals(string))) {
+                       return 0;
+               }
+               try {
+                       return Integer.parseInt(string);
+               }
+               catch (NumberFormatException exc) {
+                       return 0;
+               }
+               
+       }
+}
diff --git a/prod/net/jaekl/qd/util/StringUtils.java b/prod/net/jaekl/qd/util/StringUtils.java
new file mode 100644 (file)
index 0000000..5d32728
--- /dev/null
@@ -0,0 +1,10 @@
+package net.jaekl.qd.util;
+
+public class StringUtils {
+       public static boolean areEqual(String a, String b) {
+               if (null == a) {
+                       return (null == b);
+               }
+               return a.equals(b);
+       }
+}
diff --git a/prod/net/jaekl/qd/xml/MismatchedTagsException.java b/prod/net/jaekl/qd/xml/MismatchedTagsException.java
new file mode 100644 (file)
index 0000000..9c8b69c
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+package net.jaekl.qd.xml;
+
+
+public class MismatchedTagsException extends XmlParseException
+{
+       private static final long serialVersionUID = 1L;
+
+       String m_expected;
+       String m_actual;
+
+       public MismatchedTagsException(String expected, String actual) {
+               super();
+               m_expected = expected;
+               m_actual = actual;
+       }
+
+       public String getExpected() { return m_expected; }
+       public String getActual() { return m_actual; }
+}
diff --git a/prod/net/jaekl/qd/xml/MissingInfoException.java b/prod/net/jaekl/qd/xml/MissingInfoException.java
new file mode 100644 (file)
index 0000000..1def37f
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+package net.jaekl.qd.xml;
+
+import java.util.ArrayList;
+
+public class MissingInfoException extends XmlParseException
+{
+       private static final long serialVersionUID = 1L;
+
+       String m_tagName;
+       ArrayList<String> m_missingAttributes;
+       ArrayList<String> m_missingChildTags;
+
+       public MissingInfoException(String tagName) {
+               super();
+               m_tagName = tagName;
+               m_missingAttributes = new ArrayList<String>();
+               m_missingChildTags = new ArrayList<String>();
+       }
+
+       public void addMissingAttribute(String name) {
+               m_missingAttributes.add(name);
+       }
+
+       public void addMissingChild(String name) {
+               m_missingChildTags.add(name);
+       }
+
+       public String getTagName() { return m_tagName; }
+       
+       @Override
+       public String getMessage() {
+               StringBuilder sb = new StringBuilder();
+               
+               sb.append("Tag:  \"" + getTagName() + "\"");
+               
+               for (String attr : m_missingAttributes) {
+                       sb.append("\n  Attribute:  \"" + attr + "\"");
+               }
+               
+               for (String child : m_missingChildTags) {
+                       sb.append("\n  Child tag:  \"" + child + "\"");
+               }
+               return sb.toString();
+       }
+}
diff --git a/prod/net/jaekl/qd/xml/ParseHandler.java b/prod/net/jaekl/qd/xml/ParseHandler.java
new file mode 100644 (file)
index 0000000..4a921ad
--- /dev/null
@@ -0,0 +1,123 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+package net.jaekl.qd.xml;
+
+import java.util.Stack;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+public class ParseHandler implements ContentHandler
+{
+       Stack<ParseResult> m_stack;
+
+       public ParseHandler(ParseResult root) {
+               m_stack = new Stack<ParseResult>();
+               m_stack.push(root);
+       }
+
+       @Override 
+       public void characters(char[] ch, int start, int length) throws SAXException
+       {
+               if (m_stack.isEmpty()) {
+                       return;
+               }
+               
+               try {
+                       m_stack.peek().characters(ch, start, length);
+               }
+               catch (XmlParseException xpe) {
+                       throw new SAXException(xpe);
+               }
+       }
+
+       @Override 
+       public void endElement(String uri, String localName, String qName) throws SAXException
+       {
+               try {
+                       if (m_stack.isEmpty()) {
+                               return;
+                       }
+                       
+                       boolean pop = m_stack.peek().endElement(uri, localName, qName);
+                       if (pop) {
+                               m_stack.pop();
+
+                               if (m_stack.isEmpty()) {
+                                       return;
+                               }
+                               
+                               m_stack.peek().endExternal(uri, localName, qName);
+                       }
+               }
+               catch (XmlParseException xpe) {
+                       throw new SAXException(xpe);
+               }
+       }
+
+       @Override
+       public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
+       {
+               try {
+                       ParseResult current = m_stack.peek();
+                       ParseResult next = current.startElement(uri, localName, qName, attributes);
+                       if (next != current) {
+                               m_stack.push(next);
+                       }
+               }
+               catch (XmlParseException xpe) {
+                       throw new SAXException(xpe);
+               }
+       }
+
+       @Override
+       public void endDocument() throws SAXException {
+               if (! m_stack.isEmpty()) {
+                       String missingTag = m_stack.peek().getTagName();
+                       throw new SAXException(new MissingInfoException(missingTag));
+               }
+       }
+
+       @Override
+       public void endPrefixMapping(String prefix) throws SAXException {
+               // no-op
+       }
+
+       @Override
+       public void ignorableWhitespace(char[] ch, int start, int length)
+       throws SAXException 
+       {
+               // no-op
+       }
+
+       @Override
+       public void processingInstruction(String target, String data)
+       throws SAXException 
+       {
+               // no-op
+       }
+
+       @Override
+       public void setDocumentLocator(Locator locator) {
+               // no-op
+       }
+
+       @Override
+       public void skippedEntity(String name) throws SAXException {
+               // no-op
+       }
+
+       @Override
+       public void startDocument() throws SAXException {
+               // no-op
+       }
+
+       @Override
+       public void startPrefixMapping(String prefix, String uri)
+       throws SAXException 
+       {
+               // no-op
+       }
+}
diff --git a/prod/net/jaekl/qd/xml/ParseResult.java b/prod/net/jaekl/qd/xml/ParseResult.java
new file mode 100644 (file)
index 0000000..2baa374
--- /dev/null
@@ -0,0 +1,166 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+// Abstract class representing the result of parsing an XML Element.
+// A class derived from this one will know how to parse a subtree inside an XML file, and 
+// will contain the result of that parse within itself when the parse has completed.
+//
+// Note that this code will need to be augmented and fixed if XML namespace support is desired.
+
+package net.jaekl.qd.xml;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Stack;
+
+import org.xml.sax.Attributes;
+
+public abstract class ParseResult
+{
+       Stack<String> m_current;                                                                        // Name of the element that we're currently inside
+       StringBuilder m_chars;                                                                          // character content of m_current.peek()
+       ArrayList<ParseResult> m_childParsers;                                          // Set of all child parsers
+       boolean m_haveSeenMyTag;                                                                        // Have I encountered my own (root) tag yet?
+
+       String m_tagName;                                                                                       // Name of the (root) element tag that I'm parsing
+       HashSet<String> m_internal;                                                                     // Tags that we will store as members of this class instance
+       HashMap<String,Class<? extends ParseResult>> m_external;        // Tags that we will store as child ParseResult-derived objects
+
+       @SuppressWarnings("unchecked")
+       public ParseResult(String tagName, String[] internalMemberTags, Object[][] externalParserTags)
+       {
+               m_current = new Stack<String>();
+               m_chars = new StringBuilder();
+               m_childParsers = new ArrayList<ParseResult>();
+               m_haveSeenMyTag = false;
+               
+               m_tagName = tagName;
+               m_internal = new HashSet<String>();
+               m_external = new HashMap<String, Class<? extends ParseResult>>();
+
+               for (String internalTag : internalMemberTags) {
+                       m_internal.add(internalTag);
+               }
+
+               for (int idx = 0; idx < externalParserTags.length; ++idx) {
+                       String externalTag = (String)externalParserTags[idx][0];
+                       Class<? extends ParseResult>  parserClass = (Class<? extends ParseResult>)externalParserTags[idx][1];
+                       m_external.put(externalTag, parserClass);
+               }
+       }
+
+       public abstract void endContents(String uri, String localName, String qName, String chars) throws XmlParseException;
+       public abstract void endExternal(String uri, String localName, String qName) throws XmlParseException;
+       
+       public String getTagName() { return m_tagName; }
+       public boolean haveSeenMyTag() { return m_haveSeenMyTag; }
+
+       public void characters(char[] ch, int start, int length) throws XmlParseException
+       {
+               m_chars.append(ch, start, length);
+       }
+       
+       protected ParseResult[] collectParsedChildren(Class<? extends ParseResult> cls) {
+               ArrayList<ParseResult> collection = new ArrayList<ParseResult>();
+               Iterator<ParseResult> iter = m_childParsers.iterator();
+               while (iter.hasNext()) {
+                       ParseResult pr = iter.next();
+                       if (pr.getClass().isAssignableFrom(cls)) {
+                               collection.add(pr);
+                               iter.remove();
+                       }
+               }
+               
+               ParseResult[] result = new ParseResult[collection.size()];
+               return collection.toArray(result);
+       }
+
+       // returns true if this ParseResult's context has ended with this endElement() call
+       public boolean endElement(String uri, String localName, String qName) throws XmlParseException
+       {
+               assert (null != localName);
+               
+               boolean isInternal = m_internal.contains(localName);
+
+               if (! m_haveSeenMyTag) {
+                       // We're in some unrecognised prologue.  Ignore it and move on.
+                       return false;
+               }
+               
+               if (m_tagName.equals(localName)) {
+                       validate();
+                       return true;
+               }
+               
+               if (!isInternal) {
+                       // Unrecognized tag.  Ignore it.
+                       return false;
+               }
+               
+               String tag = m_current.pop();
+               if ( ! tag.equals(localName) ) {
+                       throw new MismatchedTagsException(tag, localName);
+               }
+               
+               String chars = m_chars.toString();
+               endContents(uri, localName, qName, chars);
+               
+               return false;
+       }
+       
+       // returns either itself, or a new ParseResult-derived object, whichever should handle parsing the inside of this element
+       public ParseResult startElement(String uri, String localName, String qName, Attributes attributes) 
+                       throws XmlParseException
+       {
+               assert (null != localName);
+
+               m_chars.setLength(0);
+               
+               if (! m_haveSeenMyTag) {
+                       // Have we opened our own (root) tag yet?
+                       
+                       if (m_tagName.equals(localName)) {
+                               m_haveSeenMyTag = true;
+                               return this;
+                       }
+                       else {
+                               // One of two things has happened here.
+                               // Either (a) we've got some sort of wrapper here, and have not yet reach our own tag, 
+                               //     or (b) we're parsing XML that doesn't match expectations.
+                               // In either case, we're going to ignore this tag, and scan forward looking for our own root.
+                               return this;
+                       }
+               }
+
+               if (m_internal.contains(localName)) {
+                       m_current.push(localName);
+                       return this;
+               }
+
+               Class<? extends ParseResult> parserClass = m_external.get(localName);
+               if (null != parserClass) {
+                       try {
+                               ParseResult childParser = (ParseResult) parserClass.newInstance();
+                               m_childParsers.add(childParser);
+                               return childParser.startElement(uri, localName, qName, attributes);
+                       }
+                       catch (IllegalAccessException iae) {
+                               throw new XmlParseException(iae);
+                       }
+                       catch (InstantiationException ie) {
+                               throw new XmlParseException(ie);
+                       }
+               }
+               
+               // Not a recognized tag.  Ignore it, rather than complaining. 
+               return this;
+       }
+       
+       public void validate() throws XmlParseException
+       {
+               // Default implementation is a no-op.
+               // Override if you want to validate on endElement()
+       }
+}
+
diff --git a/prod/net/jaekl/qd/xml/XmlParseException.java b/prod/net/jaekl/qd/xml/XmlParseException.java
new file mode 100644 (file)
index 0000000..ada3fe5
--- /dev/null
@@ -0,0 +1,17 @@
+package net.jaekl.qd.xml;
+
+import net.jaekl.qd.QDException;
+
+public class XmlParseException extends QDException 
+{
+       private static final long serialVersionUID = 1L;
+
+       public XmlParseException() {
+               // no-op
+       }
+       
+       public XmlParseException(Throwable t) {
+               super(t);
+       }
+
+}
diff --git a/report/allclasses-frame.html b/report/allclasses-frame.html
new file mode 100644 (file)
index 0000000..8f1c1f6
--- /dev/null
@@ -0,0 +1,36 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="style.css" title="Style">
+</head>
+<body>
+<span class="title">All classes</span>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="net/jaekl/qd/util/ExceptionUtils.html" target="classFrame">ExceptionUtils</a><span class="text_italic">&nbsp;  50% (1/2)</span><br>
+<a href="net/jaekl/frank/FrankBundle.html" target="classFrame">FrankBundle</a><span class="text_italic">&nbsp; 100% (4/4)</span><br>
+<a href="net/jaekl/frank/FrankException.html" target="classFrame">FrankException</a><span class="text_italic">&nbsp;   0% (0/1)</span><br>
+<a href="net/jaekl/qd/xml/MismatchedTagsException.html" target="classFrame">MismatchedTagsException</a><span class="text_italic">&nbsp;   0% (0/3)</span><br>
+<a href="net/jaekl/qd/xml/MissingInfoException.html" target="classFrame">MissingInfoException</a><span class="text_italic">&nbsp; 100% (5/5)</span><br>
+<a href="net/jaekl/frank/octranspo/NextTrips.html" target="classFrame">NextTrips</a><span class="text_italic">&nbsp; 100% (2/2)</span><br>
+<a href="net/jaekl/qd/xml/ParseHandler.html" target="classFrame">ParseHandler</a><span class="text_italic">&nbsp;  75% (9/12)</span><br>
+<a href="net/jaekl/qd/xml/ParseResult.html" target="classFrame">ParseResult</a><span class="text_italic">&nbsp;  89% (8/9)</span><br>
+<a href="net/jaekl/qd/util/ParseUtils.html" target="classFrame">ParseUtils</a><span class="text_italic">&nbsp;  67% (2/3)</span><br>
+<a href="net/jaekl/qd/QDBundleFactory.html" target="classFrame">QDBundleFactory</a><span class="text_italic">&nbsp; 100% (3/3)</span><br>
+<a href="net/jaekl/qd/QDException.html" target="classFrame">QDException</a><span class="text_italic">&nbsp; 100% (2/2)</span><br>
+<a href="net/jaekl/qd/http/RequestBroker.html" target="classFrame">RequestBroker</a><span class="text_italic">&nbsp;  83% (5/6)</span><br>
+<a href="net/jaekl/frank/octranspo/Route.html" target="classFrame">Route</a><span class="text_italic">&nbsp; 100% (10/10)</span><br>
+<a href="net/jaekl/frank/octranspo/RouteSummary.html" target="classFrame">RouteSummary</a><span class="text_italic">&nbsp; 100% (2/2)</span><br>
+<a href="net/jaekl/frank/Schedule.html" target="classFrame">Schedule</a><span class="text_italic">&nbsp; 100% (7/7)</span><br>
+<a href="net/jaekl/frank/octranspo/Server.html" target="classFrame">Server</a><span class="text_italic">&nbsp; 100% (5/5)</span><br>
+<a href="net/jaekl/frank/octranspo/StopInfo.html" target="classFrame">StopInfo</a><span class="text_italic">&nbsp; 100% (9/9)</span><br>
+<a href="net/jaekl/qd/util/StringUtils.html" target="classFrame">StringUtils</a><span class="text_italic">&nbsp;  50% (1/2)</span><br>
+<a href="net/jaekl/frank/octranspo/Trip.html" target="classFrame">Trip</a><span class="text_italic">&nbsp;  94% (15/16)</span><br>
+<a href="net/jaekl/frank/ViewSchedule.html" target="classFrame">ViewSchedule</a><span class="text_italic">&nbsp;  67% (4/6)</span><br>
+<a href="net/jaekl/qd/xml/XmlParseException.html" target="classFrame">XmlParseException</a><span class="text_italic">&nbsp;  50% (1/2)</span><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/index.html b/report/index.html
new file mode 100644 (file)
index 0000000..30f922f
--- /dev/null
@@ -0,0 +1,62 @@
+<html>
+<head>
+<title>Coverage report </title>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<FRAMESET cols="20%,80%" title="Documentation frame" onclick="top.loadFrames()">
+<FRAMESET rows="30%,70%" title="Left frames" onload="top.loadFrames()">
+<FRAME src="overview-frame.html" name="packageListFrame" title="All Packages">
+<FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)">
+</FRAMESET>
+<FRAME src="overview-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes">
+<NOFRAMES>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<BR>
+Link to<A HREF="overview-summary.html">Non-frame version.</A>
+</NOFRAMES>
+</FRAMESET>
+</html>
diff --git a/report/net/jaekl/frank/FrankBundle.html b/report/net/jaekl/frank/FrankBundle.html
new file mode 100644 (file)
index 0000000..d44f652
--- /dev/null
@@ -0,0 +1,423 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../index.html?net/jaekl/frank/FrankBundle.html" target="_top">Frames</a>
+<a href="FrankBundle.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.FrankBundle</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(4/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>69</b>%(9/13)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  69"></td><td class="percentUnCovered" width="31.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>67</b>%(4/6)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  67"></td><td class="percentUnCovered" width="33.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>79</b>%(15/19)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  79"></td><td class="percentUnCovered" width="21.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_26">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_44">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[private]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.util.Locale)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">34</span></td>
+ <td class="reportText"><span class="text"><a href="#src_50">get</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String get(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">11</span></td>
+ <td class="reportText"><span class="text"><a href="#src_31">getInst</a></span></td>
+ <td class="reportText"><span class="text">[public, static]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.frank.FrankBundle getInst(java.util.Locale)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Locale;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.MissingResourceException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ResourceBundle;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.concurrent.ConcurrentHashMap;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.QDBundleFactory;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> FrankBundle {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String DATA_COLLECTED = <span Class="string">"data.collected"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String DESTINATION = <span Class="string">"destination"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String ERROR_PAGE = <span Class="string">"error.page"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String ETA = <span Class="string">"eta"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String FRANK = <span Class="string">"frank"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String GPS_OFF = <span Class="string">"gps.off"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String GPS_READ = <span Class="string">"gps.read"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String MINUTES = <span Class="string">"m"</span>;    <span Class="comment">// suffix (abbreviated) for minutes</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String REMAIN = <span Class="string">"remain"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String ROUTE = <span Class="string">"route"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String SECONDS = <span Class="string">"s"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">final</span> String UNEXPECTED_ERROR = <span Class="string">"unexpected.error"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">final</span> <span Class="keyword">static</span> String BUNDLE_NAME = <span Class="string">"frank"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;26<a name="src_26"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> ConcurrentHashMap&#60;Locale, FrankBundle&#62; m_bundleMap = <span Class="keyword">new</span> ConcurrentHashMap&#60;Locale, FrankBundle&#62;();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ResourceBundle m_bundle;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> FrankBundle getInst(Locale locale) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;31<a name="src_31"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               FrankBundle result = m_bundleMap.get(locale);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (<span Class="keyword">null</span> == result) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;33</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">synchronized</span>(FrankBundle.<span Class="keyword">class</span>) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               result = m_bundleMap.get(locale);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">if</span> (<span Class="keyword">null</span> == result) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;36</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       result = <span Class="keyword">new</span> FrankBundle(locale); </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_bundleMap.put(locale, result);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;41</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> result;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;44<a name="src_44"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> FrankBundle(Locale locale) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_bundle = QDBundleFactory.getInst().getBundle(BUNDLE_NAME, locale); </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String get(String key) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;49</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;50<a name="src_50"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (<span Class="keyword">null</span> != m_bundle) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;51</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">return</span> m_bundle.getString(key);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;54</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (MissingResourceException e) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;55</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// Make it clear that something has gone wrong.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;56</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       e.printStackTrace();    </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;57</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// Fall through to the fallback behaviour below</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;58</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;59</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> <span Class="string">"["</span> + key + <span Class="string">"]"</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/FrankException.html b/report/net/jaekl/frank/FrankException.html
new file mode 100644 (file)
index 0000000..6bf8d52
--- /dev/null
@@ -0,0 +1,155 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../index.html?net/jaekl/frank/FrankException.html" target="_top">Frames</a>
+<a href="FrankException.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.FrankException</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>0</b>%(0/1)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="   0"></td><td class="percentUnCovered" width="100.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>0</b>%(0/1)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="   0"></td><td class="percentUnCovered" width="100.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>-</b>%</span></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>0</b>%(0/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="   0"></td><td class="percentUnCovered" width="100.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_9">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.Throwable)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.lang.Exception;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> FrankException <span Class="keyword">extends</span> Exception {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> <span Class="keyword">static</span> <span Class="keyword">final</span> <span Class="keyword">long</span> serialVersionUID = 1L;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> FrankException(Throwable cause) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;9<a name="src_9"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>(cause);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/Schedule.html b/report/net/jaekl/frank/Schedule.html
new file mode 100644 (file)
index 0000000..3e971d1
--- /dev/null
@@ -0,0 +1,876 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../index.html?net/jaekl/frank/Schedule.html" target="_top">Frames</a>
+<a href="Schedule.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.Schedule</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(7/7)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>88</b>%(21/24)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  88"></td><td class="percentUnCovered" width="12.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>75</b>%(9/12)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  75"></td><td class="percentUnCovered" width="25.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>98</b>%(79/81)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  98"></td><td class="percentUnCovered" width="2.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_20">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.util.Locale)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">6</span></td>
+ <td class="reportText"><span class="text"><a href="#src_32">mapUrl</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">java.lang.String mapUrl(double,double)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">22</span></td>
+ <td class="reportText"><span class="text"><a href="#src_28">trans</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">java.lang.String trans(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">11</span></td>
+ <td class="reportText"><span class="text"><a href="#src_73">writeHeader</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">void writeHeader(java.io.PrintWriter,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">2</span></td>
+ <td class="reportText"><span class="text"><a href="#src_82">writePage</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">void writePage(java.io.PrintWriter,net.jaekl.frank.octranspo.StopInfo)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">2</span></td>
+ <td class="reportText"><span class="text"><a href="#src_47">writeScript</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">void writeScript(java.io.PrintWriter,java.lang.String,int)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">14</span></td>
+ <td class="reportText"><span class="text"><a href="#src_36">writeStyle</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">void writeStyle(java.io.PrintWriter)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.PrintWriter;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.text.DateFormat;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.text.MessageFormat;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.text.SimpleDateFormat;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Date;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Locale;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.frank.octranspo.Route;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.frank.octranspo.StopInfo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.frank.octranspo.Trip;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> Schedule {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       Locale m_locale;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       FrankBundle m_bundle;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       DateFormat m_hourMinFmt;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       DateFormat m_hourMinSecFmt;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;20<a name="src_20"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> Schedule(Locale locale) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_locale = locale;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_bundle = FrankBundle.getInst(locale);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_hourMinFmt = <span Class="keyword">new</span> SimpleDateFormat(<span Class="string">"hh:mma"</span>, locale);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_hourMinSecFmt = <span Class="keyword">new</span> SimpleDateFormat(<span Class="string">"hh:mm:ssa"</span>, locale);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String trans(String key) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;28<a name="src_28"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> m_bundle.get(key);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String mapUrl(<span Class="keyword">double</span> latitude, <span Class="keyword">double</span> longitude) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;32<a name="src_32"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> <span Class="string">"http://www.openstreetmap.org/?mlat="</span> + latitude + <span Class="string">"&#38;mlon="</span> + longitude + <span Class="string">"&#38;zoom=15"</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">void</span> writeStyle(PrintWriter pw) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;36<a name="src_36"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;STYLE&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  body {background-color: #F0F0C0; font-size: 1.5em; }"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  #trips {border-collapse: collapse; font-size: 1.5em; }"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  #trips td, #trips th {border: 1px solid #600000; padding: 3px 3px 3px 3px; text-align: center;}"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  #trips th {background-color: #800000; color: #FFFFFF; }"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;41</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  #trips tr.ghost td {background-color: #C0C0C0;}"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;/STYLE&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// Countdown timer that updates time remaining until each bus is expected.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">void</span> writeScript(PrintWriter pw, String remainArray, <span Class="keyword">int</span> remainCount) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;47<a name="src_47"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String min = trans(FrankBundle.MINUTES);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String sec = trans(FrankBundle.SECONDS);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;49</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;50</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;SCRIPT&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;51</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"var start; var interval; var remain;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"window.onload = function() { start = new Date(); interval = setInterval(&#92;&#34Tick()&#92;&#34, 1000); remain = "</span> + remainArray + <span Class="string">"; }"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"function Tick() { "</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;54</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"  var now = new Date(); var delta = Math.floor((now.getTime() - start.getTime()) / 1000); "</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;55</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"  var secs = delta % 60; var mins = Math.floor(delta / 60);"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;56</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"  document.getElementById(&#92;&#34elapsed&#92;&#34).innerHTML = mins + &#92;&#34"</span> + min + <span Class="string">" &#92;&#34 + secs + &#92;&#34"</span> + sec + <span Class="string">"&#92;&#34;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;57</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"  for (var i = 0; i &#60; "</span> + remainCount + <span Class="string">"; ++i) {"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;58</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"    var id = &#92;&#34in_&#92;&#34 + i;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"    var element = document.getElementById(id);"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"    var remain_delta = (remain[i] * 60) + 30 - delta;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"    if (remain_delta &#60;= 0) {"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"      element.innerHTML = &#92;&#34----&#92;&#34;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"    } else {"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;64</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"      element.innerHTML = (Math.floor(remain_delta / 60)) + &#92;&#34"</span> + trans(min) + <span Class="string">"&#92;&#34;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;65</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"    }"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;66</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"  }"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;67</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"}"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;68</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;           pw.println(<span Class="string">"&#60;/SCRIPT&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;69</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;70</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;72</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">void</span> writeHeader(PrintWriter pw, String title) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;73<a name="src_73"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;HTML&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;HEAD&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;75</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;TITLE&#62;"</span> + title + <span Class="string">"&#60;/TITLE&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               writeStyle(pw);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;77</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;/HEAD&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;78</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;79</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;80</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">void</span> writePage(PrintWriter pw, StopInfo stopInfo)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;81</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;82<a name="src_82"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               StringBuilder remainArray = <span Class="keyword">new</span> StringBuilder(<span Class="string">"[ "</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;83</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">int</span>           remainCount = 0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;84</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;85</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String title = stopInfo.getDescr() + <span Class="string">" ("</span> + stopInfo.getStopNo() + <span Class="string">")"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;86</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String min = trans(FrankBundle.MINUTES);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;87</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;88</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               writeHeader(pw, trans(FrankBundle.FRANK) + <span Class="string">": "</span> + title);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;89</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;90</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;BODY&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;91</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  &#60;TABLE ID=&#92;&#34trips&#92;&#34&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;92</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"    &#60;TR&#62;&#60;TH COLSPAN=&#92;&#345&#92;&#34&#62;"</span> + title + <span Class="string">"&#60;/TH&#62;&#60;/TR&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;93</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"    &#60;TR&#62;&#60;TH&#62;"</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;94</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       trans(FrankBundle.ROUTE) + </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;95</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="string">"&#60;/TH&#62;&#60;TH&#62;"</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;96</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               trans(FrankBundle.DESTINATION) +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;97</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="string">"&#60;/TH&#62;&#60;TH&#62;"</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;98</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               trans(FrankBundle.ETA) +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;99</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="string">"&#60;/TH&#62;&#60;TH&#62;"</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;100</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               trans(FrankBundle.REMAIN) +  </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;101</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="string">"&#60;/TH&#62;&#60;TH&#62;"</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;102</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               trans(FrankBundle.GPS_READ) +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;103</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="string">"&#60;/TH&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;104</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;105</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">for</span> (<span Class="keyword">int</span> routeIdx = 0; routeIdx &#60; stopInfo.getNumRoutes(); ++routeIdx) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;106</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       Route route = stopInfo.getRoute(routeIdx);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;107</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">for</span> (<span Class="keyword">int</span> tripIdx = 0; tripIdx &#60; route.getNumTrips(); ++tripIdx) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;108</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               Trip trip = route.getTrip(tripIdx);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;109</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">boolean</span> isGhost = ((-1) == trip.getAdjAge());</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;110</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">if</span> (isGhost) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;111</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       <span Class="comment">// GPS is off.  This bus may not exist.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;112</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       pw.println(<span Class="string">"    &#60;TR CLASS=&#92;&#34ghost&#92;&#34&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;113</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               } <span Class="keyword">else</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;114</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       pw.println(<span Class="string">"    &#60;TR&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;115</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;116</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               pw.println(<span Class="string">"      &#60;TD&#62;"</span> + route.getRouteNo() + <span Class="string">"&#60;/TD&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;117</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               pw.println(<span Class="string">"      &#60;TD&#62;"</span> + trip.getDest() + <span Class="string">"&#60;/TD&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;118</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               pw.println(<span Class="string">"      &#60;TD&#62;"</span> + m_hourMinFmt.format(trip.getETA()) + <span Class="string">"&#60;/TD&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;119</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;120</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               pw.println(<span Class="string">"      &#60;TD&#62;&#60;SPAN ID=&#92;&#34in_"</span> + remainCount + <span Class="string">"&#92;&#34&#62;"</span>+ trip.getAdjTime()+min+<span Class="string">"&#60;/SPAN&#62;&#60;/TD&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;121</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">if</span> (remainCount &#62; 0) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;122</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       remainArray.append(<span Class="string">", "</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;123</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;124</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               remainArray.append(trip.getAdjTime());</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;125</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               remainCount++;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;126</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;127</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">if</span> (trip.getAdjAge() &#60; 0) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;128</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       pw.println(<span Class="string">"      &#60;TD&#62;"</span> + trans(FrankBundle.GPS_OFF) + <span Class="string">"&#60;/TD&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;129</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;130</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">else</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;131</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       pw.println(<span Class="string">"      &#60;TD&#62;&#60;A HREF=&#92;&#34"</span> + mapUrl(trip.getLatitude(), trip.getLongitude()) + </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;132</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                                          <span Class="string">"&#92;&#34&#62;"</span> + m_hourMinSecFmt.format(trip.getGPSTime()) + <span Class="string">"&#60;/A&#62;&#60;/TD&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;133</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;134</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               pw.println(<span Class="string">"    &#60;/TR&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;135</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;136</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;137</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;138</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  &#60;/TABLE&#62;"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;139</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;140</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String dataCollectedFormat = trans(FrankBundle.DATA_COLLECTED);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;141</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String dataCollected = MessageFormat.format(dataCollectedFormat, m_hourMinSecFmt.format(<span Class="keyword">new</span> Date()));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;142</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"  &#60;P&#62;"</span> + dataCollected + <span Class="string">"&#60;/P&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;143</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;144</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               remainArray.append(<span Class="string">" ]"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;145</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               writeScript(pw, remainArray.toString(), remainCount);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;146</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;/BODY&#62;&#60;/HTML&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;147</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;148</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/ViewSchedule.html b/report/net/jaekl/frank/ViewSchedule.html
new file mode 100644 (file)
index 0000000..66255f7
--- /dev/null
@@ -0,0 +1,755 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../index.html?net/jaekl/frank/ViewSchedule.html" target="_top">Frames</a>
+<a href="ViewSchedule.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.ViewSchedule</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>67</b>%(4/6)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  67"></td><td class="percentUnCovered" width="33.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>38</b>%(8/21)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  38"></td><td class="percentUnCovered" width="62.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>30</b>%(3/10)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  30"></td><td class="percentUnCovered" width="70.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>43</b>%(20/46)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  43"></td><td class="percentUnCovered" width="57.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_19">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_63">doGet</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void doGet(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_48">getLocale</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">java.util.Locale getLocale(javax.servlet.http.HttpServletRequest)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_28">getParamInt</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">int getParamInt(javax.servlet.http.HttpServletRequest,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_39">getParamString</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getParamString(javax.servlet.http.HttpServletRequest,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_96">writeErrorPage</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">void writeErrorPage(java.io.PrintWriter,java.lang.Throwable,java.util.Locale)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.ByteArrayOutputStream;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.FileInputStream;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.IOException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.PrintStream;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.PrintWriter;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Locale;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> javax.servlet.ServletException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> javax.servlet.http.HttpServlet;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> javax.servlet.http.HttpServletRequest;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> javax.servlet.http.HttpServletResponse;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.frank.octranspo.Server;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.frank.octranspo.StopInfo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.util.ExceptionUtils;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;19<a name="src_19"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> ViewSchedule <span Class="keyword">extends</span> HttpServlet {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> <span Class="keyword">static</span> <span Class="keyword">final</span> <span Class="keyword">long</span> serialVersionUID = 1L;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String BUNDLE_NAME = <span Class="string">"frank"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String STOP = <span Class="string">"stop"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROUTE = <span Class="string">"route"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String LANG = <span Class="string">"lang"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">int</span> getParamInt(HttpServletRequest req, String paramName) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;28<a name="src_28"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String valueStr = getParamString(req, paramName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> Integer.parseInt(valueStr);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;32</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (NumberFormatException exc) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// TODO:  Error page</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> 0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String getParamString(HttpServletRequest req, String paramName) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;39<a name="src_39"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String valueStr = req.getParameter(paramName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (<span Class="keyword">null</span> == valueStr|| valueStr.equals(<span Class="string">""</span>)) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;41</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// TODO:  Error page</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;42</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> <span Class="keyword">null</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;44</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> valueStr;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       Locale getLocale(HttpServletRequest req) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;48<a name="src_48"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               Locale result = <span Class="keyword">null</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;49</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String lang = getParamString(req, LANG);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;50</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (<span Class="keyword">null</span> != lang) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;51</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       result = <span Class="keyword">new</span> Locale(lang);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;53</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (<span Class="keyword">null</span> == result) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;54</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       result = Locale.getDefault();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;55</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;56</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> result;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;57</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;58</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> doGet(HttpServletRequest req, HttpServletResponse res)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">throws</span> ServletException, IOException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;63<a name="src_63"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               res.setContentType(<span Class="string">"text/html"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;64</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               PrintWriter pw = res.getWriter();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;65</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;66</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               Locale locale = getLocale(req);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;67</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">int</span> stop = getParamInt(req, STOP);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;68</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">int</span> route = getParamInt(req, ROUTE);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;69</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;70</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       FileInputStream fis = <span Class="keyword">new</span> FileInputStream(<span Class="string">"apikey.txt"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;72</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;73</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               Server server = <span Class="keyword">new</span> Server(<span Class="string">"192f31d2"</span>, fis);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               StopInfo stopInfo = <span Class="keyword">null</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;75</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">if</span> (0 == route) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;77</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       stopInfo = server.getNextTripsForStopAllRoutes(stop);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;78</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;79</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">else</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;80</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       stopInfo = server.getNextTripsForStop(stop, route);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;81</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;82</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               Schedule schedule = <span Class="keyword">new</span> Schedule(locale);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;83</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;84</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               schedule.writePage(pw, stopInfo);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;85</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;86</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">finally</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;87</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               ExceptionUtils.tryClose(fis);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;88</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;89</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;90</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (Throwable t) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;91</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       writeErrorPage(pw, t, locale);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;92</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;93</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;94</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;95</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">void</span> writeErrorPage(PrintWriter pw, Throwable t, Locale locale) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;96<a name="src_96"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               ByteArrayOutputStream baos = <span Class="keyword">new</span> ByteArrayOutputStream();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;97</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               PrintStream ps = <span Class="keyword">new</span> PrintStream(baos);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;98</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               FrankBundle bundle = FrankBundle.getInst(locale);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;99</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;100</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;HTML&#62;&#60;HEAD&#62;&#60;TITLE&#62;"</span> + </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;101</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               bundle.get(FrankBundle.FRANK) + <span Class="string">": "</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;102</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               bundle.get(FrankBundle.ERROR_PAGE) + </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;103</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="string">"&#60;/TITLE&#62;&#60;/HEAD&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;104</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;BODY&#62;&#60;H1&#62;"</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;105</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               bundle.get(FrankBundle.FRANK) + <span Class="string">": "</span> +</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;106</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               bundle.get(FrankBundle.UNEXPECTED_ERROR) + </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;107</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="string">"&#60;/H1&#62;&#60;P&#62;&#60;PRE&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;108</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;109</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// Note that, if we cared about security, we would log this stack trace to a</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;110</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// server log, and only report a cross-reference to the log file back to the </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;111</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// end user's browser, to avoid potentially exposing internal info that we </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;112</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// don't want to share.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;113</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// At least at this point, we don't care (that much), and trade off a </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;114</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// potential information leak in favour of reducing our code complexity</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;115</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// and the administrator's workload.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;116</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               t.printStackTrace(ps);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;117</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String stackTrace = baos.toString(); </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;118</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(stackTrace);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;119</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;120</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;/PRE&#62;&#60;/P&#62;&#60;/BODY&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;121</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               pw.println(<span Class="string">"&#60;/HTML&#62;"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;122</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;123</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;124</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;125</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/NextTrips.html b/report/net/jaekl/frank/octranspo/NextTrips.html
new file mode 100644 (file)
index 0000000..555730c
--- /dev/null
@@ -0,0 +1,161 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/frank/octranspo/NextTrips.html" target="_top">Frames</a>
+<a href="NextTrips.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.NextTrips</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(2/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(2/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>-</b>%</span></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(4/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_5">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_9">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank.octranspo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> NextTrips <span Class="keyword">extends</span> StopInfo {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROOT_TAG = <span Class="string">"GetNextTripsForStopResult"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;5<a name="src_5"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String[] INTERNAL = { STOP_NO, STOP_LABEL, ERROR, ROUTES };</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> Object[][] EXTERNAL = { { ROUTE, Route.<span Class="keyword">class</span>} };</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> NextTrips() {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;9<a name="src_9"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>(ROOT_TAG, INTERNAL, EXTERNAL);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/Route.html b/report/net/jaekl/frank/octranspo/Route.html
new file mode 100644 (file)
index 0000000..3957995
--- /dev/null
@@ -0,0 +1,514 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/frank/octranspo/Route.html" target="_top">Frames</a>
+<a href="Route.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.Route</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(10/10)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>90</b>%(26/29)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  90"></td><td class="percentUnCovered" width="10.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>75</b>%(15/20)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  75"></td><td class="percentUnCovered" width="25.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(31/31)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_7">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">7</span></td>
+ <td class="reportText"><span class="text"><a href="#src_29">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">22</span></td>
+ <td class="reportText"><span class="text"><a href="#src_47">endContents</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endContents(java.lang.String,java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">9</span></td>
+ <td class="reportText"><span class="text"><a href="#src_64">endExternal</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endExternal(java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_39">getDirection</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getDirection()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">2</span></td>
+ <td class="reportText"><span class="text"><a href="#src_38">getDirectionID</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">int getDirectionID()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_41">getNumTrips</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">int getNumTrips()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_40">getRouteHeading</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getRouteHeading()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_37">getRouteNo</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">int getRouteNo()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_42">getTrip</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.Trip getTrip(int)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank.octranspo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ArrayList;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.ParseResult;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.XmlParseException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;7<a name="src_7"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> Route <span Class="keyword">extends</span> ParseResult {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROUTE = <span Class="string">"Route"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROUTE_NO = <span Class="string">"RouteNo"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String DIRECTION_ID = <span Class="string">"DirectionID"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String DIRECTION = <span Class="string">"Direction"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROUTE_HEADING = <span Class="string">"RouteHeading"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROUTE_LABEL = <span Class="string">"RouteLabel"</span>;   <span Class="comment">// What GetNextTripsForStop calls &#60;RouteHeading&#62;  </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String TRIPS = <span Class="string">"Trips"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String TRIP = <span Class="string">"Trip"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;19</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String[] INTERNAL = { ROUTE_NO, DIRECTION_ID, DIRECTION, ROUTE_HEADING, ROUTE_LABEL, TRIPS };</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> Object[][] EXTERNAL = { { TRIP, Trip.<span Class="keyword">class</span> } };</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">int</span> m_routeNo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">int</span> m_directionID;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_direction;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_routeHeading;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ArrayList&#60;Trip&#62; m_trips;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> Route() {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;29<a name="src_29"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>(ROUTE, INTERNAL, EXTERNAL);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_routeNo = 0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_directionID = 0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_direction = <span Class="string">""</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_routeHeading = <span Class="string">""</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_trips = <span Class="keyword">new</span> ArrayList&#60;Trip&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;37<a name="src_37"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">int</span> getRouteNo() { <span Class="keyword">return</span> m_routeNo; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38<a name="src_38"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">int</span> getDirectionID() { <span Class="keyword">return</span> m_directionID; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;39<a name="src_39"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getDirection() { <span Class="keyword">return</span> m_direction; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40<a name="src_40"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getRouteHeading() { <span Class="keyword">return</span> m_routeHeading; } </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;41<a name="src_41"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">int</span> getNumTrips() { <span Class="keyword">return</span> m_trips.size(); }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;42<a name="src_42"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> Trip getTrip(<span Class="keyword">int</span> idx) { <span Class="keyword">return</span> <span Class="keyword">new</span> Trip(m_trips.get(idx)); }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endContents(String uri, String localName, String qName, String chars) <span Class="keyword">throws</span> XmlParseException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;47<a name="src_47"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (ROUTE_NO.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;48</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_routeNo = Integer.parseInt(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;49</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;50</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">else</span> <span Class="keyword">if</span> (DIRECTION_ID.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;51</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_directionID = Integer.parseInt(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;53</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">else</span> <span Class="keyword">if</span> (DIRECTION.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;54</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_direction = chars;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;55</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;56</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">else</span> <span Class="keyword">if</span> (ROUTE_HEADING.equals(localName) || ROUTE_LABEL.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;57</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;2/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_routeHeading = chars;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;58</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;59</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endExternal(String uri, String localName, String qName) <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;64<a name="src_64"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (localName.equals(TRIP)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;65</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ParseResult[] collected = collectParsedChildren(Trip.<span Class="keyword">class</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;66</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">for</span> (ParseResult pr : collected) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;67</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">assert</span>(pr <span Class="keyword">instanceof</span> Trip);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;68</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_trips.add((Trip)pr);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;69</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;70</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;71</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;72</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/RouteSummary.html b/report/net/jaekl/frank/octranspo/RouteSummary.html
new file mode 100644 (file)
index 0000000..dfb84a0
--- /dev/null
@@ -0,0 +1,161 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/frank/octranspo/RouteSummary.html" target="_top">Frames</a>
+<a href="RouteSummary.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.RouteSummary</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(2/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(2/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>-</b>%</span></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(4/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_5">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_9">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank.octranspo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> RouteSummary <span Class="keyword">extends</span> StopInfo {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROOT_TAG = <span Class="string">"GetRouteSummaryForStopResult"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;5<a name="src_5"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String[] INTERNAL = { STOP_NO, DESCRIPTION, ERROR, ROUTES };</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> Object[][] EXTERNAL = { { ROUTE, Route.<span Class="keyword">class</span>} };</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> RouteSummary() {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;9<a name="src_9"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>(ROOT_TAG, INTERNAL, EXTERNAL);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/Server.html b/report/net/jaekl/frank/octranspo/Server.html
new file mode 100644 (file)
index 0000000..439a6eb
--- /dev/null
@@ -0,0 +1,559 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/frank/octranspo/Server.html" target="_top">Frames</a>
+<a href="Server.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.Server</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(5/5)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>53</b>%(9/17)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  53"></td><td class="percentUnCovered" width="47.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>30</b>%(3/10)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  30"></td><td class="percentUnCovered" width="70.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>78</b>%(21/27)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  78"></td><td class="percentUnCovered" width="22.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_16">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_33">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.String,java.io.InputStream)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_64">getNextTripsForStop</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.StopInfo getNextTripsForStop(int,int)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_78">getNextTripsForStopAllRoutes</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.StopInfo getNextTripsForStopAllRoutes(int)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_51">getRouteSummaryForStop</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.StopInfo getRouteSummaryForStop(int)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank.octranspo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.BufferedReader;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.InputStream;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.InputStreamReader;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.IOException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ArrayList;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.frank.FrankException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.QDException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.http.RequestBroker;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.NameValuePair;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.message.BasicNameValuePair;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;16<a name="src_16"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> Server</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String API_KEY = <span Class="string">"apiKey"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String APP_ID = <span Class="string">"appID"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String GATEWAY_URL = <span Class="string">"https://api.octranspo1.com/v1.2/"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ROUTE_NO = <span Class="string">"routeNo"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String STOP_NO = <span Class="string">"stopNo"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String GET_ROUTE_SUMMARY_FOR_STOP = <span Class="string">"GetRouteSummaryForStop"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String GET_NEXT_TRIPS_FOR_STOP = <span Class="string">"GetNextTripsForStop"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String GET_NEXT_TRIPS_FOR_STOP_ALL_ROUTES = <span Class="string">"GetNextTripsForStopAllRoutes"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       RequestBroker m_broker;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ArrayList&#60;NameValuePair&#62; m_baseParams;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// Constructor</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// appID   The appID for our application</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// is      InputStream from which to read the apiKey</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;33<a name="src_33"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> Server(String appID, InputStream is) <span Class="keyword">throws</span> IOException {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">assert</span> (<span Class="keyword">null</span> != appID);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;35</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">assert</span> (<span Class="keyword">null</span> != is);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;37</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               BufferedReader br = <span Class="keyword">new</span> BufferedReader(<span Class="keyword">new</span> InputStreamReader(is));</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String apiKey = br.readLine();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_baseParams = <span Class="keyword">new</span> ArrayList&#60;NameValuePair&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;41</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_baseParams.add(<span Class="keyword">new</span> BasicNameValuePair(APP_ID, appID));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_baseParams.add(<span Class="keyword">new</span> BasicNameValuePair(API_KEY, apiKey));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_broker = <span Class="keyword">new</span> RequestBroker(GATEWAY_URL, m_baseParams);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> StopInfo getRouteSummaryForStop(<span Class="keyword">int</span> stopNo) </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throws</span> FrankException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;49</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;50</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;51<a name="src_51"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ArrayList&#60;NameValuePair&#62; params = <span Class="keyword">new</span> ArrayList&#60;NameValuePair&#62;();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       params.add(<span Class="keyword">new</span> BasicNameValuePair(STOP_NO, Integer.valueOf(stopNo).toString()));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> (StopInfo) m_broker.submitAndParse(GET_ROUTE_SUMMARY_FOR_STOP, params, RouteSummary.<span Class="keyword">class</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;54</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;55</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (QDException e) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;56</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> FrankException(e);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;57</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;58</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> StopInfo getNextTripsForStop(<span Class="keyword">int</span> stopNo, <span Class="keyword">int</span> routeNo) </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throws</span> FrankException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;64<a name="src_64"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ArrayList&#60;NameValuePair&#62; params = <span Class="keyword">new</span> ArrayList&#60;NameValuePair&#62;();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;65</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       params.add(<span Class="keyword">new</span> BasicNameValuePair(STOP_NO, Integer.valueOf(stopNo).toString()));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;66</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       params.add(<span Class="keyword">new</span> BasicNameValuePair(ROUTE_NO, Integer.valueOf(routeNo).toString()));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;67</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> (StopInfo) m_broker.submitAndParse(GET_NEXT_TRIPS_FOR_STOP, params, NextTrips.<span Class="keyword">class</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;68</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;69</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (QDException e) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;70</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> FrankException(e);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;72</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;73</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> StopInfo getNextTripsForStopAllRoutes(<span Class="keyword">int</span> stopNo) </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;75</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throws</span> FrankException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;77</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;78<a name="src_78"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ArrayList&#60;NameValuePair&#62; params = <span Class="keyword">new</span> ArrayList&#60;NameValuePair&#62;();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;79</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       params.add(<span Class="keyword">new</span> BasicNameValuePair(STOP_NO, Integer.valueOf(stopNo).toString()));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;80</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> (StopInfo) m_broker.submitAndParse(GET_NEXT_TRIPS_FOR_STOP_ALL_ROUTES, params, RouteSummary.<span Class="keyword">class</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;81</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;82</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (QDException e) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;83</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> FrankException(e);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;84</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;85</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;86</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;87</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/StopInfo.html b/report/net/jaekl/frank/octranspo/StopInfo.html
new file mode 100644 (file)
index 0000000..4e65791
--- /dev/null
@@ -0,0 +1,528 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/frank/octranspo/StopInfo.html" target="_top">Frames</a>
+<a href="StopInfo.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.StopInfo</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(9/9)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>83</b>%(24/29)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  83"></td><td class="percentUnCovered" width="17.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>64</b>%(14/22)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  64"></td><td class="percentUnCovered" width="36.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(32/32)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_8">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">5</span></td>
+ <td class="reportText"><span class="text"><a href="#src_26">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.String,java.lang.String[],java.lang.Object[][])</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">11</span></td>
+ <td class="reportText"><span class="text"><a href="#src_49">endContents</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endContents(java.lang.String,java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">5</span></td>
+ <td class="reportText"><span class="text"><a href="#src_65">endExternal</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endExternal(java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">5</span></td>
+ <td class="reportText"><span class="text"><a href="#src_38">getDescr</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getDescr()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_39">getError</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getError()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">7</span></td>
+ <td class="reportText"><span class="text"><a href="#src_40">getNumRoutes</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">int getNumRoutes()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">6</span></td>
+ <td class="reportText"><span class="text"><a href="#src_41">getRoute</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.Route getRoute(int)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">5</span></td>
+ <td class="reportText"><span class="text"><a href="#src_37">getStopNo</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">int getStopNo()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank.octranspo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ArrayList;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.ParseResult;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.XmlParseException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;8<a name="src_8"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> StopInfo <span Class="keyword">extends</span> ParseResult</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// potential child tag names</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;11</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> String STOP_NO = <span Class="string">"StopNo"</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> String DESCRIPTION = <span Class="string">"StopDescription"</span>;     <span Class="comment">// Present in RouteSummary</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> String STOP_LABEL = <span Class="string">"StopLabel"</span>;                    <span Class="comment">// What NextTrips calls StopDescription</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> String ERROR = <span Class="string">"Error"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> String ROUTES = <span Class="string">"Routes"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> String ROUTE = <span Class="string">"Route"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// data returned inside our element</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">int</span> m_stopNo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_descr;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_error;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ArrayList&#60;Route&#62; m_routes;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// Constructor</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> StopInfo(String rootTagName, String[] internal, Object[][] external) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;26<a name="src_26"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>(rootTagName, internal, external);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_stopNo = 0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_descr = <span Class="string">""</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_error = <span Class="string">""</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_routes = <span Class="keyword">new</span> ArrayList&#60;Route&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// -----------------------------</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// Public methods to access data</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;37<a name="src_37"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">int</span> getStopNo() { <span Class="keyword">return</span> m_stopNo; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38<a name="src_38"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getDescr() { <span Class="keyword">return</span> m_descr; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;39<a name="src_39"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getError() { <span Class="keyword">return</span> m_error; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40<a name="src_40"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">int</span> getNumRoutes() { <span Class="keyword">return</span> m_routes.size(); }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;41<a name="src_41"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> Route getRoute(<span Class="keyword">int</span> idx) { <span Class="keyword">return</span> m_routes.get(idx); }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// --------------------------</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// ParseResult implementation</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endContents(String uri, String localName, String qName, String chars) <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;49<a name="src_49"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">assert</span> (<span Class="keyword">null</span> != localName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;50</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;51</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (localName.equals(STOP_NO)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;52</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_stopNo = Integer.parseInt(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;54</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">else</span> <span Class="keyword">if</span> (localName.equals(DESCRIPTION) || localName.equals(STOP_LABEL)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;55</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;2/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_descr = chars;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;56</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;57</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">else</span> <span Class="keyword">if</span> (localName.equals(ERROR)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;58</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_error = chars;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;60</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endExternal(String uri, String localName, String qName) <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;64</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;65<a name="src_65"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (localName.equals(ROUTE)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;66</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ParseResult[] collected = collectParsedChildren(Route.<span Class="keyword">class</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;67</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">for</span> (ParseResult pr : collected) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;68</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">assert</span> (pr <span Class="keyword">instanceof</span> Route);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;69</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_routes.add((Route)pr);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;70</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;72</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;73</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;75</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/Trip.html b/report/net/jaekl/frank/octranspo/Trip.html
new file mode 100644 (file)
index 0000000..c2e39ed
--- /dev/null
@@ -0,0 +1,890 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/frank/octranspo/Trip.html" target="_top">Frames</a>
+<a href="Trip.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.frank.octranspo.Trip</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>94</b>%(15/16)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  94"></td><td class="percentUnCovered" width="6.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>94</b>%(34/36)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  94"></td><td class="percentUnCovered" width="6.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>94</b>%(17/18)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  94"></td><td class="percentUnCovered" width="6.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>95</b>%(58/61)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  95"></td><td class="percentUnCovered" width="5.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_25">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">13</span></td>
+ <td class="reportText"><span class="text"><a href="#src_50">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_66">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(net.jaekl.frank.octranspo.Trip)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">81</span></td>
+ <td class="reportText"><span class="text"><a href="#src_102">endContents</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endContents(java.lang.String,java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_138">endExternal</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endExternal(java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">12</span></td>
+ <td class="reportText"><span class="text"><a href="#src_82">getAdjAge</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">double getAdjAge()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">12</span></td>
+ <td class="reportText"><span class="text"><a href="#src_81">getAdjTime</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">int getAdjTime()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_84">getBusType</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getBusType()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_79">getDest</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getDest()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_90">getETA</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.util.Date getETA()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_93">getGPSTime</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.util.Date getGPSTime()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_87">getLatitude</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">double getLatitude()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_86">getLongitude</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">double getLongitude()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_85">getSpeed</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">double getSpeed()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_80">getStart</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.util.Date getStart()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_83">isLastTrip</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">boolean isLastTrip()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.frank.octranspo;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.text.DateFormat;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.text.ParseException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.text.SimpleDateFormat;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Date;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.util.ParseUtils;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.ParseResult;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.XmlParseException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> Trip <span Class="keyword">extends</span> ParseResult {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String TRIP = <span Class="string">"Trip"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String TRIP_DESTINATION = <span Class="string">"TripDestination"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String TRIP_START_TIME = <span Class="string">"TripStartTime"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ADJUSTED_SCHEDULE_TIME = <span Class="string">"AdjustedScheduleTime"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String ADJUSTMENT_AGE = <span Class="string">"AdjustmentAge"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String LAST_TRIP_OF_SCHEDULE = <span Class="string">"LastTripOfSchedule"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String BUS_TYPE = <span Class="string">"BusType"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String GPS_SPEED = <span Class="string">"GPSSpeed"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String LATITUDE = <span Class="string">"Latitude"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String LONGITUDE = <span Class="string">"Longitude"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;25<a name="src_25"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> String[] INTERNAL = { TRIP_DESTINATION,</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              TRIP_START_TIME,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              ADJUSTED_SCHEDULE_TIME,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              ADJUSTMENT_AGE,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              LAST_TRIP_OF_SCHEDULE,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              BUS_TYPE,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              GPS_SPEED,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              LATITUDE,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                              LONGITUDE };</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">final</span> Object[][] EXTERNAL = {};</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    String  m_dest;      <span Class="comment">// destination</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    Date    m_start;     <span Class="comment">// time at which the trip started / is scheduled to start</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">int</span>     m_adjTime;   <span Class="comment">// minutes until bus is predicted to arrive</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">double</span>  m_adjAge;    <span Class="comment">// time since the last GPS data was received, in minutes (possibly fractional)</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">boolean</span> m_lastTrip;  <span Class="comment">// is this the last scheduled trip of the day?</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;41</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    String  m_busType;   <span Class="comment">// type of bus</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">double</span>  m_speed;     <span Class="comment">// speed (km/h) when last polled</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">double</span>  m_long;      <span Class="comment">// longitude</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">double</span>  m_lat;       <span Class="comment">// latitude</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    DateFormat m_dateFormat;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    Date       m_constructed;  <span Class="comment">// DateTime when this object was constructed</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;49</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> Trip() {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;50<a name="src_50"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">super</span>(TRIP, INTERNAL, EXTERNAL);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;51</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_dest = <span Class="string">""</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_start = <span Class="keyword">new</span> Date();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_adjTime = 0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;54</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_adjAge = 0.0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;55</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_lastTrip = <span Class="keyword">false</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;56</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_busType = <span Class="string">""</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;57</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_speed = 0.0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;58</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_long = 0.0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_lat = 0.0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_dateFormat = <span Class="keyword">new</span> SimpleDateFormat(<span Class="string">"hh:mm"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_constructed = <span Class="keyword">new</span> Date();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;64</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;65</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> Trip(Trip other) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;66<a name="src_66"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">super</span>(TRIP, INTERNAL, EXTERNAL);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;67</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_dest = other.m_dest;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;68</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_start = other.m_start;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;69</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_adjTime = other.m_adjTime;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;70</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_adjAge = other.m_adjAge;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_lastTrip = other.m_lastTrip;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;72</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_busType = other.m_busType;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;73</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_speed = other.m_speed;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_long = other.m_long;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;75</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_lat = other.m_lat;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       m_constructed = other.m_constructed;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;77</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;78</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;79<a name="src_79"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getDest() { <span Class="keyword">return</span> m_dest; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;80<a name="src_80"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> Date getStart() { <span Class="keyword">return</span> m_start; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;81<a name="src_81"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> <span Class="keyword">int</span> getAdjTime() { <span Class="keyword">return</span> m_adjTime; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;82<a name="src_82"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> <span Class="keyword">double</span> getAdjAge() { <span Class="keyword">return</span> m_adjAge; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;83<a name="src_83"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> <span Class="keyword">boolean</span> isLastTrip() { <span Class="keyword">return</span> m_lastTrip; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;84<a name="src_84"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> String getBusType() { <span Class="keyword">return</span> m_busType; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;85<a name="src_85"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> <span Class="keyword">double</span> getSpeed() { <span Class="keyword">return</span> m_speed; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;86<a name="src_86"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> <span Class="keyword">double</span> getLongitude() { <span Class="keyword">return</span> m_long; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;87<a name="src_87"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> <span Class="keyword">double</span> getLatitude() { <span Class="keyword">return</span> m_lat; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;88</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;89</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="comment">// Estimated (Date)Time of Arrival of this trip at the stop </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;90<a name="src_90"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> Date getETA() { <span Class="keyword">return</span> <span Class="keyword">new</span> Date(m_constructed.getTime() + (<span Class="keyword">long</span>)(1000 * 60 * m_adjTime)); }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;91</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;92</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="comment">// (Date)Time when the GPS for this bus was last read</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;93<a name="src_93"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="keyword">public</span> Date getGPSTime() { <span Class="keyword">return</span> <span Class="keyword">new</span> Date(m_constructed.getTime() - (<span Class="keyword">long</span>)(1000 * 60 * m_adjAge)); } </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;94</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;95</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="comment">// ---------------------------</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;96</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    <span Class="comment">// ParseResult implementation:</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;97</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;    </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;98</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;99</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endContents(String uri, String localName, String qName,   String chars) <span Class="keyword">throws</span> XmlParseException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;100</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;101</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;102<a name="src_102"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (TRIP_DESTINATION.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;103</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_dest = chars;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;104</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;105</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (TRIP_START_TIME.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;106</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_start = m_dateFormat.parse(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;107</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;108</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (ADJUSTED_SCHEDULE_TIME.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;109</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_adjTime = ParseUtils.parseInt(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;110</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;111</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (ADJUSTMENT_AGE.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;112</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_adjAge = ParseUtils.parseDouble(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;113</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;114</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (LAST_TRIP_OF_SCHEDULE.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;115</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_lastTrip = Boolean.parseBoolean(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;116</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;117</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (BUS_TYPE.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;118</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_busType = chars;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;119</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;120</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (GPS_SPEED.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;121</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_speed = ParseUtils.parseDouble(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;122</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;123</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (LONGITUDE.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;124</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_long = ParseUtils.parseDouble(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;125</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;126</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> <span Class="keyword">if</span> (LATITUDE.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;127</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_lat = ParseUtils.parseDouble(chars);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;128</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;129</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               } <span Class="keyword">catch</span> (ParseException pe) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;130</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> XmlParseException(pe);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;131</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;132</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;133</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;134</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;135</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endExternal(String uri, String localName, String qName) <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;136</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;137</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no externally-parsed children</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;138<a name="src_138"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;139</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;140</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/package-frame.html b/report/net/jaekl/frank/octranspo/package-frame.html
new file mode 100644 (file)
index 0000000..27e2836
--- /dev/null
@@ -0,0 +1,23 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+</head>
+<body>
+<a href="package-summary.html" target="classFrame">net.jaekl.frank.octranspo</a> <span class="text_italic">&nbsp;  98% (43/44)</span><br>
+<p>
+<span class="title">All classes</span>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="./NextTrips.html" target="classFrame">NextTrips</a><span class="text_italic">&nbsp; 100% (2/2)</span><br>
+<a href="./Route.html" target="classFrame">Route</a><span class="text_italic">&nbsp; 100% (10/10)</span><br>
+<a href="./RouteSummary.html" target="classFrame">RouteSummary</a><span class="text_italic">&nbsp; 100% (2/2)</span><br>
+<a href="./Server.html" target="classFrame">Server</a><span class="text_italic">&nbsp; 100% (5/5)</span><br>
+<a href="./StopInfo.html" target="classFrame">StopInfo</a><span class="text_italic">&nbsp; 100% (9/9)</span><br>
+<a href="./Trip.html" target="classFrame">Trip</a><span class="text_italic">&nbsp;  94% (15/16)</span><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/octranspo/package-summary.html b/report/net/jaekl/frank/octranspo/package-summary.html
new file mode 100644 (file)
index 0000000..50484c0
--- /dev/null
@@ -0,0 +1,83 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+</head>
+<body>
+<span class="title">Coverage report </span>
+<p>
+<table class="report" cellpadding="0" cellspacing="0">
+<tr class="report">
+<th class="report">&nbsp;</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText">net.jaekl.frank.octranspo</td>
+<td class="reportValue">6</td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>98</b>%(43/44)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  98"></td><td class="percentUnCovered" width="2.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>84</b>%(97/115)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  84"></td><td class="percentUnCovered" width="16.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>70</b>%(49/70)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  70"></td><td class="percentUnCovered" width="30.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>94</b>%(150/159)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  94"></td><td class="percentUnCovered" width="6.0"></td></tr></table></td></tr></table></td>
+</tr>
+</table>
+<p>
+<span class="title2">Classes</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="classes">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="NextTrips.html">NextTrips</a></td>
+<td class="reportValue"><b> 100</b>% (2/2)</td>
+<td class="reportValue"><b> 100</b>% (2/2)</td>
+<td class="reportValue"> -</td>
+<td class="reportValue"><b> 100</b>% (4/4)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="Route.html">Route</a></td>
+<td class="reportValue"><b> 100</b>% (10/10)</td>
+<td class="reportValue"><b>  90</b>% (26/29)</td>
+<td class="reportValue"><b>  75</b>% (15/20)</td>
+<td class="reportValue"><b> 100</b>% (31/31)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="RouteSummary.html">RouteSummary</a></td>
+<td class="reportValue"><b> 100</b>% (2/2)</td>
+<td class="reportValue"><b> 100</b>% (2/2)</td>
+<td class="reportValue"> -</td>
+<td class="reportValue"><b> 100</b>% (4/4)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="Server.html">Server</a></td>
+<td class="reportValue"><b> 100</b>% (5/5)</td>
+<td class="reportValue"><b>  53</b>% (9/17)</td>
+<td class="reportValue"><b>  30</b>% (3/10)</td>
+<td class="reportValue"><b>  78</b>% (21/27)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="StopInfo.html">StopInfo</a></td>
+<td class="reportValue"><b> 100</b>% (9/9)</td>
+<td class="reportValue"><b>  83</b>% (24/29)</td>
+<td class="reportValue"><b>  64</b>% (14/22)</td>
+<td class="reportValue"><b> 100</b>% (32/32)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="Trip.html">Trip</a></td>
+<td class="reportValue"><b>  94</b>% (15/16)</td>
+<td class="reportValue"><b>  94</b>% (34/36)</td>
+<td class="reportValue"><b>  94</b>% (17/18)</td>
+<td class="reportValue"><b>  95</b>% (58/61)</td>
+</tr>
+</table>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/package-frame.html b/report/net/jaekl/frank/package-frame.html
new file mode 100644 (file)
index 0000000..3f6ff3f
--- /dev/null
@@ -0,0 +1,21 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+</head>
+<body>
+<a href="package-summary.html" target="classFrame">net.jaekl.frank</a> <span class="text_italic">&nbsp;  83% (15/18)</span><br>
+<p>
+<span class="title">All classes</span>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="./FrankBundle.html" target="classFrame">FrankBundle</a><span class="text_italic">&nbsp; 100% (4/4)</span><br>
+<a href="./FrankException.html" target="classFrame">FrankException</a><span class="text_italic">&nbsp;   0% (0/1)</span><br>
+<a href="./Schedule.html" target="classFrame">Schedule</a><span class="text_italic">&nbsp; 100% (7/7)</span><br>
+<a href="./ViewSchedule.html" target="classFrame">ViewSchedule</a><span class="text_italic">&nbsp;  67% (4/6)</span><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/net/jaekl/frank/package-summary.html b/report/net/jaekl/frank/package-summary.html
new file mode 100644 (file)
index 0000000..5ff0e15
--- /dev/null
@@ -0,0 +1,111 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+</head>
+<body>
+<span class="title">Coverage report </span>
+<p>
+<table class="report" cellpadding="0" cellspacing="0">
+<tr class="report">
+<th class="report">&nbsp;</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText">net.jaekl.frank</td>
+<td class="reportValue">4</td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>83</b>%(15/18)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  83"></td><td class="percentUnCovered" width="17.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>64</b>%(38/59)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  64"></td><td class="percentUnCovered" width="36.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>57</b>%(16/28)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  57"></td><td class="percentUnCovered" width="43.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>77</b>%(114/148)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  77"></td><td class="percentUnCovered" width="23.0"></td></tr></table></td></tr></table></td>
+</tr>
+</table>
+<p>
+<span class="title2">Packages</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="subpackages">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">#classes</th>
+<th class="report">%class</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="octranspo/package-summary.html">net.jaekl.frank.octranspo</a></td>
+<td class="reportValue">6</td>
+<td class="reportValue"><b> 100</b>% (6/6)</td>
+<td class="reportValue"><b>  98</b>% (43/44)</td>
+<td class="reportValue"><b>  84</b>% (97/115)</td>
+<td class="reportValue"><b>  70</b>% (49/70)</td>
+<td class="reportValue"><b>  94</b>% (150/159)</td>
+</tr>
+</table>
+<p>
+<span class="title2">Classes</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="classes">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="FrankBundle.html">FrankBundle</a></td>
+<td class="reportValue"><b> 100</b>% (4/4)</td>
+<td class="reportValue"><b>  69</b>% (9/13)</td>
+<td class="reportValue"><b>  67</b>% (4/6)</td>
+<td class="reportValue"><b>  79</b>% (15/19)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="FrankException.html">FrankException</a></td>
+<td class="reportValue"><b>   0</b>% (0/1)</td>
+<td class="reportValue"><b>   0</b>% (0/1)</td>
+<td class="reportValue"> -</td>
+<td class="reportValue"><b>   0</b>% (0/2)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="Schedule.html">Schedule</a></td>
+<td class="reportValue"><b> 100</b>% (7/7)</td>
+<td class="reportValue"><b>  88</b>% (21/24)</td>
+<td class="reportValue"><b>  75</b>% (9/12)</td>
+<td class="reportValue"><b>  98</b>% (79/81)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="ViewSchedule.html">ViewSchedule</a></td>
+<td class="reportValue"><b>  67</b>% (4/6)</td>
+<td class="reportValue"><b>  38</b>% (8/21)</td>
+<td class="reportValue"><b>  30</b>% (3/10)</td>
+<td class="reportValue"><b>  43</b>% (20/46)</td>
+</tr>
+</table>
+<p>
+<span class="title2">Total (including subpackages)</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="subpackages">
+<tr class="report">
+<th class="report">-</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportValue"></td>
+<td class="reportValue">10</td>
+<td class="reportValue"><b>  94</b>% (58/62)</td>
+<td class="reportValue"><b>  78</b>% (135/174)</td>
+<td class="reportValue"><b>  66</b>% (65/98)</td>
+<td class="reportValue"><b>  86</b>% (264/307)</td>
+</table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/QDBundleFactory.html b/report/net/jaekl/qd/QDBundleFactory.html
new file mode 100644 (file)
index 0000000..050181d
--- /dev/null
@@ -0,0 +1,312 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../index.html?net/jaekl/qd/QDBundleFactory.html" target="_top">Frames</a>
+<a href="QDBundleFactory.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.QDBundleFactory</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(3/3)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>88</b>%(7/8)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  88"></td><td class="percentUnCovered" width="12.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>75</b>%(3/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  75"></td><td class="percentUnCovered" width="25.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(11/11)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_20">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[private]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_38">getBundle</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.util.ResourceBundle getBundle(java.lang.String,java.util.Locale)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">5</span></td>
+ <td class="reportText"><span class="text"><a href="#src_25">getInst</a></span></td>
+ <td class="reportText"><span class="text">[public, static]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.qd.QDBundleFactory getInst()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Copyright (C) 2004, 2014 Christian Jaekl</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Central spot from which to access ResourceBundles.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// This made more sense with earlier versions of Java, where the specification did not </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// guarantee that ResourceBundles would be cached.  Java 7 and later cache by default,</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// but it still seems prudent to centralize accesses to resources here so that we have </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// control in case we want to implement our own cache, or override certain behaviours.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Note that we rely on the JVM's caching, to avoid unnecessary overhead.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// See http://java2go.blogspot.ca/2010/03/dont-be-smart-never-implement-resource.html</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Locale;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ResourceBundle;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> QDBundleFactory {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">static</span> <span Class="keyword">volatile</span> QDBundleFactory m_inst;       <span Class="comment">// singleton instance</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;20<a name="src_20"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> QDBundleFactory() {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> QDBundleFactory getInst() {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;25<a name="src_25"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               QDBundleFactory result = m_inst;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (<span Class="keyword">null</span> == result) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;27</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">synchronized</span>(QDBundleFactory.<span Class="keyword">class</span>) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">if</span> (<span Class="keyword">null</span> == m_inst) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;29</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       m_inst = <span Class="keyword">new</span> QDBundleFactory();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;31</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               result = m_inst;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> result;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> ResourceBundle getBundle(String baseName, Locale locale) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38<a name="src_38"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> ResourceBundle.getBundle(baseName, locale);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/QDException.html b/report/net/jaekl/qd/QDException.html
new file mode 100644 (file)
index 0000000..b7a7f3b
--- /dev/null
@@ -0,0 +1,176 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../index.html?net/jaekl/qd/QDException.html" target="_top">Frames</a>
+<a href="QDException.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.QDException</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(2/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(2/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>-</b>%</span></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(4/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_8">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_12">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.Throwable)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> QDException <span Class="keyword">extends</span> Exception</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> <span Class="keyword">static</span> <span Class="keyword">final</span> <span Class="keyword">long</span> serialVersionUID = 1L;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> QDException() {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;8<a name="src_8"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> QDException(Throwable t) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;12<a name="src_12"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>(t);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/http/RequestBroker.html b/report/net/jaekl/qd/http/RequestBroker.html
new file mode 100644 (file)
index 0000000..7dcf324
--- /dev/null
@@ -0,0 +1,890 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/http/RequestBroker.html" target="_top">Frames</a>
+<a href="RequestBroker.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.http.RequestBroker</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>83</b>%(5/6)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  83"></td><td class="percentUnCovered" width="17.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>50</b>%(14/28)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  50"></td><td class="percentUnCovered" width="50.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>40</b>%(4/10)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  40"></td><td class="percentUnCovered" width="60.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>53</b>%(31/58)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  53"></td><td class="percentUnCovered" width="47.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_31">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">9</span></td>
+ <td class="reportText"><span class="text"><a href="#src_40">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.String,java.util.ArrayList)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_49">doSubmit</a></span></td>
+ <td class="reportText"><span class="text">[]</span></td>
+ <td class="reportText"><span class="text">java.io.InputStream doSubmit(java.lang.String,java.util.ArrayList)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_84">submit</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String submit(java.lang.String,java.util.ArrayList)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">5</span></td>
+ <td class="reportText"><span class="text"><a href="#src_111">submitAndParse</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.ParseResult submitAndParse(java.lang.String,java.util.ArrayList,java.lang.Class)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_120">submitAndParse</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.ParseResult submitAndParse(java.lang.String,java.util.ArrayList,java.lang.Class,java.lang.String)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Copyright (C) 2004, 2014 Christian Jaekl</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.http;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.BufferedReader;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.IOException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.InputStream;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.InputStreamReader;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.UnsupportedEncodingException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.lang.reflect.InvocationTargetException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ArrayList;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.QDException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.util.ExceptionUtils;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.ParseHandler;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.xml.ParseResult;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.HttpEntity;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.HttpResponse;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.NameValuePair;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.client.HttpClient;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.client.config.RequestConfig;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.client.entity.UrlEncodedFormEntity;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.client.methods.HttpPost;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.apache.http.impl.client.HttpClientBuilder;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.InputSource;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.SAXException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.XMLReader;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.helpers.XMLReaderFactory;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;31<a name="src_31"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> RequestBroker</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">final</span> String UTF_8 = <span Class="string">"UTF-8"</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">final</span> <span Class="keyword">int</span> TIMEOUT_MSEC = 5000;        <span Class="comment">// Allow at most 5 seconds before we declare the server to be unresponsive</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_gatewayUrl;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ArrayList&#60;NameValuePair&#62; m_baseParams;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> RequestBroker(String gatewayUrl, ArrayList&#60;NameValuePair&#62; baseParams)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40<a name="src_40"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;41</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_gatewayUrl = gatewayUrl;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_baseParams = <span Class="keyword">new</span> ArrayList&#60;NameValuePair&#62;(baseParams);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// NB:  Caller is responsible for close()ing the returned InputStream</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">//</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       InputStream doSubmit(String method, ArrayList&#60;NameValuePair&#62; passedParams) <span Class="keyword">throws</span> QDException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;49<a name="src_49"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               ArrayList&#60;NameValuePair&#62; params = <span Class="keyword">new</span> ArrayList&#60;NameValuePair&#62;(m_baseParams);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;50</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               params.addAll(passedParams);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;51</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       RequestConfig.Builder requestBuilder = RequestConfig.custom();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;54</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       requestBuilder = requestBuilder.setConnectTimeout(TIMEOUT_MSEC);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;55</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       requestBuilder = requestBuilder.setSocketTimeout(TIMEOUT_MSEC);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;56</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       HttpClientBuilder builder = HttpClientBuilder.create();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;57</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       builder.setDefaultRequestConfig(requestBuilder.build());</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;58</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       HttpClient httpClient = builder.build(); </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       HttpPost httpPost = <span Class="keyword">new</span> HttpPost(m_gatewayUrl + <span Class="string">"/"</span> + method + <span Class="string">"/"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       httpPost.setEntity(<span Class="keyword">new</span> UrlEncodedFormEntity(params, UTF_8));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       HttpResponse response = httpClient.execute(httpPost);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       HttpEntity entity = response.getEntity();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;64</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (<span Class="keyword">null</span> != entity) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;65</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               InputStream is = entity.getContent();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;66</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">return</span> is;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;67</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;68</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;69</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (UnsupportedEncodingException uee) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;70</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// We should actually be guaranteed that this never happens, </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// because all JVMs are required to support UTF-8</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;72</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">assert</span>(<span Class="keyword">false</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;73</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> Error(uee);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;75</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (IOException ioe) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> QDException(ioe);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;77</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;78</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;79</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> <span Class="keyword">null</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;80</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;81</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;82</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String submit(String method, ArrayList&#60;NameValuePair&#62; passedParams) <span Class="keyword">throws</span> QDException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;83</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;84<a name="src_84"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               StringBuilder sb = <span Class="keyword">new</span> StringBuilder();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;85</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               InputStream is = <span Class="keyword">null</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;86</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;87</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;88</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       is = doSubmit(method, passedParams);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;89</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       BufferedReader br = <span Class="keyword">new</span> BufferedReader(<span Class="keyword">new</span> InputStreamReader(is));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;90</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       String line = br.readLine();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;91</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">while</span> (<span Class="keyword">null</span> != line) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;92</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               sb.append(line).append(<span Class="string">"\n"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;93</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               line = br.readLine();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;94</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;95</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;96</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (IOException ioe) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;97</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> QDException(ioe);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;98</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;99</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">finally</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;100</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/2&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ExceptionUtils.tryClose(is);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;101</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;102</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;103</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> sb.toString();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;104</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;105</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;106</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> ParseResult submitAndParse(String method, </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;107</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                         ArrayList&#60;NameValuePair&#62; passedParams, </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;108</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                         Class&#60;? <span Class="keyword">extends</span> ParseResult&#62; rootParserClass)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;109</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">throws</span> QDException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;110</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;111<a name="src_111"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> submitAndParse(method, passedParams, rootParserClass, <span Class="keyword">null</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;112</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;113</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;114</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> ParseResult submitAndParse(String method, </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;115</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                                                         ArrayList&#60;NameValuePair&#62; passedParams, </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;116</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                                                         Class&#60;? <span Class="keyword">extends</span> ParseResult&#62; rootParserClass,</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;117</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                                                         String rootTagName)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;118</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">throws</span> QDException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;119</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;120<a name="src_120"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               ParseResult result = <span Class="keyword">null</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;121</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               InputStream is = <span Class="keyword">null</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;122</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;123</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;124</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (<span Class="keyword">null</span> == rootTagName) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;125</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               result = (ParseResult) rootParserClass.newInstance();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;126</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       } </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;127</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;128</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               result = (ParseResult) rootParserClass.getDeclaredConstructor(String.<span Class="keyword">class</span>).newInstance(rootTagName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;129</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;130</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       is = doSubmit(method, passedParams);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;131</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       XMLReader reader = XMLReaderFactory.createXMLReader();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;132</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ParseHandler ph = <span Class="keyword">new</span> ParseHandler(result);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;133</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       reader.setContentHandler(ph);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;134</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       reader.parse(<span Class="keyword">new</span> InputSource(is));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;135</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               } </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;136</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> ( InstantiationException</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;137</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               | InvocationTargetException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;138</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               | IllegalAccessException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;139</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               | IOException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;140</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               | NoSuchMethodException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;141</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               | SAXException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;142</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               e )</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;143</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;144</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> QDException(e);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;145</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               } </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;146</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">finally</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;147</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ExceptionUtils.tryClose(is);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;148</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;149</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;150</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> result;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;151</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;152</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/http/package-frame.html b/report/net/jaekl/qd/http/package-frame.html
new file mode 100644 (file)
index 0000000..2f2027c
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+</head>
+<body>
+<a href="package-summary.html" target="classFrame">net.jaekl.qd.http</a> <span class="text_italic">&nbsp;  83% (5/6)</span><br>
+<p>
+<span class="title">All classes</span>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="./RequestBroker.html" target="classFrame">RequestBroker</a><span class="text_italic">&nbsp;  83% (5/6)</span><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/http/package-summary.html b/report/net/jaekl/qd/http/package-summary.html
new file mode 100644 (file)
index 0000000..5eae753
--- /dev/null
@@ -0,0 +1,48 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+</head>
+<body>
+<span class="title">Coverage report </span>
+<p>
+<table class="report" cellpadding="0" cellspacing="0">
+<tr class="report">
+<th class="report">&nbsp;</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText">net.jaekl.qd.http</td>
+<td class="reportValue">1</td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>83</b>%(5/6)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  83"></td><td class="percentUnCovered" width="17.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>50</b>%(14/28)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  50"></td><td class="percentUnCovered" width="50.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>40</b>%(4/10)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  40"></td><td class="percentUnCovered" width="60.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>53</b>%(31/58)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  53"></td><td class="percentUnCovered" width="47.0"></td></tr></table></td></tr></table></td>
+</tr>
+</table>
+<p>
+<span class="title2">Classes</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="classes">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="RequestBroker.html">RequestBroker</a></td>
+<td class="reportValue"><b>  83</b>% (5/6)</td>
+<td class="reportValue"><b>  50</b>% (14/28)</td>
+<td class="reportValue"><b>  40</b>% (4/10)</td>
+<td class="reportValue"><b>  53</b>% (31/58)</td>
+</tr>
+</table>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/package-frame.html b/report/net/jaekl/qd/package-frame.html
new file mode 100644 (file)
index 0000000..d236694
--- /dev/null
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+</head>
+<body>
+<a href="package-summary.html" target="classFrame">net.jaekl.qd</a> <span class="text_italic">&nbsp; 100% (5/5)</span><br>
+<p>
+<span class="title">All classes</span>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="./QDBundleFactory.html" target="classFrame">QDBundleFactory</a><span class="text_italic">&nbsp; 100% (3/3)</span><br>
+<a href="./QDException.html" target="classFrame">QDException</a><span class="text_italic">&nbsp; 100% (2/2)</span><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/package-summary.html b/report/net/jaekl/qd/package-summary.html
new file mode 100644 (file)
index 0000000..e83749d
--- /dev/null
@@ -0,0 +1,115 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../style.css" title="Style">
+<script type="text/javascript" src="../../../sorttable.js"></script>
+</head>
+<body>
+<span class="title">Coverage report </span>
+<p>
+<table class="report" cellpadding="0" cellspacing="0">
+<tr class="report">
+<th class="report">&nbsp;</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText">net.jaekl.qd</td>
+<td class="reportValue">2</td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(5/5)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>90</b>%(9/10)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  90"></td><td class="percentUnCovered" width="10.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>75</b>%(3/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  75"></td><td class="percentUnCovered" width="25.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(15/15)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+</tr>
+</table>
+<p>
+<span class="title2">Packages</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="subpackages">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">#classes</th>
+<th class="report">%class</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="http/package-summary.html">net.jaekl.qd.http</a></td>
+<td class="reportValue">1</td>
+<td class="reportValue"><b> 100</b>% (1/1)</td>
+<td class="reportValue"><b>  83</b>% (5/6)</td>
+<td class="reportValue"><b>  50</b>% (14/28)</td>
+<td class="reportValue"><b>  40</b>% (4/10)</td>
+<td class="reportValue"><b>  53</b>% (31/58)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="util/package-summary.html">net.jaekl.qd.util</a></td>
+<td class="reportValue">3</td>
+<td class="reportValue"><b> 100</b>% (3/3)</td>
+<td class="reportValue"><b>  57</b>% (4/7)</td>
+<td class="reportValue"><b>  88</b>% (21/24)</td>
+<td class="reportValue"><b> 100</b>% (14/14)</td>
+<td class="reportValue"><b>  86</b>% (19/22)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="xml/package-summary.html">net.jaekl.qd.xml</a></td>
+<td class="reportValue">5</td>
+<td class="reportValue"><b>  80</b>% (4/5)</td>
+<td class="reportValue"><b>  74</b>% (23/31)</td>
+<td class="reportValue"><b>  80</b>% (74/93)</td>
+<td class="reportValue"><b>  82</b>% (41/50)</td>
+<td class="reportValue"><b>  83</b>% (114/137)</td>
+</tr>
+</table>
+<p>
+<span class="title2">Classes</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="classes">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="QDBundleFactory.html">QDBundleFactory</a></td>
+<td class="reportValue"><b> 100</b>% (3/3)</td>
+<td class="reportValue"><b>  88</b>% (7/8)</td>
+<td class="reportValue"><b>  75</b>% (3/4)</td>
+<td class="reportValue"><b> 100</b>% (11/11)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="QDException.html">QDException</a></td>
+<td class="reportValue"><b> 100</b>% (2/2)</td>
+<td class="reportValue"><b> 100</b>% (2/2)</td>
+<td class="reportValue"> -</td>
+<td class="reportValue"><b> 100</b>% (4/4)</td>
+</tr>
+</table>
+<p>
+<span class="title2">Total (including subpackages)</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="subpackages">
+<tr class="report">
+<th class="report">-</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportValue"></td>
+<td class="reportValue">11</td>
+<td class="reportValue"><b>  76</b>% (37/49)</td>
+<td class="reportValue"><b>  76</b>% (118/155)</td>
+<td class="reportValue"><b>  79</b>% (62/78)</td>
+<td class="reportValue"><b>  77</b>% (179/232)</td>
+</table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/util/ExceptionUtils.html b/report/net/jaekl/qd/util/ExceptionUtils.html
new file mode 100644 (file)
index 0000000..54f408a
--- /dev/null
@@ -0,0 +1,201 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/util/ExceptionUtils.html" target="_top">Frames</a>
+<a href="ExceptionUtils.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.util.ExceptionUtils</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>50</b>%(1/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  50"></td><td class="percentUnCovered" width="50.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>83</b>%(5/6)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  83"></td><td class="percentUnCovered" width="17.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(2/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>86</b>%(6/7)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  86"></td><td class="percentUnCovered" width="14.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_8">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">8</span></td>
+ <td class="reportText"><span class="text"><a href="#src_11">tryClose</a></span></td>
+ <td class="reportText"><span class="text">[public, static]</span></td>
+ <td class="reportText"><span class="text">void tryClose(java.io.Closeable)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.util;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.Closeable;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.io.IOException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.QDException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;8<a name="src_8"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> ExceptionUtils {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">void</span> tryClose(Closeable closeable) <span Class="keyword">throws</span> QDException {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;11<a name="src_11"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (<span Class="keyword">null</span> != closeable) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;12</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               closeable.close();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;15</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (IOException ioe) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> QDException(ioe);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;17</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;18</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/util/ParseUtils.html b/report/net/jaekl/qd/util/ParseUtils.html
new file mode 100644 (file)
index 0000000..557169e
--- /dev/null
@@ -0,0 +1,262 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/util/ParseUtils.html" target="_top">Frames</a>
+<a href="ParseUtils.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.util.ParseUtils</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>67</b>%(2/3)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  67"></td><td class="percentUnCovered" width="33.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>91</b>%(10/11)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  91"></td><td class="percentUnCovered" width="9.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(8/8)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>91</b>%(10/11)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  91"></td><td class="percentUnCovered" width="9.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_3">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">44</span></td>
+ <td class="reportText"><span class="text"><a href="#src_7">parseDouble</a></span></td>
+ <td class="reportText"><span class="text">[public, static]</span></td>
+ <td class="reportText"><span class="text">double parseDouble(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">17</span></td>
+ <td class="reportText"><span class="text"><a href="#src_19">parseInt</a></span></td>
+ <td class="reportText"><span class="text">[public, static]</span></td>
+ <td class="reportText"><span class="text">int parseInt(java.lang.String)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.util;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;3<a name="src_3"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> ParseUtils {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// Attempt to parse the string as a double.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// Treat errors as a zero value.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">double</span> parseDouble(String string) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;7<a name="src_7"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> ((<span Class="keyword">null</span> == string) || (<span Class="string">""</span>.equals(string))) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;8</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;2/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> 0.0;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;11</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> Double.parseDouble(string);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;13</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (NumberFormatException exc) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> 0.0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">int</span> parseInt(String string) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;19<a name="src_19"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> ((<span Class="keyword">null</span> == string) || (<span Class="string">""</span>.equals(string))) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;20</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;2/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> 0;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;23</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> Integer.parseInt(string);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;25</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (NumberFormatException exc) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> 0;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/util/StringUtils.html b/report/net/jaekl/qd/util/StringUtils.html
new file mode 100644 (file)
index 0000000..57edcc4
--- /dev/null
@@ -0,0 +1,156 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/util/StringUtils.html" target="_top">Frames</a>
+<a href="StringUtils.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.util.StringUtils</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>50</b>%(1/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  50"></td><td class="percentUnCovered" width="50.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>86</b>%(6/7)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  86"></td><td class="percentUnCovered" width="14.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(4/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>75</b>%(3/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  75"></td><td class="percentUnCovered" width="25.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_3">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">18</span></td>
+ <td class="reportText"><span class="text"><a href="#src_5">areEqual</a></span></td>
+ <td class="reportText"><span class="text">[public, static]</span></td>
+ <td class="reportText"><span class="text">boolean areEqual(java.lang.String,java.lang.String)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.util;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;3<a name="src_3"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> StringUtils {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">static</span> <span Class="keyword">boolean</span> areEqual(String a, String b) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;5<a name="src_5"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (<span Class="keyword">null</span> == a) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;6</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> (<span Class="keyword">null</span> == b);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;8</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> a.equals(b);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/util/package-frame.html b/report/net/jaekl/qd/util/package-frame.html
new file mode 100644 (file)
index 0000000..106ba8d
--- /dev/null
@@ -0,0 +1,20 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+</head>
+<body>
+<a href="package-summary.html" target="classFrame">net.jaekl.qd.util</a> <span class="text_italic">&nbsp;  57% (4/7)</span><br>
+<p>
+<span class="title">All classes</span>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="./ExceptionUtils.html" target="classFrame">ExceptionUtils</a><span class="text_italic">&nbsp;  50% (1/2)</span><br>
+<a href="./ParseUtils.html" target="classFrame">ParseUtils</a><span class="text_italic">&nbsp;  67% (2/3)</span><br>
+<a href="./StringUtils.html" target="classFrame">StringUtils</a><span class="text_italic">&nbsp;  50% (1/2)</span><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/util/package-summary.html b/report/net/jaekl/qd/util/package-summary.html
new file mode 100644 (file)
index 0000000..8203e3f
--- /dev/null
@@ -0,0 +1,62 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+</head>
+<body>
+<span class="title">Coverage report </span>
+<p>
+<table class="report" cellpadding="0" cellspacing="0">
+<tr class="report">
+<th class="report">&nbsp;</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText">net.jaekl.qd.util</td>
+<td class="reportValue">3</td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>57</b>%(4/7)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  57"></td><td class="percentUnCovered" width="43.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>88</b>%(21/24)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  88"></td><td class="percentUnCovered" width="12.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(14/14)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>86</b>%(19/22)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  86"></td><td class="percentUnCovered" width="14.0"></td></tr></table></td></tr></table></td>
+</tr>
+</table>
+<p>
+<span class="title2">Classes</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="classes">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="ExceptionUtils.html">ExceptionUtils</a></td>
+<td class="reportValue"><b>  50</b>% (1/2)</td>
+<td class="reportValue"><b>  83</b>% (5/6)</td>
+<td class="reportValue"><b> 100</b>% (2/2)</td>
+<td class="reportValue"><b>  86</b>% (6/7)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="ParseUtils.html">ParseUtils</a></td>
+<td class="reportValue"><b>  67</b>% (2/3)</td>
+<td class="reportValue"><b>  91</b>% (10/11)</td>
+<td class="reportValue"><b> 100</b>% (8/8)</td>
+<td class="reportValue"><b>  91</b>% (10/11)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="StringUtils.html">StringUtils</a></td>
+<td class="reportValue"><b>  50</b>% (1/2)</td>
+<td class="reportValue"><b>  86</b>% (6/7)</td>
+<td class="reportValue"><b> 100</b>% (4/4)</td>
+<td class="reportValue"><b>  75</b>% (3/4)</td>
+</tr>
+</table>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/xml/MismatchedTagsException.html b/report/net/jaekl/qd/xml/MismatchedTagsException.html
new file mode 100644 (file)
index 0000000..7a540c2
--- /dev/null
@@ -0,0 +1,217 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/xml/MismatchedTagsException.html" target="_top">Frames</a>
+<a href="MismatchedTagsException.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.MismatchedTagsException</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>0</b>%(0/3)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="   0"></td><td class="percentUnCovered" width="100.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>0</b>%(0/3)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="   0"></td><td class="percentUnCovered" width="100.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>-</b>%</span></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>0</b>%(0/6)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="   0"></td><td class="percentUnCovered" width="100.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_14">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_20">getActual</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getActual()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_19">getExpected</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getExpected()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Copyright (C) 2004, 2014 Christian Jaekl</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.xml;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> MismatchedTagsException <span Class="keyword">extends</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> <span Class="keyword">static</span> <span Class="keyword">final</span> <span Class="keyword">long</span> serialVersionUID = 1L;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_expected;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_actual;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> MismatchedTagsException(String expected, String actual) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;14<a name="src_14"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_expected = expected;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_actual = actual;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;19<a name="src_19"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getExpected() { <span Class="keyword">return</span> m_expected; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;20<a name="src_20"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getActual() { <span Class="keyword">return</span> m_actual; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/xml/MissingInfoException.html b/report/net/jaekl/qd/xml/MissingInfoException.html
new file mode 100644 (file)
index 0000000..bdfb71a
--- /dev/null
@@ -0,0 +1,359 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/xml/MissingInfoException.html" target="_top">Frames</a>
+<a href="MissingInfoException.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.MissingInfoException</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(5/5)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(11/11)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(4/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(19/19)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_16">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">2</span></td>
+ <td class="reportText"><span class="text"><a href="#src_23">addMissingAttribute</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void addMissingAttribute(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">2</span></td>
+ <td class="reportText"><span class="text"><a href="#src_27">addMissingChild</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void addMissingChild(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_34">getMessage</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getMessage()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">4</span></td>
+ <td class="reportText"><span class="text"><a href="#src_30">getTagName</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getTagName()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Copyright (C) 2004, 2014 Christian Jaekl</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.xml;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ArrayList;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> MissingInfoException <span Class="keyword">extends</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> <span Class="keyword">static</span> <span Class="keyword">final</span> <span Class="keyword">long</span> serialVersionUID = 1L;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_tagName;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ArrayList&#60;String&#62; m_missingAttributes;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ArrayList&#60;String&#62; m_missingChildTags;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> MissingInfoException(String tagName) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;16<a name="src_16"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_tagName = tagName;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_missingAttributes = <span Class="keyword">new</span> ArrayList&#60;String&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_missingChildTags = <span Class="keyword">new</span> ArrayList&#60;String&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> addMissingAttribute(String name) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;23<a name="src_23"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_missingAttributes.add(name);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> addMissingChild(String name) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;27<a name="src_27"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_missingChildTags.add(name);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;30<a name="src_30"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getTagName() { <span Class="keyword">return</span> m_tagName; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getMessage() {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34<a name="src_34"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               StringBuilder sb = <span Class="keyword">new</span> StringBuilder();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               sb.append(<span Class="string">"Tag:  &#92;&#34"</span> + getTagName() + <span Class="string">"&#92;&#34"</span>);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">for</span> (String attr : m_missingAttributes) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;39</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       sb.append(<span Class="string">"\n  Attribute:  &#92;&#34"</span> + attr + <span Class="string">"&#92;&#34"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;41</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;42</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">for</span> (String child : m_missingChildTags) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;43</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       sb.append(<span Class="string">"\n  Child tag:  &#92;&#34"</span> + child + <span Class="string">"&#92;&#34"</span>);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;45</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> sb.toString();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;46</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/xml/ParseHandler.html b/report/net/jaekl/qd/xml/ParseHandler.html
new file mode 100644 (file)
index 0000000..f104550
--- /dev/null
@@ -0,0 +1,781 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/xml/ParseHandler.html" target="_top">Frames</a>
+<a href="ParseHandler.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.ParseHandler</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>75</b>%(9/12)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  75"></td><td class="percentUnCovered" width="25.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>80</b>%(24/30)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  80"></td><td class="percentUnCovered" width="20.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>100</b>%(12/12)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width=" 100"></td><td class="percentUnCovered" width="0.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>79</b>%(33/42)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  79"></td><td class="percentUnCovered" width="21.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">12</span></td>
+ <td class="reportText"><span class="text"><a href="#src_16">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(net.jaekl.qd.xml.ParseResult)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">204</span></td>
+ <td class="reportText"><span class="text"><a href="#src_24">characters</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void characters(char[],int,int)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">12</span></td>
+ <td class="reportText"><span class="text"><a href="#src_77">endDocument</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endDocument()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">235</span></td>
+ <td class="reportText"><span class="text"><a href="#src_40">endElement</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endElement(java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">48</span></td>
+ <td class="reportText"><span class="text"><a href="#src_86">endPrefixMapping</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void endPrefixMapping(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_93">ignorableWhitespace</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void ignorableWhitespace(char[],int,int)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_100">processingInstruction</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void processingInstruction(java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">12</span></td>
+ <td class="reportText"><span class="text"><a href="#src_105">setDocumentLocator</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void setDocumentLocator(org.xml.sax.Locator)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_110">skippedEntity</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void skippedEntity(java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">12</span></td>
+ <td class="reportText"><span class="text"><a href="#src_115">startDocument</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void startDocument()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">235</span></td>
+ <td class="reportText"><span class="text"><a href="#src_64">startElement</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void startElement(java.lang.String,java.lang.String,java.lang.String,org.xml.sax.Attributes)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">48</span></td>
+ <td class="reportText"><span class="text"><a href="#src_122">startPrefixMapping</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void startPrefixMapping(java.lang.String,java.lang.String)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Copyright (C) 2004, 2014 Christian Jaekl</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.xml;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Stack;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.Attributes;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.ContentHandler;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.Locator;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.SAXException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> ParseHandler <span Class="keyword">implements</span> ContentHandler</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       Stack&#60;ParseResult&#62; m_stack;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;16<a name="src_16"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> ParseHandler(ParseResult root) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_stack = <span Class="keyword">new</span> Stack&#60;ParseResult&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_stack.push(root);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;19</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> characters(<span Class="keyword">char</span>[] ch, <span Class="keyword">int</span> start, <span Class="keyword">int</span> length) <span Class="keyword">throws</span> SAXException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;24<a name="src_24"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (m_stack.isEmpty()) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;25</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;29</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_stack.peek().characters(ch, start, length);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;31</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (XmlParseException xpe) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;32</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> SAXException(xpe);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endElement(String uri, String localName, String qName) <span Class="keyword">throws</span> SAXException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40<a name="src_40"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (m_stack.isEmpty()) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;41</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">return</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;43</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;44</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">boolean</span> pop = m_stack.peek().endElement(uri, localName, qName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (pop) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;46</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_stack.pop();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;47</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">if</span> (m_stack.isEmpty()) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;49</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                                       <span Class="keyword">return</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;50</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;51</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;52</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_stack.peek().endExternal(uri, localName, qName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;54</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;55</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (XmlParseException xpe) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;56</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> SAXException(xpe);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;57</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;58</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;61</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> startElement(String uri, String localName, String qName, Attributes attributes) <span Class="keyword">throws</span> SAXException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;64<a name="src_64"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ParseResult current = m_stack.peek();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;65</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ParseResult next = current.startElement(uri, localName, qName, attributes);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;66</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (next != current) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;67</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_stack.push(next);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;68</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;69</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;70</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">catch</span> (XmlParseException xpe) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> SAXException(xpe);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;72</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;73</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;75</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endDocument() <span Class="keyword">throws</span> SAXException {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;77<a name="src_77"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (! m_stack.isEmpty()) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;78</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       String missingTag = m_stack.peek().getTagName();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;79</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> SAXException(<span Class="keyword">new</span> MissingInfoException(missingTag));</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;80</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;81</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;82</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;83</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;84</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> endPrefixMapping(String prefix) <span Class="keyword">throws</span> SAXException {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;85</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;86<a name="src_86"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;87</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;88</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;89</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> ignorableWhitespace(<span Class="keyword">char</span>[] ch, <span Class="keyword">int</span> start, <span Class="keyword">int</span> length)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;90</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">throws</span> SAXException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;91</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;92</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;93<a name="src_93"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;94</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;95</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;96</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> processingInstruction(String target, String data)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;97</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">throws</span> SAXException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;98</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;99</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;100<a name="src_100"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;101</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;102</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;103</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> setDocumentLocator(Locator locator) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;104</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;105<a name="src_105"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;106</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;107</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;108</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> skippedEntity(String name) <span Class="keyword">throws</span> SAXException {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;109</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;110<a name="src_110"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;111</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;112</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;113</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> startDocument() <span Class="keyword">throws</span> SAXException {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;114</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;115<a name="src_115"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;116</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;117</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @Override</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;118</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> startPrefixMapping(String prefix, String uri)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;119</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">throws</span> SAXException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;120</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;121</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;122<a name="src_122"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;123</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/xml/ParseResult.html b/report/net/jaekl/qd/xml/ParseResult.html
new file mode 100644 (file)
index 0000000..c96b93a
--- /dev/null
@@ -0,0 +1,978 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/xml/ParseResult.html" target="_top">Frames</a>
+<a href="ParseResult.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.ParseResult</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>89</b>%(8/9)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  89"></td><td class="percentUnCovered" width="11.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>81</b>%(38/47)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  81"></td><td class="percentUnCovered" width="19.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>74</b>%(25/34)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  74"></td><td class="percentUnCovered" width="26.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>91</b>%(60/66)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  91"></td><td class="percentUnCovered" width="9.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_19">&lt;clinit&gt;</a></span></td>
+ <td class="reportText"><span class="text">[static]</span></td>
+ <td class="reportText"><span class="text">void &lt;clinit&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">45</span></td>
+ <td class="reportText"><span class="text"><a href="#src_32">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.String,java.lang.String[],java.lang.Object[][])</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">195</span></td>
+ <td class="reportText"><span class="text"><a href="#src_61">characters</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void characters(char[],int,int)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">20</span></td>
+ <td class="reportText"><span class="text"><a href="#src_65">collectParsedChildren</a></span></td>
+ <td class="reportText"><span class="text">[protected]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.ParseResult[] collectParsedChildren(java.lang.Class)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">216</span></td>
+ <td class="reportText"><span class="text"><a href="#src_82">endElement</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">boolean endElement(java.lang.String,java.lang.String,java.lang.String)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">1</span></td>
+ <td class="reportText"><span class="text"><a href="#src_56">getTagName</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">java.lang.String getTagName()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_57">haveSeenMyTag</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">boolean haveSeenMyTag()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">255</span></td>
+ <td class="reportText"><span class="text"><a href="#src_116">startElement</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.ParseResult startElement(java.lang.String,java.lang.String,java.lang.String,org.xml.sax.Attributes)</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">31</span></td>
+ <td class="reportText"><span class="text"><a href="#src_164">validate</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void validate()</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Copyright (C) 2004, 2014 Christian Jaekl</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Abstract class representing the result of parsing an XML Element.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// A class derived from this one will know how to parse a subtree inside an XML file, and </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// will contain the result of that parse within itself when the parse has completed.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">//</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="comment">// Note that this code will need to be augmented and fixed if XML namespace support is desired.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;9</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.xml;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.ArrayList;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.HashMap;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.HashSet;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;14</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Iterator;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> java.util.Stack;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> org.xml.sax.Attributes;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;18</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;19<a name="src_19"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">abstract</span> <span Class="keyword">class</span> ParseResult</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;20</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;21</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       Stack&#60;String&#62; m_current;                                                                        <span Class="comment">// Name of the element that we're currently inside</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;22</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       StringBuilder m_chars;                                                                          <span Class="comment">// character content of m_current.peek()</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;23</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       ArrayList&#60;ParseResult&#62; m_childParsers;                                          <span Class="comment">// Set of all child parsers</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;24</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">boolean</span> m_haveSeenMyTag;                                                                   <span Class="comment">// Have I encountered my own (root) tag yet?</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;25</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;26</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       String m_tagName;                                                                                       <span Class="comment">// Name of the (root) element tag that I'm parsing</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;27</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       HashSet&#60;String&#62; m_internal;                                                                     <span Class="comment">// Tags that we will store as members of this class instance</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;28</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       HashMap&#60;String,Class&#60;? <span Class="keyword">extends</span> ParseResult&#62;&#62; m_external;   <span Class="comment">// Tags that we will store as child ParseResult-derived objects</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;29</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;30</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       @SuppressWarnings(<span Class="string">"unchecked"</span>)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;31</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> ParseResult(String tagName, String[] internalMemberTags, Object[][] externalParserTags)</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;32<a name="src_32"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;33</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_current = <span Class="keyword">new</span> Stack&#60;String&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;34</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_chars = <span Class="keyword">new</span> StringBuilder();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;35</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_childParsers = <span Class="keyword">new</span> ArrayList&#60;ParseResult&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;36</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_haveSeenMyTag = <span Class="keyword">false</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;37</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;38</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_tagName = tagName;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;39</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_internal = <span Class="keyword">new</span> HashSet&#60;String&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;40</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_external = <span Class="keyword">new</span> HashMap&#60;String, Class&#60;? <span Class="keyword">extends</span> ParseResult&#62;&#62;();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;41</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;42</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">for</span> (String internalTag : internalMemberTags) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;43</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_internal.add(internalTag);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;44</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;45</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;46</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">for</span> (<span Class="keyword">int</span> idx = 0; idx &#60; externalParserTags.length; ++idx) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;47</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       String externalTag = (String)externalParserTags[idx][0];</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;48</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       Class&#60;? <span Class="keyword">extends</span> ParseResult&#62;  parserClass = (Class&#60;? <span Class="keyword">extends</span> ParseResult&#62;)externalParserTags[idx][1];</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;49</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_external.put(externalTag, parserClass);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;50</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;51</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;52</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;53</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">abstract</span> <span Class="keyword">void</span> endContents(String uri, String localName, String qName, String chars) <span Class="keyword">throws</span> XmlParseException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;54</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">abstract</span> <span Class="keyword">void</span> endExternal(String uri, String localName, String qName) <span Class="keyword">throws</span> XmlParseException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;55</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;56<a name="src_56"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> String getTagName() { <span Class="keyword">return</span> m_tagName; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;57<a name="src_57"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">boolean</span> haveSeenMyTag() { <span Class="keyword">return</span> m_haveSeenMyTag; }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;58</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;59</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> characters(<span Class="keyword">char</span>[] ch, <span Class="keyword">int</span> start, <span Class="keyword">int</span> length) <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;60</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;61<a name="src_61"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_chars.append(ch, start, length);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;62</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;63</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;64</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">protected</span> ParseResult[] collectParsedChildren(Class&#60;? <span Class="keyword">extends</span> ParseResult&#62; cls) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;65<a name="src_65"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               ArrayList&#60;ParseResult&#62; collection = <span Class="keyword">new</span> ArrayList&#60;ParseResult&#62;();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;66</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               Iterator&#60;ParseResult&#62; iter = m_childParsers.iterator();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;67</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">while</span> (iter.hasNext()) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;68</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       ParseResult pr = iter.next();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;69</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (pr.getClass().isAssignableFrom(cls)) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;70</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               collection.add(pr);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;71</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               iter.remove();</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;72</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;73</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;74</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;75</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               ParseResult[] result = <span Class="keyword">new</span> ParseResult[collection.size()];</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;76</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> collection.toArray(result);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;77</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;78</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;79</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// returns true if this ParseResult's context has ended with this endElement() call</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;80</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">boolean</span> endElement(String uri, String localName, String qName) <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;81</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;82<a name="src_82"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">assert</span> (<span Class="keyword">null</span> != localName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;83</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;84</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">boolean</span> isInternal = m_internal.contains(localName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;85</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;86</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (! m_haveSeenMyTag) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;87</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// We're in some unrecognised prologue.  Ignore it and move on.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;88</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> <span Class="keyword">false</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;89</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;90</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;91</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (m_tagName.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;92</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       validate();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;93</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> <span Class="keyword">true</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;94</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;95</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;96</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (!isInternal) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;97</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// Unrecognized tag.  Ignore it.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;98</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> <span Class="keyword">false</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;99</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;100</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;101</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String tag = m_current.pop();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;102</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> ( ! tag.equals(localName) ) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;103</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;Branch:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throw</span> <span Class="keyword">new</span> MismatchedTagsException(tag, localName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;104</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;105</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;106</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               String chars = m_chars.toString();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;107</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               endContents(uri, localName, qName, chars);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;108</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;109</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> <span Class="keyword">false</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;110</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;111</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;112</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="comment">// returns either itself, or a new ParseResult-derived object, whichever should handle parsing the inside of this element</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;113</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> ParseResult startElement(String uri, String localName, String qName, Attributes attributes) </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;114</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;115</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;116<a name="src_116"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">assert</span> (<span Class="keyword">null</span> != localName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;117</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;118</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/2&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               m_chars.setLength(0);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;119</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;120</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (! m_haveSeenMyTag) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;121</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="comment">// Have we opened our own (root) tag yet?</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;122</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;123</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">if</span> (m_tagName.equals(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;124</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_haveSeenMyTag = <span Class="keyword">true</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;125</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">return</span> <span Class="keyword">this</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;126</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;127</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">else</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;128</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="comment">// One of two things has happened here.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;129</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="comment">// Either (a) we've got some sort of wrapper here, and have not yet reach our own tag, </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;130</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="comment">//     or (b) we're parsing XML that doesn't match expectations.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;131</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="comment">// In either case, we're going to ignore this tag, and scan forward looking for our own root.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;132</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">return</span> <span Class="keyword">this</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;133</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;134</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;135</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;136</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (m_internal.contains(localName)) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;137</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       m_current.push(localName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;138</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">return</span> <span Class="keyword">this</span>;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;139</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;140</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;141</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               Class&#60;? <span Class="keyword">extends</span> ParseResult&#62; parserClass = m_external.get(localName);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;142</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">if</span> (<span Class="keyword">null</span> != parserClass) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;143</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">try</span> {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;144</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               ParseResult childParser = (ParseResult) parserClass.newInstance();</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;145</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               m_childParsers.add(childParser);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;146</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">return</span> childParser.startElement(uri, localName, qName, attributes);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;147</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;148</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">catch</span> (IllegalAccessException iae) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;149</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">throw</span> <span Class="keyword">new</span> XmlParseException(iae);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;150</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;151</td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       <span Class="keyword">catch</span> (InstantiationException ie) {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;152</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                               <span Class="keyword">throw</span> <span Class="keyword">new</span> XmlParseException(ie);</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;153</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;                       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;154</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;155</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;156</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// Not a recognized tag.  Ignore it, rather than complaining. </span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;157</td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;Branch:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">return</span> <span Class="keyword">this</span>;</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;158</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;159</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;160</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> <span Class="keyword">void</span> validate() <span Class="keyword">throws</span> XmlParseException</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;161</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;162</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// Default implementation is a no-op.</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;163</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// Override if you want to validate on endElement()</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;164<a name="src_164"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;165</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;166</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/xml/XmlParseException.html b/report/net/jaekl/qd/xml/XmlParseException.html
new file mode 100644 (file)
index 0000000..94ba0aa
--- /dev/null
@@ -0,0 +1,191 @@
+<html>
+<head>
+<title>tests coverage</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+<script type="text/javascript">
+  targetPage = "" + window.location.search;
+  if (targetPage != "" && targetPage != "undefined")
+    targetPage = targetPage.substring(1);
+  if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
+    targetPage = "undefined";
+  function validURL(url) {
+    var pos = url.indexOf(".html");
+    if (pos == -1 || pos != url.length - 5)
+      return false;
+    var allowNumber = false;
+    var allowSep = false;
+    var seenDot = false;
+    for (var i = 0; i < url.length - 5; i++) {
+      var ch = url.charAt(i);
+      if ('a' <= ch && ch <= 'z' ||
+          'A' <= ch && ch <= 'Z' ||
+          ch == '$' ||
+          ch == '_') {
+            allowNumber = true;
+            allowSep = true;
+      } else if ('0' <= ch && ch <= '9' ||
+                 ch == '-') {
+                   if (!allowNumber)
+                     return false;
+      } else if (ch == '/' || ch == '.') {
+        if (!allowSep)
+          return false;
+        allowNumber = false;
+        allowSep = false;
+        if (ch == '.')
+          seenDot = true;
+        if (ch == '/' && seenDot)
+          return false;
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+  function loadFrames() {
+    if (targetPage != "" && targetPage != "undefined")
+      top.classFrame.location = top.targetPage;
+  }
+</script>
+</head>
+<body>
+<table>
+<tr>
+<td>
+<a href="../../../../index.html?net/jaekl/qd/xml/XmlParseException.html" target="_top">Frames</a>
+<a href="XmlParseException.html" target="_top">No Frames</a>
+</td>
+</tr>
+</table>
+<p>
+ <table cellspacing="0" cellpadding="0"class="report">
+ <tr class="report">
+ <th class="report">&nbsp;</th>
+ <th class="report">%method</th>
+ <th class="report">%block</th>
+ <th class="report">%branch</th>
+ <th class="report">%line</th>
+ </tr>
+ <tr class="report">
+ <td class="reportText"><span class="text">net.jaekl.qd.xml.XmlParseException</span></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>50</b>%(1/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  50"></td><td class="percentUnCovered" width="50.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>50</b>%(1/2)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  50"></td><td class="percentUnCovered" width="50.0"></td></tr></table></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>-</b>%</span></td></tr></table></td>
+ <td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>50</b>%(2/4)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  50"></td><td class="percentUnCovered" width="50.0"></td></tr></table></td></tr></table></td>
+ </tr>
+ </table>
+ <p>
+ <p>
+ <table cellspacing="0" cellpadding="0"class="report" id="mcoverage">
+ <tr class="report">
+ <th class="report">hit count</th>
+ <th class="report">method  name</th>
+ <th class="report">method modifiers</th>
+ <th class="report">method signature</th>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_covered"><span class="text">3</span></td>
+ <td class="reportText"><span class="text"><a href="#src_9">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;()</span></td>
+ </tr>
+ <tr class="report">
+ <td class="reportValue_uncovered"><span class="text">0</span></td>
+ <td class="reportText"><span class="text"><a href="#src_14">&lt;init&gt;</a></span></td>
+ <td class="reportText"><span class="text">[public]</span></td>
+ <td class="reportText"><span class="text">void &lt;init&gt;(java.lang.Throwable)</span></td>
+ </tr>
+ </table>
+ <p>
+ <table cellspacing="0" cellpadding="0" class="src">
+ <tr>
+ <td class="numLine">&nbsp;1</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">package</span> net.jaekl.qd.xml;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;2</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;3</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">import</span> net.jaekl.qd.QDException;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;4</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;5</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;<span Class="keyword">public</span> <span Class="keyword">class</span> XmlParseException <span Class="keyword">extends</span> QDException </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;6</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;{</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;7</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">private</span> <span Class="keyword">static</span> <span Class="keyword">final</span> <span Class="keyword">long</span> serialVersionUID = 1L;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;8</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;9<a name="src_9"></a></td>
+ <td class="nbHitsCovered">&nbsp;Block:&nbsp;1/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> XmlParseException() {</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;10</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="comment">// no-op</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineCover">&nbsp;11</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;12</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       </pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;13</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       <span Class="keyword">public</span> XmlParseException(Throwable t) {</pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;14<a name="src_14"></a></td>
+ <td class="nbHitsUncovered">&nbsp;Block:&nbsp;0/1&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;               <span Class="keyword">super</span>(t);</span></pre></td>
+ </tr>
+ <tr>
+ <td class="numLineUnCover">&nbsp;15</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;       }</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;16</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;</pre></td>
+ </tr>
+ <tr>
+ <td class="numLine">&nbsp;17</td>
+ <td class="nbHits">&nbsp;</td>
+ <td class="src"><pre class="src">&nbsp;}</pre></td>
+ </tr>
+ </table>
+<p>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/xml/package-frame.html b/report/net/jaekl/qd/xml/package-frame.html
new file mode 100644 (file)
index 0000000..b2f92f2
--- /dev/null
@@ -0,0 +1,22 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+</head>
+<body>
+<a href="package-summary.html" target="classFrame">net.jaekl.qd.xml</a> <span class="text_italic">&nbsp;  74% (23/31)</span><br>
+<p>
+<span class="title">All classes</span>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="./MismatchedTagsException.html" target="classFrame">MismatchedTagsException</a><span class="text_italic">&nbsp;   0% (0/3)</span><br>
+<a href="./MissingInfoException.html" target="classFrame">MissingInfoException</a><span class="text_italic">&nbsp; 100% (5/5)</span><br>
+<a href="./ParseHandler.html" target="classFrame">ParseHandler</a><span class="text_italic">&nbsp;  75% (9/12)</span><br>
+<a href="./ParseResult.html" target="classFrame">ParseResult</a><span class="text_italic">&nbsp;  89% (8/9)</span><br>
+<a href="./XmlParseException.html" target="classFrame">XmlParseException</a><span class="text_italic">&nbsp;  50% (1/2)</span><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/net/jaekl/qd/xml/package-summary.html b/report/net/jaekl/qd/xml/package-summary.html
new file mode 100644 (file)
index 0000000..492a571
--- /dev/null
@@ -0,0 +1,76 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="../../../../style.css" title="Style">
+<script type="text/javascript" src="../../../../sorttable.js"></script>
+</head>
+<body>
+<span class="title">Coverage report </span>
+<p>
+<table class="report" cellpadding="0" cellspacing="0">
+<tr class="report">
+<th class="report">&nbsp;</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText">net.jaekl.qd.xml</td>
+<td class="reportValue">5</td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>74</b>%(23/31)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  74"></td><td class="percentUnCovered" width="26.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>80</b>%(74/93)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  80"></td><td class="percentUnCovered" width="20.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>82</b>%(41/50)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  82"></td><td class="percentUnCovered" width="18.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>83</b>%(114/137)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  83"></td><td class="percentUnCovered" width="17.0"></td></tr></table></td></tr></table></td>
+</tr>
+</table>
+<p>
+<span class="title2">Classes</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="classes">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="MismatchedTagsException.html">MismatchedTagsException</a></td>
+<td class="reportValue"><b>   0</b>% (0/3)</td>
+<td class="reportValue"><b>   0</b>% (0/3)</td>
+<td class="reportValue"> -</td>
+<td class="reportValue"><b>   0</b>% (0/6)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="MissingInfoException.html">MissingInfoException</a></td>
+<td class="reportValue"><b> 100</b>% (5/5)</td>
+<td class="reportValue"><b> 100</b>% (11/11)</td>
+<td class="reportValue"><b> 100</b>% (4/4)</td>
+<td class="reportValue"><b> 100</b>% (19/19)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="ParseHandler.html">ParseHandler</a></td>
+<td class="reportValue"><b>  75</b>% (9/12)</td>
+<td class="reportValue"><b>  80</b>% (24/30)</td>
+<td class="reportValue"><b> 100</b>% (12/12)</td>
+<td class="reportValue"><b>  79</b>% (33/42)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="ParseResult.html">ParseResult</a></td>
+<td class="reportValue"><b>  89</b>% (8/9)</td>
+<td class="reportValue"><b>  81</b>% (38/47)</td>
+<td class="reportValue"><b>  74</b>% (25/34)</td>
+<td class="reportValue"><b>  91</b>% (60/66)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="XmlParseException.html">XmlParseException</a></td>
+<td class="reportValue"><b>  50</b>% (1/2)</td>
+<td class="reportValue"><b>  50</b>% (1/2)</td>
+<td class="reportValue"> -</td>
+<td class="reportValue"><b>  50</b>% (2/4)</td>
+</tr>
+</table>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/overview-frame.html b/report/overview-frame.html
new file mode 100644 (file)
index 0000000..3c499f1
--- /dev/null
@@ -0,0 +1,33 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="style.css" title="Style">
+</head>
+<body>
+<span class="title">Coverage report</span><br>
+<table>
+<tr>
+<td nowrap="nowrap">
+<a href="overview-summary.html" target="classFrame">Overview</a><br>
+<a href="allclasses-frame.html" target="packageFrame">All classes</a>
+</td>
+</tr>
+</table>
+<p>
+<table>
+<tr>
+<td nowrap="nowrap"><span class="title2">All packages</span></td>
+</tr>
+<tr>
+<td nowrap="nowrap">
+<a href="net/jaekl/frank/package-frame.html" target="packageFrame" onClick="parent.frames[2].location.href='net/jaekl/frank/package-summary.html';">net.jaekl.frank</a><br>
+<a href="net/jaekl/frank/octranspo/package-frame.html" target="packageFrame" onClick="parent.frames[2].location.href='net/jaekl/frank/octranspo/package-summary.html';">net.jaekl.frank.octranspo</a><br>
+<a href="net/jaekl/qd/package-frame.html" target="packageFrame" onClick="parent.frames[2].location.href='net/jaekl/qd/package-summary.html';">net.jaekl.qd</a><br>
+<a href="net/jaekl/qd/http/package-frame.html" target="packageFrame" onClick="parent.frames[2].location.href='net/jaekl/qd/http/package-summary.html';">net.jaekl.qd.http</a><br>
+<a href="net/jaekl/qd/util/package-frame.html" target="packageFrame" onClick="parent.frames[2].location.href='net/jaekl/qd/util/package-summary.html';">net.jaekl.qd.util</a><br>
+<a href="net/jaekl/qd/xml/package-frame.html" target="packageFrame" onClick="parent.frames[2].location.href='net/jaekl/qd/xml/package-summary.html';">net.jaekl.qd.xml</a><br>
+</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/report/overview-summary.html b/report/overview-summary.html
new file mode 100644 (file)
index 0000000..b3792ff
--- /dev/null
@@ -0,0 +1,90 @@
+<html>
+<head>
+<title>coverage report</title>
+<link rel ="stylesheet" type="text/css" href="style.css" title="Style">
+<script type="text/javascript" src="sorttable.js"></script>
+</head>
+<body>
+<span class="title">Coverage report </span>
+<p>
+<table class="report" cellpadding="0" cellspacing="0">
+<tr class="report">
+<th class="report">&nbsp;</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText">Overall statistics</td>
+<td class="reportValue">21</td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>86</b>%(95/111)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  86"></td><td class="percentUnCovered" width="14.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>77</b>%(253/329)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  77"></td><td class="percentUnCovered" width="23.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>72</b>%(127/176)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  72"></td><td class="percentUnCovered" width="28.0"></td></tr></table></td></tr></table></td>
+<td class="reportValue"><table class="percentGraph" cellpadding="0" cellspacing="0" align="right"><tr><td><span class="text"><b>82</b>%(443/539)</span></td><td><table class="percentGraph" cellpadding="0" cellspacing="0"><tr><td class="percentCovered" width="  82"></td><td class="percentUnCovered" width="18.0"></td></tr></table></td></tr></table></td>
+</tr>
+</table>
+<p>
+<span class="title2">Packages</span><br>
+<table class="report" cellpadding="0" cellspacing="0" id="packages">
+<tr class="report">
+<th class="report">Name</th>
+<th class="report">#classes</th>
+<th class="report">%method</th>
+<th class="report">%block</th>
+<th class="report">%branch</th>
+<th class="report">%line</th>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="net/jaekl/frank/package-summary.html">net.jaekl.frank</a></td>
+<td class="reportValue">4</td>
+<td class="reportValue"><b>  83</b>% (15/18)</td>
+<td class="reportValue"><b>  64</b>% (38/59)</td>
+<td class="reportValue"><b>  57</b>% (16/28)</td>
+<td class="reportValue"><b>  77</b>% (114/148)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="net/jaekl/frank/octranspo/package-summary.html">net.jaekl.frank.octranspo</a></td>
+<td class="reportValue">6</td>
+<td class="reportValue"><b>  98</b>% (43/44)</td>
+<td class="reportValue"><b>  84</b>% (97/115)</td>
+<td class="reportValue"><b>  70</b>% (49/70)</td>
+<td class="reportValue"><b>  94</b>% (150/159)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="net/jaekl/qd/package-summary.html">net.jaekl.qd</a></td>
+<td class="reportValue">2</td>
+<td class="reportValue"><b> 100</b>% (5/5)</td>
+<td class="reportValue"><b>  90</b>% (9/10)</td>
+<td class="reportValue"><b>  75</b>% (3/4)</td>
+<td class="reportValue"><b> 100</b>% (15/15)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="net/jaekl/qd/http/package-summary.html">net.jaekl.qd.http</a></td>
+<td class="reportValue">1</td>
+<td class="reportValue"><b>  83</b>% (5/6)</td>
+<td class="reportValue"><b>  50</b>% (14/28)</td>
+<td class="reportValue"><b>  40</b>% (4/10)</td>
+<td class="reportValue"><b>  53</b>% (31/58)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="net/jaekl/qd/util/package-summary.html">net.jaekl.qd.util</a></td>
+<td class="reportValue">3</td>
+<td class="reportValue"><b>  57</b>% (4/7)</td>
+<td class="reportValue"><b>  88</b>% (21/24)</td>
+<td class="reportValue"><b> 100</b>% (14/14)</td>
+<td class="reportValue"><b>  86</b>% (19/22)</td>
+</tr>
+<tr class="report">
+<td class="reportText"><a href="net/jaekl/qd/xml/package-summary.html">net.jaekl.qd.xml</a></td>
+<td class="reportValue">5</td>
+<td class="reportValue"><b>  74</b>% (23/31)</td>
+<td class="reportValue"><b>  80</b>% (74/93)</td>
+<td class="reportValue"><b>  82</b>% (41/50)</td>
+<td class="reportValue"><b>  83</b>% (114/137)</td>
+</tr>
+</table>
+<p><table cellpadding="0" cellspacing="0" class="report">  <tr class="report">    <td class="reportText"><span class="text">    Report generated 11/12/14 11:31 PM    </span></td>  </tr></table>
+</body>
+</html>
diff --git a/report/sorttable.js b/report/sorttable.js
new file mode 100644 (file)
index 0000000..6d2bf5f
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+addEvent(window, "load", sortables_init);
+
+var SORT_COLUMN_INDEX;
+
+function sortables_init() {
+    // Find all tables with class sortable and make them sortable
+    if (!document.getElementsByTagName) return;
+    tbls = document.getElementsByTagName("table");
+    for (ti=0;ti<tbls.length;ti++) {
+        thisTbl = tbls[ti];
+        if (((' '+thisTbl.className+' ').indexOf("report") != -1) && (thisTbl.id)) {
+            //initTable(thisTbl.id);
+            ts_makeSortable(thisTbl);
+        }
+    }
+}
+
+function ts_makeSortable(table) {
+    if (table.rows && table.rows.length > 0) {
+        var firstRow = table.rows[0];
+    }
+    if (!firstRow) return;
+    
+    // We have a first row: assume it's the header, and make its contents clickable links
+    for (var i=0;i<firstRow.cells.length;i++) {
+        var cell = firstRow.cells[i];
+        var txt = ts_getInnerText(cell);
+        cell.innerHTML = '<a href="#" class="sortheader" '+ 
+        'onclick="ts_resortTable(this, '+i+');return false;">' + 
+        txt+'<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';
+    }
+}
+
+function ts_getInnerText(el) {
+       if (typeof el == "string") return el;
+       if (typeof el == "undefined") { return el };
+       if (el.innerText) return el.innerText;  //Not needed but it is faster
+       var str = "";
+       
+       var cs = el.childNodes;
+       var l = cs.length;
+       for (var i = 0; i < l; i++) {
+               switch (cs[i].nodeType) {
+                       case 1: //ELEMENT_NODE
+                               str += ts_getInnerText(cs[i]);
+                               break;
+                       case 3: //TEXT_NODE
+                               str += cs[i].nodeValue;
+                               break;
+               }
+       }
+       return str;
+}
+
+function ts_resortTable(lnk,clid) {
+    // get the span
+    var span;
+    for (var ci=0;ci<lnk.childNodes.length;ci++) {
+        if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
+    }
+    var spantext = ts_getInnerText(span);
+    var td = lnk.parentNode;
+    var column = clid || td.cellIndex;
+    var table = getParent(td,'TABLE');
+    
+    // Work out a type for the column
+    if (table.rows.length <= 1) return;
+    var itm = ts_getInnerText(table.rows[1].cells[column]);
+    sortfn = ts_sort_caseinsensitive;
+    if (itm.match(/%/)) sortfn = ts_sort_percentage;
+    if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn = ts_sort_date;
+    if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = ts_sort_date;
+    if (itm.match(/^[£$]/)) sortfn = ts_sort_currency;
+    if (itm.match(/^[\d\.]+$/)) sortfn = ts_sort_numeric;
+    SORT_COLUMN_INDEX = column;
+    var firstRow = new Array();
+    var newRows = new Array();
+    for (i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }
+    for (j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }
+
+    newRows.sort(sortfn);
+
+    if (span.getAttribute("sortdir") == 'down') {
+        ARROW = '&nbsp;&nbsp;&uarr;';
+        newRows.reverse();
+        span.setAttribute('sortdir','up');
+    } else {
+        ARROW = '&nbsp;&nbsp;&darr;';
+        span.setAttribute('sortdir','down');
+    }
+    
+    // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
+    // don't do sortbottom rows
+    for (i=0;i<newRows.length;i++) { if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) table.tBodies[0].appendChild(newRows[i]);}
+    // do sortbottom rows only
+    for (i=0;i<newRows.length;i++) { if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) table.tBodies[0].appendChild(newRows[i]);}
+    
+    // Delete any other arrows there may be showing
+    var allspans = document.getElementsByTagName("span");
+    for (var ci=0;ci<allspans.length;ci++) {
+        if (allspans[ci].className == 'sortarrow') {
+            if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
+                allspans[ci].innerHTML = '&nbsp;&nbsp;&nbsp;';
+            }
+        }
+    }
+        
+    span.innerHTML = ARROW;
+}
+
+function getParent(el, pTagName) {
+       if (el == null) return null;
+       else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())        // Gecko bug, supposed to be uppercase
+               return el;
+       else
+               return getParent(el.parentNode, pTagName);
+}
+function ts_sort_date(a,b) {
+    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
+    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
+    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
+    if (aa.length == 10) {
+        dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
+    } else {
+        yr = aa.substr(6,2);
+        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
+        dt1 = yr+aa.substr(3,2)+aa.substr(0,2);
+    }
+    if (bb.length == 10) {
+        dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
+    } else {
+        yr = bb.substr(6,2);
+        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
+        dt2 = yr+bb.substr(3,2)+bb.substr(0,2);
+    }
+    if (dt1==dt2) return 0;
+    if (dt1<dt2) return -1;
+    return 1;
+}
+
+function ts_sort_currency(a,b) { 
+    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
+    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
+    return parseFloat(aa) - parseFloat(bb);
+}
+
+function ts_sort_numeric(a,b) { 
+    aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
+    if (isNaN(aa)) aa = 0;
+    bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
+    if (isNaN(bb)) bb = 0;
+    return aa-bb;
+}
+
+function ts_sort_percentage(a,b) { 
+
+    var s = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
+       var i = s.indexOf( "%" );
+    if (i != -1) {
+      s = s.substr( 0, i );
+    }
+    aa = parseFloat(s);
+    if (isNaN(aa)) aa = 0;
+   
+    var s = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
+       var i = s.indexOf( "%" );
+    if (i != -1) {
+      s = s.substr( 0, i );
+    }
+    bb = parseFloat(s);
+    if (isNaN(bb)) bb = 0;
+
+    return bb-aa;
+}
+
+function ts_sort_caseinsensitive(a,b) {
+    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
+    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
+    if (aa==bb) return 0;
+    if (aa<bb) return -1;
+    return 1;
+}
+
+function ts_sort_default(a,b) {
+    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
+    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
+    if (aa==bb) return 0;
+    if (aa<bb) return -1;
+    return 1;
+}
+
+
+function addEvent(elm, evType, fn, useCapture)
+// addEvent and removeEvent
+// cross-browser event handling for IE5+,  NS6 and Mozilla
+// By Scott Andrew
+{
+  if (elm.addEventListener){
+    elm.addEventListener(evType, fn, useCapture);
+    return true;
+  } else if (elm.attachEvent){
+    var r = elm.attachEvent("on"+evType, fn);
+    return r;
+  } else {
+    alert("Handler could not be removed");
+  }
+} 
diff --git a/report/style.css b/report/style.css
new file mode 100644 (file)
index 0000000..d5904cb
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+body {
+       font-family: verdana, arial, sans-serif
+       font-size: 12px;
+}
+
+a {
+       font-size: 12px;
+}
+
+table.src {
+       font-size: 12px;
+       border-left: #dcdcdc 1px solid;
+       border-right: #dcdcdc 1px solid;
+       border-bottom: #dcdcdc 1px solid;
+       border-top: #dcdcdc 1px solid;
+}
+
+table.report {
+       font-size: 12px !important;
+       border-collapse: collapse;
+       width: 100%;
+}
+
+tr.report {
+       border: #dcdcdc 1px solid;
+}
+
+table.percentGraph {
+       height: 10px;
+       width: 100px;
+}
+
+th.report {
+    background: #F0F0F0;
+       font-size: inherit !important;
+       font-weight: bold;
+       border: #dcdcdc 1px solid;
+       cursor:                 default;
+}
+
+
+th.report:hover {
+    background: #dcdcdc;
+}
+
+table.report a.sortheader {
+    color: black;
+    text-decoration: none;
+       display: block;
+}
+table.report span.sortarrow {
+    color: black;
+    text-decoration: none;
+}
+
+
+
+
+td.reportText {
+       font-size: inherit !important;
+       border: #dcdcdc 1px solid;
+}
+
+td.reportValue {
+       font-size: inherit !important;
+       border: #dcdcdc 1px solid;
+       text-align: right;
+}
+
+td.reportValue_covered {
+       font-size: inherit !important;
+       border: #dcdcdc 1px solid;
+       text-align: right;
+    background: #80ff80;
+}
+
+td.reportValue_uncovered {
+       font-size: inherit !important;
+       border: #dcdcdc 1px solid;
+       text-align: right;
+    background: #FF3030;
+}
+
+td.spacer {
+       border-left: #FF0000 0px none;
+       border-right: #FF0000 0px none;
+       height: 30px;
+       padding-top: 15px;
+}
+
+td.percentCovered {
+    background: #00FF00;
+       empty-cells: show;
+}
+
+td.percentUnCovered {
+    background: #FF0000;
+       empty-cells: show;
+}
+
+td.numLine {
+    background: #F0F0F0;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: right;
+}
+
+td.numLineCover {
+    background: #80ff80;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: right;
+}
+
+td.numLineUnCover {
+    background: #FF3030;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: right;
+}
+
+td.nbHits {
+    background: #F0F0F0;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: left;
+}
+
+td.nbHitsCovered {
+    background: #80ff80;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: left;
+}
+
+td.nbHitsUncovered {
+    background: #FF3030;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: left;
+}
+
+td.src {
+    width: 100%;
+}
+
+pre.src {
+    background: #ffffff;
+    margin-top: 0px;
+    margin-bottom: 0px;
+}
+
+span.srcUncovered {
+    background: #FF3030;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: right;
+}
+
+span.keyword {
+    color: #0000ff;
+}
+
+span.comment {
+    color: #008080;
+    font-style: italic;
+}
+
+span.string {
+    color: #000000;
+}
+
+span.title {
+    font-weight: bold;
+    font-size: 16px;
+}
+
+span.title2 {
+    font-weight: bold;
+    font-size: 14px;
+}
+span.text {
+       font-size: 12px;
+}
+
+span.text_italic {
+       font-size: 12px;
+    font-style: italic;
+}
diff --git a/result.xml b/result.xml
new file mode 100644 (file)
index 0000000..eddd21c
--- /dev/null
@@ -0,0 +1,1898 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<coverage
+        xmlns='http://java.sun.com/jcov/namespace'
+        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
+        xsi:schemaLocation='http://java.sun.com/jcov/namespace coverage.xsd'>
+
+       <head>
+               <property name='coverage.generator.args' val=''/>
+               <property name='coverage.generator.mode' val='BRANCH'/>
+               <property name='coverage.generator.internal' val='include'/>
+               <property name='coverage.generator.include' val=''/>
+               <property name='coverage.generator.exclude' val=''/>
+               <property name='coverage.generator.caller_include' val='.*'/>
+               <property name='coverage.generator.caller_exclude' val=''/>
+               <property name='coverage.created.date' val='2014-12-12'/>
+               <property name='coverage.created.time' val='04:31:01'/>
+               <property name='coverage.generator.fullversion' val='2.0os.beta-1 built: 09 November 2014'/>
+               <property name='coverage.generator.name' val='jcov'/>
+               <property name='coverage.generator.version' val='2.0'/>
+               <property name='coverage.spec.version' val='1.3'/>
+               <property name='java.runtime.version' val='1.7.0_65-b32'/>
+               <property name='java.version' val='1.7.0_65'/>
+               <property name='os.arch' val='amd64'/>
+               <property name='os.name' val='Linux'/>
+               <property name='os.version' val='3.2.0-4-amd64'/>
+               <property name='user.name' val='chris'/>
+               <property name='dynamic.collected' val='false'/>
+               <property name='id.count' val='393'/>
+       </head>
+       <package name="net.jaekl.frank">
+               <class name="FrankBundle" supername="java/lang/Object" checksum="3968860020" source="FrankBundle.java" flags=' public'>
+                       <meth name="getInst" vmsig="(Ljava/util/Locale;)Lnet/jaekl/frank/FrankBundle;" flags=' public static' access="9" length="68">
+                               <bl s="0" e="15">
+                                       <methenter s="0" e="15" id="0" count="11"/>
+                                       <br s="13" e="15">
+                                               <cond s="66" e="67" id="1" count="8" val="true"/>
+                                               <cond s="16" e="37" id="2" count="3" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="16" e="37">
+                                       <br s="35" e="37">
+                                               <cond s="47" e="60" id="3" count="0" val="true"/>
+                                               <cond s="38" e="46" id="4" count="3" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="38" e="46">
+                               </bl>
+                               <bl s="47" e="60">
+                                       <fall s="47" e="60" id="7" count="3"/>
+                                       <goto s="58" e="60">
+                                               <tg s="66" e="67" id="5" count="3"/>
+                                       </goto>
+                               </bl>
+                               <bl s="61" e="65">
+                                       <catch s="61" e="65" id="6" count="0"/>
+                                       <exit s="65" e="65" opcode="athrow"/>
+                               </bl>
+                               <bl s="66" e="67">
+                                       <exit s="67" e="67" opcode="areturn"/>
+                               </bl>
+                               <lt>0=31;11=32;16=33;22=34;33=35;38=36;47=38;56=39;66=41;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/util/Locale;)V" flags=' private' access="2" cons="true" length="18">
+                               <bl s="0" e="17">
+                                       <methenter s="0" e="17" id="8" count="3"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=44;4=45;17=46;</lt>
+                       </meth>
+                       <meth name="get" vmsig="(Ljava/lang/String;)Ljava/lang/String;" flags=' public' access="1" length="50">
+                               <bl s="0" e="7">
+                                       <methenter s="0" e="7" id="9" count="34"/>
+                                       <br s="5" e="7">
+                                               <cond s="17" e="19" id="10" count="0" val="true"/>
+                                               <cond s="8" e="16" id="11" count="34" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="8" e="16">
+                                       <exit s="16" e="16" opcode="areturn"/>
+                               </bl>
+                               <bl s="17" e="19">
+                                       <goto s="17" e="19">
+                                               <tg s="25" e="49" id="12" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="20" e="24">
+                                       <catch s="20" e="24" id="13" count="0"/>
+                               </bl>
+                               <bl s="25" e="49">
+                                       <fall s="25" e="49" id="14" count="0"/>
+                                       <exit s="49" e="49" opcode="areturn"/>
+                               </bl>
+                               <lt>0=50;8=51;17=58;20=54;21=56;25=59;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="11">
+                               <bl s="0" e="10">
+                                       <methenter s="0" e="10" id="15" count="1"/>
+                                       <exit s="10" e="10" opcode="return"/>
+                               </bl>
+                               <lt>0=26;</lt>
+                       </meth>
+               </class>
+               <class name="FrankException" supername="java/lang/Exception" checksum="1281835878" source="FrankException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/Throwable;)V" flags=' public' access="1" cons="true" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="16" count="0"/>
+                                       <exit s="5" e="5" opcode="return"/>
+                               </bl>
+                               <lt>0=9;5=10;</lt>
+                       </meth>
+               </class>
+               <class name="Schedule" supername="java/lang/Object" checksum="1001566032" source="Schedule.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/util/Locale;)V" flags=' public' access="1" cons="true" length="46">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="17" count="8"/>
+                                       <exit s="45" e="45" opcode="return"/>
+                               </bl>
+                               <lt>0=20;4=21;9=22;17=23;31=24;45=25;</lt>
+                       </meth>
+                       <meth name="trans" vmsig="(Ljava/lang/String;)Ljava/lang/String;" flags='' access="0" length="9">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="18" count="22"/>
+                                       <exit s="8" e="8" opcode="areturn"/>
+                               </bl>
+                               <lt>0=28;</lt>
+                       </meth>
+                       <meth name="mapUrl" vmsig="(DD)Ljava/lang/String;" flags='' access="0" length="34">
+                               <bl s="0" e="33">
+                                       <methenter s="0" e="33" id="19" count="6"/>
+                                       <exit s="33" e="33" opcode="areturn"/>
+                               </bl>
+                               <lt>0=32;</lt>
+                       </meth>
+                       <meth name="writeStyle" vmsig="(Ljava/io/PrintWriter;)V" flags='' access="0" length="43">
+                               <bl s="0" e="42">
+                                       <methenter s="0" e="42" id="20" count="14"/>
+                                       <exit s="42" e="42" opcode="return"/>
+                               </bl>
+                               <lt>0=36;6=37;12=38;18=39;24=40;30=41;36=42;42=43;</lt>
+                       </meth>
+                       <meth name="writeScript" vmsig="(Ljava/io/PrintWriter;Ljava/lang/String;I)V" flags='' access="0" length="235">
+                               <bl s="0" e="234">
+                                       <methenter s="0" e="234" id="21" count="2"/>
+                                       <exit s="234" e="234" opcode="return"/>
+                               </bl>
+                               <lt>0=47;8=48;16=50;22=51;28=52;56=53;62=54;68=55;74=56;113=57;141=58;147=59;153=60;159=61;165=62;171=63;177=64;210=65;216=66;222=67;228=68;234=70;</lt>
+                       </meth>
+                       <meth name="writeHeader" vmsig="(Ljava/io/PrintWriter;Ljava/lang/String;)V" flags='' access="0" length="52">
+                               <bl s="0" e="51">
+                                       <methenter s="0" e="51" id="22" count="11"/>
+                                       <exit s="51" e="51" opcode="return"/>
+                               </bl>
+                               <lt>0=73;6=74;12=75;40=76;45=77;51=78;</lt>
+                       </meth>
+                       <meth name="writePage" vmsig="(Ljava/io/PrintWriter;Lnet/jaekl/frank/octranspo/StopInfo;)V" flags='' access="0" length="698">
+                               <bl s="0" e="223">
+                                       <methenter s="0" e="223" id="23" count="2"/>
+                               </bl>
+                               <bl s="224" e="232">
+                                       <fall s="224" e="232" id="41" count="2"/>
+                                       <br s="230" e="232">
+                                               <cond s="602" e="697" id="24" count="2" val="true"/>
+                                               <cond s="233" e="243" id="25" count="2" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="233" e="243">
+                               </bl>
+                               <bl s="244" e="253">
+                                       <fall s="244" e="253" id="42" count="2"/>
+                                       <br s="251" e="253">
+                                               <cond s="596" e="601" id="26" count="2" val="true"/>
+                                               <cond s="254" e="274" id="27" count="4" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="254" e="274">
+                                       <br s="272" e="274">
+                                               <cond s="279" e="279" id="28" count="4" val="true"/>
+                                               <cond s="275" e="278" id="29" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="275" e="278">
+                                       <goto s="276" e="278">
+                                               <tg s="280" e="286" id="30" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="279" e="279">
+                               </bl>
+                               <bl s="280" e="286">
+                                       <fall s="280" e="286" id="43" count="4"/>
+                                       <br s="284" e="286">
+                                               <cond s="296" e="301" id="31" count="4" val="true"/>
+                                               <cond s="287" e="295" id="32" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="287" e="295">
+                                       <goto s="293" e="295">
+                                               <tg s="302" e="456" id="33" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="296" e="301">
+                               </bl>
+                               <bl s="302" e="456">
+                                       <fall s="302" e="456" id="44" count="4"/>
+                                       <br s="454" e="456">
+                                               <cond s="464" e="486" id="34" count="1" val="true"/>
+                                               <cond s="457" e="463" id="35" count="3" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="457" e="463">
+                               </bl>
+                               <bl s="464" e="486">
+                                       <fall s="464" e="486" id="45" count="3"/>
+                                       <br s="484" e="486">
+                                               <cond s="523" e="583" id="36" count="4" val="true"/>
+                                               <cond s="487" e="522" id="37" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="487" e="522">
+                                       <goto s="520" e="522">
+                                               <tg s="584" e="595" id="38" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="523" e="583">
+                               </bl>
+                               <bl s="584" e="595">
+                                       <fall s="584" e="595" id="46" count="4"/>
+                                       <goto s="593" e="595">
+                                               <tg s="244" e="253" id="39" count="4"/>
+                                       </goto>
+                               </bl>
+                               <bl s="596" e="601">
+                                       <goto s="599" e="601">
+                                               <tg s="224" e="232" id="40" count="2"/>
+                                       </goto>
+                               </bl>
+                               <bl s="602" e="697">
+                                       <exit s="697" e="697" opcode="return"/>
+                               </bl>
+                               <lt>0=82;10=83;13=85;49=86;57=88;91=90;97=91;103=92;132=93;221=105;233=106;241=107;254=108;263=109;282=110;287=112;296=114;302=116;334=117;366=118;405=120;452=121;457=122;464=124;474=125;477=127;487=128;523=131;584=134;590=107;596=105;602=138;608=140;616=141;644=142;673=144;680=145;691=146;697=147;</lt>
+                       </meth>
+               </class>
+               <class name="ViewSchedule" supername="javax/servlet/http/HttpServlet" checksum="1813169406" source="ViewSchedule.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="47" count="3"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=19;</lt>
+                       </meth>
+                       <meth name="getParamInt" vmsig="(Ljavax/servlet/http/HttpServletRequest;Ljava/lang/String;)I" flags='' access="0" length="16">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="48" count="4"/>
+                                       <exit s="11" e="11" opcode="ireturn"/>
+                               </bl>
+                               <bl s="12" e="15">
+                                       <catch s="12" e="15" id="49" count="3"/>
+                                       <exit s="15" e="15" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=28;7=30;12=32;14=34;</lt>
+                       </meth>
+                       <meth name="getParamString" vmsig="(Ljavax/servlet/http/HttpServletRequest;Ljava/lang/String;)Ljava/lang/String;" flags='' access="0" length="26">
+                               <bl s="0" e="12">
+                                       <methenter s="0" e="12" id="50" count="8"/>
+                                       <br s="10" e="12">
+                                               <cond s="22" e="23" id="51" count="2" val="true"/>
+                                               <cond s="13" e="21" id="52" count="6" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="13" e="21">
+                                       <br s="19" e="21">
+                                               <cond s="24" e="25" id="53" count="6" val="true"/>
+                                               <cond s="22" e="23" id="54" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="22" e="23">
+                                       <exit s="23" e="23" opcode="areturn"/>
+                               </bl>
+                               <bl s="24" e="25">
+                                       <exit s="25" e="25" opcode="areturn"/>
+                               </bl>
+                               <lt>0=39;8=40;22=42;24=44;</lt>
+                       </meth>
+                       <meth name="getLocale" vmsig="(Ljavax/servlet/http/HttpServletRequest;)Ljava/util/Locale;" flags='' access="0" length="35">
+                               <bl s="0" e="14">
+                                       <methenter s="0" e="14" id="55" count="0"/>
+                                       <br s="12" e="14">
+                                               <cond s="24" e="28" id="56" count="0" val="true"/>
+                                               <cond s="15" e="23" id="57" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="15" e="23">
+                               </bl>
+                               <bl s="24" e="28">
+                                       <fall s="24" e="28" id="60" count="0"/>
+                                       <br s="26" e="28">
+                                               <cond s="33" e="34" id="58" count="0" val="true"/>
+                                               <cond s="29" e="32" id="59" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="29" e="32">
+                               </bl>
+                               <bl s="33" e="34">
+                                       <fall s="33" e="34" id="61" count="0"/>
+                                       <exit s="34" e="34" opcode="areturn"/>
+                               </bl>
+                               <lt>0=48;2=49;10=50;15=51;24=53;29=54;33=56;</lt>
+                       </meth>
+                       <meth name="doGet" vmsig="(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V" flags=' public' access="1" length="148">
+                               <bl s="0" e="72">
+                                       <methenter s="0" e="72" id="62" count="0"/>
+                                       <br s="70" e="72">
+                                               <cond s="85" e="95" id="63" count="0" val="true"/>
+                                               <cond s="73" e="84" id="64" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="73" e="84">
+                                       <goto s="82" e="84">
+                                               <tg s="96" e="122" id="65" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="85" e="95">
+                               </bl>
+                               <bl s="96" e="122">
+                                       <fall s="96" e="122" id="70" count="0"/>
+                                       <goto s="120" e="122">
+                                               <tg s="133" e="135" id="66" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="123" e="132">
+                                       <catch s="123" e="132" id="68" count="0"/>
+                                       <exit s="132" e="132" opcode="athrow"/>
+                               </bl>
+                               <bl s="133" e="135">
+                                       <goto s="133" e="135">
+                                               <tg s="147" e="147" id="67" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="136" e="146">
+                                       <catch s="136" e="146" id="69" count="0"/>
+                               </bl>
+                               <bl s="147" e="147">
+                                       <fall s="147" e="147" id="71" count="0"/>
+                                       <exit s="147" e="147" opcode="return"/>
+                               </bl>
+                               <lt>0=63;8=64;15=66;22=67;31=68;40=71;51=73;64=74;67=76;73=77;85=80;96=82;107=84;115=87;120=88;123=87;133=92;136=90;138=91;147=93;</lt>
+                       </meth>
+                       <meth name="writeErrorPage" vmsig="(Ljava/io/PrintWriter;Ljava/lang/Throwable;Ljava/util/Locale;)V" flags='' access="0" length="156">
+                               <bl s="0" e="155">
+                                       <methenter s="0" e="155" id="72" count="3"/>
+                                       <exit s="155" e="155" opcode="return"/>
+                               </bl>
+                               <lt>0=96;9=97;20=98;26=100;75=104;124=116;130=117;137=118;143=120;149=121;155=122;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.frank.octranspo">
+               <class name="NextTrips" supername="net/jaekl/frank/octranspo/StopInfo" checksum="2503522746" source="NextTrips.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="13">
+                               <bl s="0" e="12">
+                                       <methenter s="0" e="12" id="73" count="1"/>
+                                       <exit s="12" e="12" opcode="return"/>
+                               </bl>
+                               <lt>0=9;12=10;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="58">
+                               <bl s="0" e="57">
+                                       <methenter s="0" e="57" id="74" count="1"/>
+                                       <exit s="57" e="57" opcode="return"/>
+                               </bl>
+                               <lt>0=5;31=6;</lt>
+                       </meth>
+               </class>
+               <class name="Route" supername="net/jaekl/qd/xml/ParseResult" checksum="3494611020" source="Route.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="46">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="75" count="7"/>
+                                       <exit s="45" e="45" opcode="return"/>
+                               </bl>
+                               <lt>0=29;12=30;17=31;22=32;28=33;34=34;45=35;</lt>
+                       </meth>
+                       <meth name="getRouteNo" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="76" count="8"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=37;</lt>
+                       </meth>
+                       <meth name="getDirectionID" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="77" count="2"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=38;</lt>
+                       </meth>
+                       <meth name="getDirection" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="78" count="4"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=39;</lt>
+                       </meth>
+                       <meth name="getRouteHeading" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="79" count="4"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=40;</lt>
+                       </meth>
+                       <meth name="getNumTrips" vmsig="()I" flags=' public' access="1" length="8">
+                               <bl s="0" e="7">
+                                       <methenter s="0" e="7" id="80" count="8"/>
+                                       <exit s="7" e="7" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=41;</lt>
+                       </meth>
+                       <meth name="getTrip" vmsig="(I)Lnet/jaekl/frank/octranspo/Trip;" flags=' public' access="1" length="19">
+                               <bl s="0" e="18">
+                                       <methenter s="0" e="18" id="81" count="8"/>
+                                       <exit s="18" e="18" opcode="areturn"/>
+                               </bl>
+                               <lt>0=42;</lt>
+                       </meth>
+                       <meth name="endContents" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="85">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="82" count="22"/>
+                                       <br s="6" e="8">
+                                               <cond s="21" e="29" id="83" count="17" val="true"/>
+                                               <cond s="9" e="20" id="84" count="5" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="20">
+                                       <goto s="18" e="20">
+                                               <tg s="84" e="84" id="85" count="5"/>
+                                       </goto>
+                               </bl>
+                               <bl s="21" e="29">
+                                       <br s="27" e="29">
+                                               <cond s="42" e="50" id="86" count="13" val="true"/>
+                                               <cond s="30" e="41" id="87" count="4" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="30" e="41">
+                                       <goto s="39" e="41">
+                                               <tg s="84" e="84" id="88" count="4"/>
+                                       </goto>
+                               </bl>
+                               <bl s="42" e="50">
+                                       <br s="48" e="50">
+                                               <cond s="60" e="68" id="89" count="8" val="true"/>
+                                               <cond s="51" e="59" id="90" count="5" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="51" e="59">
+                                       <goto s="57" e="59">
+                                               <tg s="84" e="84" id="91" count="5"/>
+                                       </goto>
+                               </bl>
+                               <bl s="60" e="68">
+                                       <br s="66" e="68">
+                                               <cond s="78" e="83" id="92" count="4" val="true"/>
+                                               <cond s="69" e="77" id="93" count="4" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="69" e="77">
+                                       <br s="75" e="77">
+                                               <cond s="84" e="84" id="94" count="3" val="true"/>
+                                               <cond s="78" e="83" id="95" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="78" e="83">
+                               </bl>
+                               <bl s="84" e="84">
+                                       <fall s="84" e="84" id="96" count="5"/>
+                                       <exit s="84" e="84" opcode="return"/>
+                               </bl>
+                               <lt>0=47;9=48;21=50;30=51;42=53;51=54;60=56;78=57;84=59;</lt>
+                       </meth>
+                       <meth name="endExternal" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="86">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="97" count="9"/>
+                                       <br s="6" e="8">
+                                               <cond s="85" e="85" id="98" count="0" val="true"/>
+                                               <cond s="9" e="29" id="99" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="29">
+                               </bl>
+                               <bl s="30" e="36">
+                                       <fall s="30" e="36" id="107" count="9"/>
+                                       <br s="34" e="36">
+                                               <cond s="85" e="85" id="100" count="9" val="true"/>
+                                               <cond s="37" e="49" id="101" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="37" e="49">
+                                       <br s="47" e="49">
+                                               <cond s="66" e="84" id="102" count="9" val="true"/>
+                                               <cond s="50" e="57" id="103" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="50" e="57">
+                                       <br s="55" e="57">
+                                               <cond s="66" e="84" id="104" count="0" val="true"/>
+                                               <cond s="58" e="65" id="105" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="58" e="65">
+                                       <exit s="65" e="65" opcode="athrow"/>
+                               </bl>
+                               <bl s="66" e="84">
+                                       <goto s="82" e="84">
+                                               <tg s="30" e="36" id="106" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="85" e="85">
+                                       <exit s="85" e="85" opcode="return"/>
+                               </bl>
+                               <lt>0=64;9=65;18=66;44=67;66=68;79=66;85=71;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="81">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="108" count="1"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="109" count="0" val="true"/>
+                                               <cond s="9" e="12" id="110" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="80" id="111" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="80">
+                                       <fall s="14" e="80" id="112" count="0"/>
+                                       <exit s="80" e="80" opcode="return"/>
+                               </bl>
+                               <lt>0=7;17=19;55=20;</lt>
+                       </meth>
+               </class>
+               <class name="RouteSummary" supername="net/jaekl/frank/octranspo/StopInfo" checksum="4047748583" source="RouteSummary.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="13">
+                               <bl s="0" e="12">
+                                       <methenter s="0" e="12" id="113" count="4"/>
+                                       <exit s="12" e="12" opcode="return"/>
+                               </bl>
+                               <lt>0=9;12=10;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="58">
+                               <bl s="0" e="57">
+                                       <methenter s="0" e="57" id="114" count="1"/>
+                                       <exit s="57" e="57" opcode="return"/>
+                               </bl>
+                               <lt>0=5;31=6;</lt>
+                       </meth>
+               </class>
+               <class name="Server" supername="java/lang/Object" checksum="2104221183" source="Server.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;Ljava/io/InputStream;)V" flags=' public' access="1" cons="true" length="130">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="115" count="3"/>
+                                       <br s="7" e="9">
+                                               <cond s="23" e="28" id="116" count="3" val="true"/>
+                                               <cond s="10" e="14" id="117" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="14">
+                                       <br s="12" e="14">
+                                               <cond s="23" e="28" id="118" count="0" val="true"/>
+                                               <cond s="15" e="22" id="119" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="15" e="22">
+                                       <exit s="22" e="22" opcode="athrow"/>
+                               </bl>
+                               <bl s="23" e="28">
+                                       <br s="26" e="28">
+                                               <cond s="42" e="129" id="120" count="3" val="true"/>
+                                               <cond s="29" e="33" id="121" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="29" e="33">
+                                       <br s="31" e="33">
+                                               <cond s="42" e="129" id="122" count="0" val="true"/>
+                                               <cond s="34" e="41" id="123" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="34" e="41">
+                                       <exit s="41" e="41" opcode="athrow"/>
+                               </bl>
+                               <bl s="42" e="129">
+                                       <exit s="129" e="129" opcode="return"/>
+                               </bl>
+                               <lt>0=33;4=34;23=35;42=37;58=38;64=40;75=41;93=42;112=44;129=45;</lt>
+                       </meth>
+                       <meth name="getRouteSummaryForStop" vmsig="(I)Lnet/jaekl/frank/octranspo/StopInfo;" flags=' public' access="1" length="56">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="124" count="1"/>
+                                       <exit s="45" e="45" opcode="areturn"/>
+                               </bl>
+                               <bl s="46" e="55">
+                                       <catch s="46" e="55" id="125" count="0"/>
+                                       <exit s="55" e="55" opcode="athrow"/>
+                               </bl>
+                               <lt>0=51;8=52;29=53;46=55;47=56;</lt>
+                       </meth>
+                       <meth name="getNextTripsForStop" vmsig="(II)Lnet/jaekl/frank/octranspo/StopInfo;" flags=' public' access="1" length="77">
+                               <bl s="0" e="66">
+                                       <methenter s="0" e="66" id="126" count="1"/>
+                                       <exit s="66" e="66" opcode="areturn"/>
+                               </bl>
+                               <bl s="67" e="76">
+                                       <catch s="67" e="76" id="127" count="0"/>
+                                       <exit s="76" e="76" opcode="athrow"/>
+                               </bl>
+                               <lt>0=64;8=65;29=66;50=67;67=69;68=70;</lt>
+                       </meth>
+                       <meth name="getNextTripsForStopAllRoutes" vmsig="(I)Lnet/jaekl/frank/octranspo/StopInfo;" flags=' public' access="1" length="56">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="128" count="1"/>
+                                       <exit s="45" e="45" opcode="areturn"/>
+                               </bl>
+                               <bl s="46" e="55">
+                                       <catch s="46" e="55" id="129" count="0"/>
+                                       <exit s="55" e="55" opcode="athrow"/>
+                               </bl>
+                               <lt>0=78;8=79;29=80;46=82;47=83;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="18">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="130" count="1"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="131" count="0" val="true"/>
+                                               <cond s="9" e="12" id="132" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="17" id="133" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="17">
+                                       <fall s="14" e="17" id="134" count="0"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=16;</lt>
+                       </meth>
+               </class>
+               <class name="StopInfo" supername="net/jaekl/qd/xml/ParseResult" checksum="2473993047" source="StopInfo.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;[Ljava/lang/String;[[Ljava/lang/Object;)V" flags=' public' access="1" cons="true" length="36">
+                               <bl s="0" e="35">
+                                       <methenter s="0" e="35" id="135" count="5"/>
+                                       <exit s="35" e="35" opcode="return"/>
+                               </bl>
+                               <lt>0=26;7=28;12=29;18=30;24=31;35=32;</lt>
+                       </meth>
+                       <meth name="getStopNo" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="136" count="5"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=37;</lt>
+                       </meth>
+                       <meth name="getDescr" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="137" count="5"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=38;</lt>
+                       </meth>
+                       <meth name="getError" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="138" count="3"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=39;</lt>
+                       </meth>
+                       <meth name="getNumRoutes" vmsig="()I" flags=' public' access="1" length="8">
+                               <bl s="0" e="7">
+                                       <methenter s="0" e="7" id="139" count="7"/>
+                                       <exit s="7" e="7" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=40;</lt>
+                       </meth>
+                       <meth name="getRoute" vmsig="(I)Lnet/jaekl/frank/octranspo/Route;" flags=' public' access="1" length="12">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="140" count="6"/>
+                                       <exit s="11" e="11" opcode="areturn"/>
+                               </bl>
+                               <lt>0=41;</lt>
+                       </meth>
+                       <meth name="endContents" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="87">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="141" count="11"/>
+                                       <br s="3" e="5">
+                                               <cond s="19" e="28" id="142" count="11" val="true"/>
+                                               <cond s="6" e="10" id="143" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="6" e="10">
+                                       <br s="8" e="10">
+                                               <cond s="19" e="28" id="144" count="0" val="true"/>
+                                               <cond s="11" e="18" id="145" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="11" e="18">
+                                       <exit s="18" e="18" opcode="athrow"/>
+                               </bl>
+                               <bl s="19" e="28">
+                                       <br s="26" e="28">
+                                               <cond s="41" e="50" id="146" count="8" val="true"/>
+                                               <cond s="29" e="40" id="147" count="3" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="29" e="40">
+                                       <goto s="38" e="40">
+                                               <tg s="86" e="86" id="148" count="3"/>
+                                       </goto>
+                               </bl>
+                               <bl s="41" e="50">
+                                       <br s="48" e="50">
+                                               <cond s="61" e="69" id="149" count="2" val="true"/>
+                                               <cond s="51" e="60" id="150" count="6" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="51" e="60">
+                                       <br s="58" e="60">
+                                               <cond s="70" e="79" id="151" count="5" val="true"/>
+                                               <cond s="61" e="69" id="152" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="61" e="69">
+                                       <goto s="67" e="69">
+                                               <tg s="86" e="86" id="153" count="3"/>
+                                       </goto>
+                               </bl>
+                               <bl s="70" e="79">
+                                       <br s="77" e="79">
+                                               <cond s="86" e="86" id="154" count="2" val="true"/>
+                                               <cond s="80" e="85" id="155" count="3" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="80" e="85">
+                               </bl>
+                               <bl s="86" e="86">
+                                       <fall s="86" e="86" id="156" count="3"/>
+                                       <exit s="86" e="86" opcode="return"/>
+                               </bl>
+                               <lt>0=49;19=51;29=52;41=54;61=55;70=57;80=58;86=60;</lt>
+                       </meth>
+                       <meth name="endExternal" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="87">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="157" count="5"/>
+                                       <br s="7" e="9">
+                                               <cond s="86" e="86" id="158" count="0" val="true"/>
+                                               <cond s="10" e="30" id="159" count="5" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="30">
+                               </bl>
+                               <bl s="31" e="37">
+                                       <fall s="31" e="37" id="167" count="5"/>
+                                       <br s="35" e="37">
+                                               <cond s="86" e="86" id="160" count="5" val="true"/>
+                                               <cond s="38" e="50" id="161" count="5" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="38" e="50">
+                                       <br s="48" e="50">
+                                               <cond s="67" e="85" id="162" count="5" val="true"/>
+                                               <cond s="51" e="58" id="163" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="51" e="58">
+                                       <br s="56" e="58">
+                                               <cond s="67" e="85" id="164" count="0" val="true"/>
+                                               <cond s="59" e="66" id="165" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="59" e="66">
+                                       <exit s="66" e="66" opcode="athrow"/>
+                               </bl>
+                               <bl s="67" e="85">
+                                       <goto s="83" e="85">
+                                               <tg s="31" e="37" id="166" count="5"/>
+                                       </goto>
+                               </bl>
+                               <bl s="86" e="86">
+                                       <exit s="86" e="86" opcode="return"/>
+                               </bl>
+                               <lt>0=65;10=66;19=67;45=68;67=69;80=67;86=72;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="48">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="168" count="1"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="169" count="0" val="true"/>
+                                               <cond s="9" e="12" id="170" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="47" id="171" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="47">
+                                       <fall s="14" e="47" id="172" count="0"/>
+                                       <exit s="47" e="47" opcode="return"/>
+                               </bl>
+                               <lt>0=8;17=11;22=12;27=13;32=14;37=15;42=16;</lt>
+                       </meth>
+               </class>
+               <class name="Trip" supername="net/jaekl/qd/xml/ParseResult" checksum="1733828479" source="Trip.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="90">
+                               <bl s="0" e="89">
+                                       <methenter s="0" e="89" id="173" count="13"/>
+                                       <exit s="89" e="89" opcode="return"/>
+                               </bl>
+                               <lt>0=50;12=51;18=52;29=53;34=54;39=55;44=56;50=57;55=58;60=59;65=61;78=62;89=63;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Lnet/jaekl/frank/octranspo/Trip;)V" flags=' public' access="1" cons="true" length="93">
+                               <bl s="0" e="92">
+                                       <methenter s="0" e="92" id="174" count="8"/>
+                                       <exit s="92" e="92" opcode="return"/>
+                               </bl>
+                               <lt>0=66;12=67;20=68;28=69;36=70;44=71;52=72;60=73;68=74;76=75;84=76;92=77;</lt>
+                       </meth>
+                       <meth name="getDest" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="175" count="8"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=79;</lt>
+                       </meth>
+                       <meth name="getStart" vmsig="()Ljava/util/Date;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="176" count="4"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=80;</lt>
+                       </meth>
+                       <meth name="getAdjTime" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="177" count="12"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=81;</lt>
+                       </meth>
+                       <meth name="getAdjAge" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="178" count="12"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=82;</lt>
+                       </meth>
+                       <meth name="isLastTrip" vmsig="()Z" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="179" count="4"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=83;</lt>
+                       </meth>
+                       <meth name="getBusType" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="180" count="4"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=84;</lt>
+                       </meth>
+                       <meth name="getSpeed" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="181" count="4"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=85;</lt>
+                       </meth>
+                       <meth name="getLongitude" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="182" count="8"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=86;</lt>
+                       </meth>
+                       <meth name="getLatitude" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="183" count="8"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=87;</lt>
+                       </meth>
+                       <meth name="getETA" vmsig="()Ljava/util/Date;" flags=' public' access="1" length="24">
+                               <bl s="0" e="23">
+                                       <methenter s="0" e="23" id="184" count="4"/>
+                                       <exit s="23" e="23" opcode="areturn"/>
+                               </bl>
+                               <lt>0=90;</lt>
+                       </meth>
+                       <meth name="getGPSTime" vmsig="()Ljava/util/Date;" flags=' public' access="1" length="25">
+                               <bl s="0" e="24">
+                                       <methenter s="0" e="24" id="185" count="4"/>
+                                       <exit s="24" e="24" opcode="areturn"/>
+                               </bl>
+                               <lt>0=93;</lt>
+                       </meth>
+                       <meth name="endContents" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="200">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="186" count="81"/>
+                                       <br s="6" e="8">
+                                               <cond s="18" e="26" id="187" count="72" val="true"/>
+                                               <cond s="9" e="17" id="188" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="17">
+                                       <goto s="15" e="17">
+                                               <tg s="184" e="186" id="189" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="18" e="26">
+                                       <br s="24" e="26">
+                                               <cond s="43" e="51" id="190" count="63" val="true"/>
+                                               <cond s="27" e="42" id="191" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="27" e="42">
+                                       <goto s="40" e="42">
+                                               <tg s="184" e="186" id="192" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="43" e="51">
+                                       <br s="49" e="51">
+                                               <cond s="64" e="72" id="193" count="54" val="true"/>
+                                               <cond s="52" e="63" id="194" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="52" e="63">
+                                       <goto s="61" e="63">
+                                               <tg s="184" e="186" id="195" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="64" e="72">
+                                       <br s="70" e="72">
+                                               <cond s="85" e="93" id="196" count="45" val="true"/>
+                                               <cond s="73" e="84" id="197" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="73" e="84">
+                                       <goto s="82" e="84">
+                                               <tg s="184" e="186" id="198" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="85" e="93">
+                                       <br s="91" e="93">
+                                               <cond s="106" e="114" id="199" count="36" val="true"/>
+                                               <cond s="94" e="105" id="200" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="94" e="105">
+                                       <goto s="103" e="105">
+                                               <tg s="184" e="186" id="201" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="106" e="114">
+                                       <br s="112" e="114">
+                                               <cond s="124" e="132" id="202" count="27" val="true"/>
+                                               <cond s="115" e="123" id="203" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="115" e="123">
+                                       <goto s="121" e="123">
+                                               <tg s="184" e="186" id="204" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="124" e="132">
+                                       <br s="130" e="132">
+                                               <cond s="145" e="153" id="205" count="18" val="true"/>
+                                               <cond s="133" e="144" id="206" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="133" e="144">
+                                       <goto s="142" e="144">
+                                               <tg s="184" e="186" id="207" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="145" e="153">
+                                       <br s="151" e="153">
+                                               <cond s="166" e="174" id="208" count="9" val="true"/>
+                                               <cond s="154" e="165" id="209" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="154" e="165">
+                                       <goto s="163" e="165">
+                                               <tg s="184" e="186" id="210" count="9"/>
+                                       </goto>
+                               </bl>
+                               <bl s="166" e="174">
+                                       <br s="172" e="174">
+                                               <cond s="184" e="186" id="211" count="0" val="true"/>
+                                               <cond s="175" e="183" id="212" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="175" e="183">
+                               </bl>
+                               <bl s="184" e="186">
+                                       <fall s="184" e="186" id="215" count="9"/>
+                                       <goto s="184" e="186">
+                                               <tg s="199" e="199" id="213" count="81"/>
+                                       </goto>
+                               </bl>
+                               <bl s="187" e="198">
+                                       <catch s="187" e="198" id="214" count="0"/>
+                                       <exit s="198" e="198" opcode="athrow"/>
+                               </bl>
+                               <bl s="199" e="199">
+                                       <exit s="199" e="199" opcode="return"/>
+                               </bl>
+                               <lt>0=102;9=103;18=105;27=106;43=108;52=109;64=111;73=112;85=114;94=115;106=117;115=118;124=120;133=121;145=123;154=124;166=126;175=127;184=131;187=129;189=130;199=132;</lt>
+                       </meth>
+                       <meth name="endExternal" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="216" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=138;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="64">
+                               <bl s="0" e="63">
+                                       <methenter s="0" e="63" id="217" count="1"/>
+                                       <exit s="63" e="63" opcode="return"/>
+                               </bl>
+                               <lt>0=25;56=34;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd">
+               <class name="QDBundleFactory" supername="java/lang/Object" checksum="829198806" source="QDBundleFactory.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' private' access="2" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="218" count="1"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=20;4=22;</lt>
+                       </meth>
+                       <meth name="getInst" vmsig="()Lnet/jaekl/qd/QDBundleFactory;" flags=' public static' access="9" length="48">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="219" count="5"/>
+                                       <br s="6" e="8">
+                                               <cond s="46" e="47" id="220" count="4" val="true"/>
+                                               <cond s="9" e="21" id="221" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="21">
+                                       <br s="19" e="21">
+                                               <cond s="32" e="40" id="222" count="0" val="true"/>
+                                               <cond s="22" e="31" id="223" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="22" e="31">
+                               </bl>
+                               <bl s="32" e="40">
+                                       <fall s="32" e="40" id="226" count="1"/>
+                                       <goto s="38" e="40">
+                                               <tg s="46" e="47" id="224" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="41" e="45">
+                                       <catch s="41" e="45" id="225" count="0"/>
+                                       <exit s="45" e="45" opcode="athrow"/>
+                               </bl>
+                               <bl s="46" e="47">
+                                       <exit s="47" e="47" opcode="areturn"/>
+                               </bl>
+                               <lt>0=25;4=26;9=27;15=28;22=29;32=31;36=32;46=34;</lt>
+                       </meth>
+                       <meth name="getBundle" vmsig="(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/ResourceBundle;" flags=' public' access="1" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="227" count="3"/>
+                                       <exit s="5" e="5" opcode="areturn"/>
+                               </bl>
+                               <lt>0=38;</lt>
+                       </meth>
+               </class>
+               <class name="QDException" supername="java/lang/Exception" checksum="3524936329" source="QDException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="228" count="4"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=8;4=9;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/Throwable;)V" flags=' public' access="1" cons="true" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="229" count="1"/>
+                                       <exit s="5" e="5" opcode="return"/>
+                               </bl>
+                               <lt>0=12;5=13;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd.http">
+               <class name="RequestBroker" supername="java/lang/Object" checksum="1232047242" source="RequestBroker.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;)V" flags=' public' access="1" cons="true" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;)V" length="35">
+                               <bl s="0" e="34">
+                                       <methenter s="0" e="34" id="230" count="9"/>
+                                       <exit s="34" e="34" opcode="return"/>
+                               </bl>
+                               <lt>0=40;4=33;10=34;17=41;22=42;34=43;</lt>
+                       </meth>
+                       <meth name="doSubmit" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;)Ljava/io/InputStream;" flags='' access="0" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;)Ljava/io/InputStream;" length="202">
+                               <bl s="0" e="146">
+                                       <methenter s="0" e="146" id="231" count="0"/>
+                                       <br s="144" e="146">
+                                               <cond s="159" e="161" id="232" count="0" val="true"/>
+                                               <cond s="147" e="158" id="233" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="147" e="158">
+                                       <exit s="158" e="158" opcode="areturn"/>
+                               </bl>
+                               <bl s="159" e="161">
+                                       <goto s="159" e="161">
+                                               <tg s="200" e="201" id="234" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="162" e="169">
+                                       <catch s="162" e="169" id="237" count="0"/>
+                                       <br s="167" e="169">
+                                               <cond s="178" e="187" id="235" count="0" val="true"/>
+                                               <cond s="170" e="177" id="236" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="170" e="177">
+                                       <exit s="177" e="177" opcode="athrow"/>
+                               </bl>
+                               <bl s="178" e="187">
+                                       <exit s="187" e="187" opcode="athrow"/>
+                               </bl>
+                               <bl s="188" e="199">
+                                       <catch s="188" e="199" id="238" count="0"/>
+                                       <exit s="199" e="199" opcode="athrow"/>
+                               </bl>
+                               <bl s="200" e="201">
+                                       <exit s="201" e="201" opcode="areturn"/>
+                               </bl>
+                               <lt>0=49;12=50;18=53;23=54;33=55;43=56;48=57;59=58;66=59;106=60;121=61;132=62;141=64;147=65;156=66;159=77;162=69;164=72;178=73;188=75;190=76;200=79;</lt>
+                       </meth>
+                       <meth name="submit" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;)Ljava/lang/String;" flags=' public' access="1" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;)Ljava/lang/String;" length="107">
+                               <bl s="0" e="43">
+                                       <methenter s="0" e="43" id="239" count="1"/>
+                               </bl>
+                               <bl s="44" e="49">
+                                       <fall s="44" e="49" id="246" count="1"/>
+                                       <br s="47" e="49">
+                                               <cond s="72" e="79" id="240" count="1" val="true"/>
+                                               <cond s="50" e="71" id="241" count="28" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="50" e="71">
+                                       <goto s="69" e="71">
+                                               <tg s="44" e="49" id="242" count="28"/>
+                                       </goto>
+                               </bl>
+                               <bl s="72" e="79">
+                                       <goto s="77" e="79">
+                                               <tg s="102" e="106" id="243" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="80" e="91">
+                                       <catch s="80" e="91" id="244" count="0"/>
+                                       <exit s="91" e="91" opcode="athrow"/>
+                               </bl>
+                               <bl s="92" e="101">
+                                       <catch s="92" e="101" id="245" count="0"/>
+                                       <exit s="101" e="101" opcode="athrow"/>
+                               </bl>
+                               <bl s="102" e="106">
+                                       <exit s="106" e="106" opcode="areturn"/>
+                               </bl>
+                               <lt>0=84;8=85;11=88;19=89;37=90;44=91;50=92;62=93;72=100;77=101;80=96;82=97;92=100;102=103;</lt>
+                       </meth>
+                       <meth name="submitAndParse" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/Class;)Lnet/jaekl/qd/xml/ParseResult;" flags=' public' access="1" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;Ljava/lang/Class&lt;+Lnet/jaekl/qd/xml/ParseResult;&gt;;)Lnet/jaekl/qd/xml/ParseResult;" length="9">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="247" count="5"/>
+                                       <exit s="8" e="8" opcode="areturn"/>
+                               </bl>
+                               <lt>0=111;</lt>
+                       </meth>
+                       <meth name="submitAndParse" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/Class;Ljava/lang/String;)Lnet/jaekl/qd/xml/ParseResult;" flags=' public' access="1" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;Ljava/lang/Class&lt;+Lnet/jaekl/qd/xml/ParseResult;&gt;;Ljava/lang/String;)Lnet/jaekl/qd/xml/ParseResult;" length="137">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="248" count="4"/>
+                                       <br s="9" e="11">
+                                               <cond s="24" e="54" id="249" count="0" val="true"/>
+                                               <cond s="12" e="23" id="250" count="4" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="12" e="23">
+                                       <goto s="21" e="23">
+                                               <tg s="55" e="111" id="251" count="4"/>
+                                       </goto>
+                               </bl>
+                               <bl s="24" e="54">
+                               </bl>
+                               <bl s="55" e="111">
+                                       <fall s="55" e="111" id="255" count="0"/>
+                                       <goto s="109" e="111">
+                                               <tg s="134" e="136" id="252" count="4"/>
+                                       </goto>
+                               </bl>
+                               <bl s="112" e="123">
+                                       <catch s="112" e="123" id="253" count="0"/>
+                                       <exit s="123" e="123" opcode="athrow"/>
+                               </bl>
+                               <bl s="124" e="133">
+                                       <catch s="124" e="133" id="254" count="0"/>
+                                       <exit s="133" e="133" opcode="athrow"/>
+                               </bl>
+                               <bl s="134" e="136">
+                                       <exit s="136" e="136" opcode="areturn"/>
+                               </bl>
+                               <lt>0=120;3=121;6=124;12=125;24=128;55=130;63=131;68=132;79=133;88=134;104=147;109=148;112=136;114=144;124=147;134=150;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="18">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="256" count="1"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="257" count="0" val="true"/>
+                                               <cond s="9" e="12" id="258" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="17" id="259" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="17">
+                                       <fall s="14" e="17" id="260" count="0"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=31;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd.util">
+               <class name="ExceptionUtils" supername="java/lang/Object" checksum="3353308664" source="ExceptionUtils.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="261" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=8;</lt>
+                       </meth>
+                       <meth name="tryClose" vmsig="(Ljava/io/Closeable;)V" flags=' public static' access="9" length="25">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="262" count="8"/>
+                                       <br s="2" e="4">
+                                               <cond s="11" e="13" id="263" count="1" val="true"/>
+                                               <cond s="5" e="10" id="264" count="7" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="10">
+                               </bl>
+                               <bl s="11" e="13">
+                                       <fall s="11" e="13" id="267" count="6"/>
+                                       <goto s="11" e="13">
+                                               <tg s="24" e="24" id="265" count="7"/>
+                                       </goto>
+                               </bl>
+                               <bl s="14" e="23">
+                                       <catch s="14" e="23" id="266" count="1"/>
+                                       <exit s="23" e="23" opcode="athrow"/>
+                               </bl>
+                               <bl s="24" e="24">
+                                       <exit s="24" e="24" opcode="return"/>
+                               </bl>
+                               <lt>0=11;5=12;11=17;14=15;15=16;24=18;</lt>
+                       </meth>
+               </class>
+               <class name="ParseUtils" supername="java/lang/Object" checksum="624394704" source="ParseUtils.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="268" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=3;</lt>
+                       </meth>
+                       <meth name="parseDouble" vmsig="(Ljava/lang/String;)D" flags=' public static' access="9" length="24">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="269" count="44"/>
+                                       <br s="2" e="4">
+                                               <cond s="14" e="15" id="270" count="1" val="true"/>
+                                               <cond s="5" e="13" id="271" count="43" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="13">
+                                       <br s="11" e="13">
+                                               <cond s="16" e="20" id="272" count="27" val="true"/>
+                                               <cond s="14" e="15" id="273" count="16" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="14" e="15">
+                                       <exit s="15" e="15" opcode="dreturn"/>
+                               </bl>
+                               <bl s="16" e="20">
+                                       <exit s="20" e="20" opcode="dreturn"/>
+                               </bl>
+                               <bl s="21" e="23">
+                                       <catch s="21" e="23" id="274" count="1"/>
+                                       <exit s="23" e="23" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=7;14=8;16=11;21=13;22=14;</lt>
+                       </meth>
+                       <meth name="parseInt" vmsig="(Ljava/lang/String;)I" flags=' public static' access="9" length="24">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="275" count="17"/>
+                                       <br s="2" e="4">
+                                               <cond s="14" e="15" id="276" count="1" val="true"/>
+                                               <cond s="5" e="13" id="277" count="16" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="13">
+                                       <br s="11" e="13">
+                                               <cond s="16" e="20" id="278" count="15" val="true"/>
+                                               <cond s="14" e="15" id="279" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="14" e="15">
+                                       <exit s="15" e="15" opcode="ireturn"/>
+                               </bl>
+                               <bl s="16" e="20">
+                                       <exit s="20" e="20" opcode="ireturn"/>
+                               </bl>
+                               <bl s="21" e="23">
+                                       <catch s="21" e="23" id="280" count="2"/>
+                                       <exit s="23" e="23" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=19;14=20;16=23;21=25;22=26;</lt>
+                       </meth>
+               </class>
+               <class name="StringUtils" supername="java/lang/Object" checksum="3174979789" source="StringUtils.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="281" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=3;</lt>
+                       </meth>
+                       <meth name="areEqual" vmsig="(Ljava/lang/String;Ljava/lang/String;)Z" flags=' public static' access="9" length="22">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="282" count="18"/>
+                                       <br s="2" e="4">
+                                               <cond s="16" e="21" id="283" count="15" val="true"/>
+                                               <cond s="5" e="9" id="284" count="3" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="9">
+                                       <br s="7" e="9">
+                                               <cond s="14" e="14" id="285" count="2" val="true"/>
+                                               <cond s="10" e="13" id="286" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="13">
+                                       <goto s="11" e="13">
+                                               <tg s="15" e="15" id="287" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="14" e="14">
+                               </bl>
+                               <bl s="15" e="15">
+                                       <fall s="15" e="15" id="288" count="2"/>
+                                       <exit s="15" e="15" opcode="ireturn"/>
+                               </bl>
+                               <bl s="16" e="21">
+                                       <exit s="21" e="21" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=5;5=6;16=8;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd.xml">
+               <class name="MismatchedTagsException" supername="net/jaekl/qd/xml/XmlParseException" checksum="3062725623" source="MismatchedTagsException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" cons="true" length="15">
+                               <bl s="0" e="14">
+                                       <methenter s="0" e="14" id="289" count="0"/>
+                                       <exit s="14" e="14" opcode="return"/>
+                               </bl>
+                               <lt>0=14;4=15;9=16;14=17;</lt>
+                       </meth>
+                       <meth name="getExpected" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="290" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=19;</lt>
+                       </meth>
+                       <meth name="getActual" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="291" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=20;</lt>
+                       </meth>
+               </class>
+               <class name="MissingInfoException" supername="net/jaekl/qd/xml/XmlParseException" checksum="2789497018" source="MissingInfoException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" cons="true" length="32">
+                               <bl s="0" e="31">
+                                       <methenter s="0" e="31" id="292" count="3"/>
+                                       <exit s="31" e="31" opcode="return"/>
+                               </bl>
+                               <lt>0=16;4=17;9=18;20=19;31=20;</lt>
+                       </meth>
+                       <meth name="addMissingAttribute" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="10">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="293" count="2"/>
+                                       <exit s="9" e="9" opcode="return"/>
+                               </bl>
+                               <lt>0=23;9=24;</lt>
+                       </meth>
+                       <meth name="addMissingChild" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="10">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="294" count="2"/>
+                                       <exit s="9" e="9" opcode="return"/>
+                               </bl>
+                               <lt>0=27;9=28;</lt>
+                       </meth>
+                       <meth name="getTagName" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="295" count="4"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=30;</lt>
+                       </meth>
+                       <meth name="getMessage" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="163">
+                               <bl s="0" e="47">
+                                       <methenter s="0" e="47" id="296" count="3"/>
+                               </bl>
+                               <bl s="48" e="56">
+                                       <fall s="48" e="56" id="303" count="3"/>
+                                       <br s="54" e="56">
+                                               <cond s="99" e="106" id="297" count="3" val="true"/>
+                                               <cond s="57" e="98" id="298" count="2" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="57" e="98">
+                                       <goto s="96" e="98">
+                                               <tg s="48" e="56" id="299" count="2"/>
+                                       </goto>
+                               </bl>
+                               <bl s="99" e="106">
+                               </bl>
+                               <bl s="107" e="115">
+                                       <fall s="107" e="115" id="304" count="3"/>
+                                       <br s="113" e="115">
+                                               <cond s="158" e="162" id="300" count="3" val="true"/>
+                                               <cond s="116" e="157" id="301" count="2" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="116" e="157">
+                                       <goto s="155" e="157">
+                                               <tg s="107" e="115" id="302" count="2"/>
+                                       </goto>
+                               </bl>
+                               <bl s="158" e="162">
+                                       <exit s="162" e="162" opcode="areturn"/>
+                               </bl>
+                               <lt>0=34;8=36;40=38;67=39;96=40;99=42;126=43;155=44;158=45;</lt>
+                       </meth>
+               </class>
+               <class name="ParseHandler" supername="java/lang/Object" checksum="3464370400" source="ParseHandler.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Lnet/jaekl/qd/xml/ParseResult;)V" flags=' public' access="1" cons="true" length="25">
+                               <bl s="0" e="24">
+                                       <methenter s="0" e="24" id="305" count="12"/>
+                                       <exit s="24" e="24" opcode="return"/>
+                               </bl>
+                               <lt>0=16;4=17;15=18;24=19;</lt>
+                       </meth>
+                       <meth name="characters" vmsig="([CII)V" flags=' public' access="1" length="43">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="306" count="204"/>
+                                       <br s="7" e="9">
+                                               <cond s="11" e="29" id="307" count="195" val="true"/>
+                                               <cond s="10" e="10" id="308" count="9" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="10">
+                                       <exit s="10" e="10" opcode="return"/>
+                               </bl>
+                               <bl s="11" e="29">
+                                       <goto s="27" e="29">
+                                               <tg s="42" e="42" id="309" count="195"/>
+                                       </goto>
+                               </bl>
+                               <bl s="30" e="41">
+                                       <catch s="30" e="41" id="310" count="0"/>
+                                       <exit s="41" e="41" opcode="athrow"/>
+                               </bl>
+                               <bl s="42" e="42">
+                                       <exit s="42" e="42" opcode="return"/>
+                               </bl>
+                               <lt>0=24;10=25;11=29;27=33;30=31;32=32;42=34;</lt>
+                       </meth>
+                       <meth name="endElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="85">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="311" count="235"/>
+                                       <br s="7" e="9">
+                                               <cond s="11" e="33" id="312" count="216" val="true"/>
+                                               <cond s="10" e="10" id="313" count="19" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="10">
+                                       <exit s="10" e="10" opcode="return"/>
+                               </bl>
+                               <bl s="11" e="33">
+                                       <br s="31" e="33">
+                                               <cond s="69" e="71" id="314" count="185" val="true"/>
+                                               <cond s="34" e="51" id="315" count="31" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="34" e="51">
+                                       <br s="49" e="51">
+                                               <cond s="53" e="68" id="316" count="20" val="true"/>
+                                               <cond s="52" e="52" id="317" count="11" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="52" e="52">
+                                       <exit s="52" e="52" opcode="return"/>
+                               </bl>
+                               <bl s="53" e="68">
+                               </bl>
+                               <bl s="69" e="71">
+                                       <fall s="69" e="71" id="320" count="20"/>
+                                       <goto s="69" e="71">
+                                               <tg s="84" e="84" id="318" count="205"/>
+                                       </goto>
+                               </bl>
+                               <bl s="72" e="83">
+                                       <catch s="72" e="83" id="319" count="0"/>
+                                       <exit s="83" e="83" opcode="athrow"/>
+                               </bl>
+                               <bl s="84" e="84">
+                                       <exit s="84" e="84" opcode="return"/>
+                               </bl>
+                               <lt>0=40;10=41;11=44;29=45;34=46;42=48;52=49;53=52;69=57;72=55;74=56;84=58;</lt>
+                       </meth>
+                       <meth name="startElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V" flags=' public' access="1" length="57">
+                               <bl s="0" e="30">
+                                       <methenter s="0" e="30" id="321" count="235"/>
+                                       <br s="28" e="30">
+                                               <cond s="41" e="43" id="322" count="215" val="true"/>
+                                               <cond s="31" e="40" id="323" count="20" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="31" e="40">
+                               </bl>
+                               <bl s="41" e="43">
+                                       <fall s="41" e="43" id="326" count="20"/>
+                                       <goto s="41" e="43">
+                                               <tg s="56" e="56" id="324" count="235"/>
+                                       </goto>
+                               </bl>
+                               <bl s="44" e="55">
+                                       <catch s="44" e="55" id="325" count="0"/>
+                                       <exit s="55" e="55" opcode="athrow"/>
+                               </bl>
+                               <bl s="56" e="56">
+                                       <exit s="56" e="56" opcode="return"/>
+                               </bl>
+                               <lt>0=64;12=65;24=66;31=67;41=72;44=70;46=71;56=73;</lt>
+                       </meth>
+                       <meth name="endDocument" vmsig="()V" flags=' public' access="1" length="41">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="327" count="12"/>
+                                       <br s="7" e="9">
+                                               <cond s="40" e="40" id="328" count="11" val="true"/>
+                                               <cond s="10" e="39" id="329" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="39">
+                                       <exit s="39" e="39" opcode="athrow"/>
+                               </bl>
+                               <bl s="40" e="40">
+                                       <exit s="40" e="40" opcode="return"/>
+                               </bl>
+                               <lt>0=77;10=78;24=79;40=81;</lt>
+                       </meth>
+                       <meth name="endPrefixMapping" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="330" count="48"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=86;</lt>
+                       </meth>
+                       <meth name="ignorableWhitespace" vmsig="([CII)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="331" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=93;</lt>
+                       </meth>
+                       <meth name="processingInstruction" vmsig="(Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="332" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=100;</lt>
+                       </meth>
+                       <meth name="setDocumentLocator" vmsig="(Lorg/xml/sax/Locator;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="333" count="12"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=105;</lt>
+                       </meth>
+                       <meth name="skippedEntity" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="334" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=110;</lt>
+                       </meth>
+                       <meth name="startDocument" vmsig="()V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="335" count="12"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=115;</lt>
+                       </meth>
+                       <meth name="startPrefixMapping" vmsig="(Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="336" count="48"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=122;</lt>
+                       </meth>
+               </class>
+               <class name="ParseResult" supername="java/lang/Object" checksum="3007858202" source="ParseResult.java" flags=' public abstract'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;[Ljava/lang/String;[[Ljava/lang/Object;)V" flags=' public' access="1" cons="true" length="161">
+                               <bl s="0" e="79">
+                                       <methenter s="0" e="79" id="337" count="45"/>
+                               </bl>
+                               <bl s="80" e="86">
+                                       <fall s="80" e="86" id="344" count="45"/>
+                                       <br s="84" e="86">
+                                               <cond s="110" e="112" id="338" count="45" val="true"/>
+                                               <cond s="87" e="109" id="339" count="287" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="87" e="109">
+                                       <goto s="107" e="109">
+                                               <tg s="80" e="86" id="340" count="287"/>
+                                       </goto>
+                               </bl>
+                               <bl s="110" e="112">
+                               </bl>
+                               <bl s="113" e="119">
+                                       <fall s="113" e="119" id="345" count="45"/>
+                                       <br s="117" e="119">
+                                               <cond s="160" e="160" id="341" count="45" val="true"/>
+                                               <cond s="120" e="159" id="342" count="17" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="120" e="159">
+                                       <goto s="157" e="159">
+                                               <tg s="113" e="119" id="343" count="17"/>
+                                       </goto>
+                               </bl>
+                               <bl s="160" e="160">
+                                       <exit s="160" e="160" opcode="return"/>
+                               </bl>
+                               <lt>0=32;4=33;15=34;26=35;37=36;42=38;47=39;58=40;69=42;94=43;104=42;110=46;120=47;131=48;142=49;154=46;160=51;</lt>
+                       </meth>
+                       <meth name="getTagName" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="346" count="1"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=56;</lt>
+                       </meth>
+                       <meth name="haveSeenMyTag" vmsig="()Z" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="347" count="0"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=57;</lt>
+                       </meth>
+                       <meth name="characters" vmsig="([CII)V" flags=' public' access="1" length="12">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="348" count="195"/>
+                                       <exit s="11" e="11" opcode="return"/>
+                               </bl>
+                               <lt>0=61;11=62;</lt>
+                       </meth>
+                       <meth name="collectParsedChildren" vmsig="(Ljava/lang/Class;)[Lnet/jaekl/qd/xml/ParseResult;" flags=' protected' access="4" signature="(Ljava/lang/Class&lt;+Lnet/jaekl/qd/xml/ParseResult;&gt;;)[Lnet/jaekl/qd/xml/ParseResult;" length="83">
+                               <bl s="0" e="15">
+                                       <methenter s="0" e="15" id="349" count="20"/>
+                               </bl>
+                               <bl s="16" e="24">
+                                       <fall s="16" e="24" id="355" count="20"/>
+                                       <br s="22" e="24">
+                                               <cond s="64" e="82" id="350" count="20" val="true"/>
+                                               <cond s="25" e="47" id="351" count="20" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="25" e="47">
+                                       <br s="45" e="47">
+                                               <cond s="61" e="63" id="352" count="0" val="true"/>
+                                               <cond s="48" e="60" id="353" count="20" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="48" e="60">
+                               </bl>
+                               <bl s="61" e="63">
+                                       <fall s="61" e="63" id="356" count="20"/>
+                                       <goto s="61" e="63">
+                                               <tg s="16" e="24" id="354" count="20"/>
+                                       </goto>
+                               </bl>
+                               <bl s="64" e="82">
+                                       <exit s="82" e="82" opcode="areturn"/>
+                               </bl>
+                               <lt>0=65;8=66;16=67;25=68;36=69;48=70;55=71;61=73;64=75;73=76;</lt>
+                       </meth>
+                       <meth name="endElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z" flags=' public' access="1" length="114">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="357" count="216"/>
+                                       <br s="3" e="5">
+                                               <cond s="19" e="35" id="358" count="216" val="true"/>
+                                               <cond s="6" e="10" id="359" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="6" e="10">
+                                       <br s="8" e="10">
+                                               <cond s="19" e="35" id="360" count="0" val="true"/>
+                                               <cond s="11" e="18" id="361" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="11" e="18">
+                                       <exit s="18" e="18" opcode="athrow"/>
+                               </bl>
+                               <bl s="19" e="35">
+                                       <br s="33" e="35">
+                                               <cond s="38" e="48" id="362" count="215" val="true"/>
+                                               <cond s="36" e="37" id="363" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="36" e="37">
+                                       <exit s="37" e="37" opcode="ireturn"/>
+                               </bl>
+                               <bl s="38" e="48">
+                                       <br s="46" e="48">
+                                               <cond s="55" e="59" id="364" count="184" val="true"/>
+                                               <cond s="49" e="54" id="365" count="31" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="49" e="54">
+                                       <exit s="54" e="54" opcode="ireturn"/>
+                               </bl>
+                               <bl s="55" e="59">
+                                       <br s="57" e="59">
+                                               <cond s="62" e="82" id="366" count="148" val="true"/>
+                                               <cond s="60" e="61" id="367" count="36" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="60" e="61">
+                                       <exit s="61" e="61" opcode="ireturn"/>
+                               </bl>
+                               <bl s="62" e="82">
+                                       <br s="80" e="82">
+                                               <cond s="94" e="113" id="368" count="148" val="true"/>
+                                               <cond s="83" e="93" id="369" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="83" e="93">
+                                       <exit s="93" e="93" opcode="athrow"/>
+                               </bl>
+                               <bl s="94" e="113">
+                                       <exit s="113" e="113" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=82;19=84;29=86;36=88;38=91;49=92;53=93;55=96;60=98;62=101;74=102;83=103;94=106;103=107;112=109;</lt>
+                       </meth>
+                       <meth name="startElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)Lnet/jaekl/qd/xml/ParseResult;" flags=' public' access="1" length="152">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="370" count="255"/>
+                                       <br s="3" e="5">
+                                               <cond s="19" e="33" id="371" count="255" val="true"/>
+                                               <cond s="6" e="10" id="372" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="6" e="10">
+                                       <br s="8" e="10">
+                                               <cond s="19" e="33" id="373" count="0" val="true"/>
+                                               <cond s="11" e="18" id="374" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="11" e="18">
+                                       <exit s="18" e="18" opcode="athrow"/>
+                               </bl>
+                               <bl s="19" e="33">
+                                       <br s="31" e="33">
+                                               <cond s="54" e="64" id="375" count="208" val="true"/>
+                                               <cond s="34" e="44" id="376" count="47" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="34" e="44">
+                                       <br s="42" e="44">
+                                               <cond s="52" e="53" id="377" count="19" val="true"/>
+                                               <cond s="45" e="51" id="378" count="28" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="45" e="51">
+                                       <exit s="51" e="51" opcode="areturn"/>
+                               </bl>
+                               <bl s="52" e="53">
+                                       <exit s="53" e="53" opcode="areturn"/>
+                               </bl>
+                               <bl s="54" e="64">
+                                       <br s="62" e="64">
+                                               <cond s="76" e="94" id="379" count="60" val="true"/>
+                                               <cond s="65" e="75" id="380" count="148" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="65" e="75">
+                                       <exit s="75" e="75" opcode="areturn"/>
+                               </bl>
+                               <bl s="76" e="94">
+                                       <br s="92" e="94">
+                                               <cond s="150" e="151" id="381" count="40" val="true"/>
+                                               <cond s="95" e="125" id="382" count="20" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="95" e="125">
+                                       <exit s="125" e="125" opcode="areturn"/>
+                               </bl>
+                               <bl s="126" e="137">
+                                       <catch s="126" e="137" id="383" count="0"/>
+                                       <exit s="137" e="137" opcode="athrow"/>
+                               </bl>
+                               <bl s="138" e="149">
+                                       <catch s="138" e="149" id="384" count="0"/>
+                                       <exit s="149" e="149" opcode="athrow"/>
+                               </bl>
+                               <bl s="150" e="151">
+                                       <exit s="151" e="151" opcode="areturn"/>
+                               </bl>
+                               <lt>0=116;19=118;27=120;34=123;45=124;50=125;52=132;54=136;65=137;74=138;76=141;89=142;95=144;105=145;115=146;126=148;128=149;138=151;140=152;150=157;</lt>
+                       </meth>
+                       <meth name="validate" vmsig="()V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="385" count="31"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=164;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="18">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="386" count="1"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="387" count="0" val="true"/>
+                                               <cond s="9" e="12" id="388" count="1" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="17" id="389" count="1"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="17">
+                                       <fall s="14" e="17" id="390" count="0"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=19;</lt>
+                       </meth>
+               </class>
+               <class name="XmlParseException" supername="net/jaekl/qd/QDException" checksum="3943647990" source="XmlParseException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="391" count="3"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=9;4=11;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/Throwable;)V" flags=' public' access="1" cons="true" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="392" count="0"/>
+                                       <exit s="5" e="5" opcode="return"/>
+                               </bl>
+                               <lt>0=14;5=15;</lt>
+                       </meth>
+               </class>
+       </package>
+</coverage>
diff --git a/setcp.sh b/setcp.sh
new file mode 100644 (file)
index 0000000..255f177
--- /dev/null
+++ b/setcp.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+export CLASSPATH=${SCRIPT_DIR}/WEB-INF/classes
+
+for x in ${SCRIPT_DIR}/WEB-INF/lib/*.jar
+do
+    export CLASSPATH=${x}:${CLASSPATH}
+done
+
+export CLASSPATH=/usr/share/java/jenkins-winstone.jar:${CLASSPATH}
+export CLASSPATH=/usr/share/java/junit4.jar:${CLASSPATH}
+#export CLASSPATH=${SCRIPT_DIR}/jcov/jcov.jar:${CLASSPATH}
diff --git a/template.xml b/template.xml
new file mode 100644 (file)
index 0000000..04f10a7
--- /dev/null
@@ -0,0 +1,1898 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<coverage
+        xmlns='http://java.sun.com/jcov/namespace'
+        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
+        xsi:schemaLocation='http://java.sun.com/jcov/namespace coverage.xsd'>
+
+       <head>
+               <property name='coverage.generator.args' val=''/>
+               <property name='coverage.generator.mode' val='BRANCH'/>
+               <property name='coverage.generator.internal' val='include'/>
+               <property name='coverage.generator.include' val=''/>
+               <property name='coverage.generator.exclude' val=''/>
+               <property name='coverage.generator.caller_include' val='.*'/>
+               <property name='coverage.generator.caller_exclude' val=''/>
+               <property name='coverage.created.date' val='2014-12-12'/>
+               <property name='coverage.created.time' val='04:31:01'/>
+               <property name='coverage.generator.fullversion' val='2.0os.beta-1 built: 09 November 2014'/>
+               <property name='coverage.generator.name' val='jcov'/>
+               <property name='coverage.generator.version' val='2.0'/>
+               <property name='coverage.spec.version' val='1.3'/>
+               <property name='java.runtime.version' val='1.7.0_65-b32'/>
+               <property name='java.version' val='1.7.0_65'/>
+               <property name='os.arch' val='amd64'/>
+               <property name='os.name' val='Linux'/>
+               <property name='os.version' val='3.2.0-4-amd64'/>
+               <property name='user.name' val='chris'/>
+               <property name='dynamic.collected' val='false'/>
+               <property name='id.count' val='393'/>
+       </head>
+       <package name="net.jaekl.frank">
+               <class name="FrankBundle" supername="java/lang/Object" checksum="3968860020" source="FrankBundle.java" flags=' public'>
+                       <meth name="getInst" vmsig="(Ljava/util/Locale;)Lnet/jaekl/frank/FrankBundle;" flags=' public static' access="9" length="68">
+                               <bl s="0" e="15">
+                                       <methenter s="0" e="15" id="0" count="0"/>
+                                       <br s="13" e="15">
+                                               <cond s="66" e="67" id="1" count="0" val="true"/>
+                                               <cond s="16" e="37" id="2" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="16" e="37">
+                                       <br s="35" e="37">
+                                               <cond s="47" e="60" id="3" count="0" val="true"/>
+                                               <cond s="38" e="46" id="4" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="38" e="46">
+                               </bl>
+                               <bl s="47" e="60">
+                                       <fall s="47" e="60" id="7" count="0"/>
+                                       <goto s="58" e="60">
+                                               <tg s="66" e="67" id="5" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="61" e="65">
+                                       <catch s="61" e="65" id="6" count="0"/>
+                                       <exit s="65" e="65" opcode="athrow"/>
+                               </bl>
+                               <bl s="66" e="67">
+                                       <exit s="67" e="67" opcode="areturn"/>
+                               </bl>
+                               <lt>0=31;11=32;16=33;22=34;33=35;38=36;47=38;56=39;66=41;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/util/Locale;)V" flags=' private' access="2" cons="true" length="18">
+                               <bl s="0" e="17">
+                                       <methenter s="0" e="17" id="8" count="0"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=44;4=45;17=46;</lt>
+                       </meth>
+                       <meth name="get" vmsig="(Ljava/lang/String;)Ljava/lang/String;" flags=' public' access="1" length="50">
+                               <bl s="0" e="7">
+                                       <methenter s="0" e="7" id="9" count="0"/>
+                                       <br s="5" e="7">
+                                               <cond s="17" e="19" id="10" count="0" val="true"/>
+                                               <cond s="8" e="16" id="11" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="8" e="16">
+                                       <exit s="16" e="16" opcode="areturn"/>
+                               </bl>
+                               <bl s="17" e="19">
+                                       <goto s="17" e="19">
+                                               <tg s="25" e="49" id="12" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="20" e="24">
+                                       <catch s="20" e="24" id="13" count="0"/>
+                               </bl>
+                               <bl s="25" e="49">
+                                       <fall s="25" e="49" id="14" count="0"/>
+                                       <exit s="49" e="49" opcode="areturn"/>
+                               </bl>
+                               <lt>0=50;8=51;17=58;20=54;21=56;25=59;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="11">
+                               <bl s="0" e="10">
+                                       <methenter s="0" e="10" id="15" count="0"/>
+                                       <exit s="10" e="10" opcode="return"/>
+                               </bl>
+                               <lt>0=26;</lt>
+                       </meth>
+               </class>
+               <class name="FrankException" supername="java/lang/Exception" checksum="1281835878" source="FrankException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/Throwable;)V" flags=' public' access="1" cons="true" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="16" count="0"/>
+                                       <exit s="5" e="5" opcode="return"/>
+                               </bl>
+                               <lt>0=9;5=10;</lt>
+                       </meth>
+               </class>
+               <class name="Schedule" supername="java/lang/Object" checksum="1001566032" source="Schedule.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/util/Locale;)V" flags=' public' access="1" cons="true" length="46">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="17" count="0"/>
+                                       <exit s="45" e="45" opcode="return"/>
+                               </bl>
+                               <lt>0=20;4=21;9=22;17=23;31=24;45=25;</lt>
+                       </meth>
+                       <meth name="trans" vmsig="(Ljava/lang/String;)Ljava/lang/String;" flags='' access="0" length="9">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="18" count="0"/>
+                                       <exit s="8" e="8" opcode="areturn"/>
+                               </bl>
+                               <lt>0=28;</lt>
+                       </meth>
+                       <meth name="mapUrl" vmsig="(DD)Ljava/lang/String;" flags='' access="0" length="34">
+                               <bl s="0" e="33">
+                                       <methenter s="0" e="33" id="19" count="0"/>
+                                       <exit s="33" e="33" opcode="areturn"/>
+                               </bl>
+                               <lt>0=32;</lt>
+                       </meth>
+                       <meth name="writeStyle" vmsig="(Ljava/io/PrintWriter;)V" flags='' access="0" length="43">
+                               <bl s="0" e="42">
+                                       <methenter s="0" e="42" id="20" count="0"/>
+                                       <exit s="42" e="42" opcode="return"/>
+                               </bl>
+                               <lt>0=36;6=37;12=38;18=39;24=40;30=41;36=42;42=43;</lt>
+                       </meth>
+                       <meth name="writeScript" vmsig="(Ljava/io/PrintWriter;Ljava/lang/String;I)V" flags='' access="0" length="235">
+                               <bl s="0" e="234">
+                                       <methenter s="0" e="234" id="21" count="0"/>
+                                       <exit s="234" e="234" opcode="return"/>
+                               </bl>
+                               <lt>0=47;8=48;16=50;22=51;28=52;56=53;62=54;68=55;74=56;113=57;141=58;147=59;153=60;159=61;165=62;171=63;177=64;210=65;216=66;222=67;228=68;234=70;</lt>
+                       </meth>
+                       <meth name="writeHeader" vmsig="(Ljava/io/PrintWriter;Ljava/lang/String;)V" flags='' access="0" length="52">
+                               <bl s="0" e="51">
+                                       <methenter s="0" e="51" id="22" count="0"/>
+                                       <exit s="51" e="51" opcode="return"/>
+                               </bl>
+                               <lt>0=73;6=74;12=75;40=76;45=77;51=78;</lt>
+                       </meth>
+                       <meth name="writePage" vmsig="(Ljava/io/PrintWriter;Lnet/jaekl/frank/octranspo/StopInfo;)V" flags='' access="0" length="698">
+                               <bl s="0" e="223">
+                                       <methenter s="0" e="223" id="23" count="0"/>
+                               </bl>
+                               <bl s="224" e="232">
+                                       <fall s="224" e="232" id="41" count="0"/>
+                                       <br s="230" e="232">
+                                               <cond s="602" e="697" id="24" count="0" val="true"/>
+                                               <cond s="233" e="243" id="25" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="233" e="243">
+                               </bl>
+                               <bl s="244" e="253">
+                                       <fall s="244" e="253" id="42" count="0"/>
+                                       <br s="251" e="253">
+                                               <cond s="596" e="601" id="26" count="0" val="true"/>
+                                               <cond s="254" e="274" id="27" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="254" e="274">
+                                       <br s="272" e="274">
+                                               <cond s="279" e="279" id="28" count="0" val="true"/>
+                                               <cond s="275" e="278" id="29" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="275" e="278">
+                                       <goto s="276" e="278">
+                                               <tg s="280" e="286" id="30" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="279" e="279">
+                               </bl>
+                               <bl s="280" e="286">
+                                       <fall s="280" e="286" id="43" count="0"/>
+                                       <br s="284" e="286">
+                                               <cond s="296" e="301" id="31" count="0" val="true"/>
+                                               <cond s="287" e="295" id="32" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="287" e="295">
+                                       <goto s="293" e="295">
+                                               <tg s="302" e="456" id="33" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="296" e="301">
+                               </bl>
+                               <bl s="302" e="456">
+                                       <fall s="302" e="456" id="44" count="0"/>
+                                       <br s="454" e="456">
+                                               <cond s="464" e="486" id="34" count="0" val="true"/>
+                                               <cond s="457" e="463" id="35" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="457" e="463">
+                               </bl>
+                               <bl s="464" e="486">
+                                       <fall s="464" e="486" id="45" count="0"/>
+                                       <br s="484" e="486">
+                                               <cond s="523" e="583" id="36" count="0" val="true"/>
+                                               <cond s="487" e="522" id="37" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="487" e="522">
+                                       <goto s="520" e="522">
+                                               <tg s="584" e="595" id="38" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="523" e="583">
+                               </bl>
+                               <bl s="584" e="595">
+                                       <fall s="584" e="595" id="46" count="0"/>
+                                       <goto s="593" e="595">
+                                               <tg s="244" e="253" id="39" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="596" e="601">
+                                       <goto s="599" e="601">
+                                               <tg s="224" e="232" id="40" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="602" e="697">
+                                       <exit s="697" e="697" opcode="return"/>
+                               </bl>
+                               <lt>0=82;10=83;13=85;49=86;57=88;91=90;97=91;103=92;132=93;221=105;233=106;241=107;254=108;263=109;282=110;287=112;296=114;302=116;334=117;366=118;405=120;452=121;457=122;464=124;474=125;477=127;487=128;523=131;584=134;590=107;596=105;602=138;608=140;616=141;644=142;673=144;680=145;691=146;697=147;</lt>
+                       </meth>
+               </class>
+               <class name="ViewSchedule" supername="javax/servlet/http/HttpServlet" checksum="1813169406" source="ViewSchedule.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="47" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=19;</lt>
+                       </meth>
+                       <meth name="getParamInt" vmsig="(Ljavax/servlet/http/HttpServletRequest;Ljava/lang/String;)I" flags='' access="0" length="16">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="48" count="0"/>
+                                       <exit s="11" e="11" opcode="ireturn"/>
+                               </bl>
+                               <bl s="12" e="15">
+                                       <catch s="12" e="15" id="49" count="0"/>
+                                       <exit s="15" e="15" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=28;7=30;12=32;14=34;</lt>
+                       </meth>
+                       <meth name="getParamString" vmsig="(Ljavax/servlet/http/HttpServletRequest;Ljava/lang/String;)Ljava/lang/String;" flags='' access="0" length="26">
+                               <bl s="0" e="12">
+                                       <methenter s="0" e="12" id="50" count="0"/>
+                                       <br s="10" e="12">
+                                               <cond s="22" e="23" id="51" count="0" val="true"/>
+                                               <cond s="13" e="21" id="52" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="13" e="21">
+                                       <br s="19" e="21">
+                                               <cond s="24" e="25" id="53" count="0" val="true"/>
+                                               <cond s="22" e="23" id="54" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="22" e="23">
+                                       <exit s="23" e="23" opcode="areturn"/>
+                               </bl>
+                               <bl s="24" e="25">
+                                       <exit s="25" e="25" opcode="areturn"/>
+                               </bl>
+                               <lt>0=39;8=40;22=42;24=44;</lt>
+                       </meth>
+                       <meth name="getLocale" vmsig="(Ljavax/servlet/http/HttpServletRequest;)Ljava/util/Locale;" flags='' access="0" length="35">
+                               <bl s="0" e="14">
+                                       <methenter s="0" e="14" id="55" count="0"/>
+                                       <br s="12" e="14">
+                                               <cond s="24" e="28" id="56" count="0" val="true"/>
+                                               <cond s="15" e="23" id="57" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="15" e="23">
+                               </bl>
+                               <bl s="24" e="28">
+                                       <fall s="24" e="28" id="60" count="0"/>
+                                       <br s="26" e="28">
+                                               <cond s="33" e="34" id="58" count="0" val="true"/>
+                                               <cond s="29" e="32" id="59" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="29" e="32">
+                               </bl>
+                               <bl s="33" e="34">
+                                       <fall s="33" e="34" id="61" count="0"/>
+                                       <exit s="34" e="34" opcode="areturn"/>
+                               </bl>
+                               <lt>0=48;2=49;10=50;15=51;24=53;29=54;33=56;</lt>
+                       </meth>
+                       <meth name="doGet" vmsig="(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V" flags=' public' access="1" length="148">
+                               <bl s="0" e="72">
+                                       <methenter s="0" e="72" id="62" count="0"/>
+                                       <br s="70" e="72">
+                                               <cond s="85" e="95" id="63" count="0" val="true"/>
+                                               <cond s="73" e="84" id="64" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="73" e="84">
+                                       <goto s="82" e="84">
+                                               <tg s="96" e="122" id="65" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="85" e="95">
+                               </bl>
+                               <bl s="96" e="122">
+                                       <fall s="96" e="122" id="70" count="0"/>
+                                       <goto s="120" e="122">
+                                               <tg s="133" e="135" id="66" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="123" e="132">
+                                       <catch s="123" e="132" id="68" count="0"/>
+                                       <exit s="132" e="132" opcode="athrow"/>
+                               </bl>
+                               <bl s="133" e="135">
+                                       <goto s="133" e="135">
+                                               <tg s="147" e="147" id="67" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="136" e="146">
+                                       <catch s="136" e="146" id="69" count="0"/>
+                               </bl>
+                               <bl s="147" e="147">
+                                       <fall s="147" e="147" id="71" count="0"/>
+                                       <exit s="147" e="147" opcode="return"/>
+                               </bl>
+                               <lt>0=63;8=64;15=66;22=67;31=68;40=71;51=73;64=74;67=76;73=77;85=80;96=82;107=84;115=87;120=88;123=87;133=92;136=90;138=91;147=93;</lt>
+                       </meth>
+                       <meth name="writeErrorPage" vmsig="(Ljava/io/PrintWriter;Ljava/lang/Throwable;Ljava/util/Locale;)V" flags='' access="0" length="156">
+                               <bl s="0" e="155">
+                                       <methenter s="0" e="155" id="72" count="0"/>
+                                       <exit s="155" e="155" opcode="return"/>
+                               </bl>
+                               <lt>0=96;9=97;20=98;26=100;75=104;124=116;130=117;137=118;143=120;149=121;155=122;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.frank.octranspo">
+               <class name="NextTrips" supername="net/jaekl/frank/octranspo/StopInfo" checksum="2503522746" source="NextTrips.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="13">
+                               <bl s="0" e="12">
+                                       <methenter s="0" e="12" id="73" count="0"/>
+                                       <exit s="12" e="12" opcode="return"/>
+                               </bl>
+                               <lt>0=9;12=10;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="58">
+                               <bl s="0" e="57">
+                                       <methenter s="0" e="57" id="74" count="0"/>
+                                       <exit s="57" e="57" opcode="return"/>
+                               </bl>
+                               <lt>0=5;31=6;</lt>
+                       </meth>
+               </class>
+               <class name="Route" supername="net/jaekl/qd/xml/ParseResult" checksum="3494611020" source="Route.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="46">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="75" count="0"/>
+                                       <exit s="45" e="45" opcode="return"/>
+                               </bl>
+                               <lt>0=29;12=30;17=31;22=32;28=33;34=34;45=35;</lt>
+                       </meth>
+                       <meth name="getRouteNo" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="76" count="0"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=37;</lt>
+                       </meth>
+                       <meth name="getDirectionID" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="77" count="0"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=38;</lt>
+                       </meth>
+                       <meth name="getDirection" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="78" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=39;</lt>
+                       </meth>
+                       <meth name="getRouteHeading" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="79" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=40;</lt>
+                       </meth>
+                       <meth name="getNumTrips" vmsig="()I" flags=' public' access="1" length="8">
+                               <bl s="0" e="7">
+                                       <methenter s="0" e="7" id="80" count="0"/>
+                                       <exit s="7" e="7" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=41;</lt>
+                       </meth>
+                       <meth name="getTrip" vmsig="(I)Lnet/jaekl/frank/octranspo/Trip;" flags=' public' access="1" length="19">
+                               <bl s="0" e="18">
+                                       <methenter s="0" e="18" id="81" count="0"/>
+                                       <exit s="18" e="18" opcode="areturn"/>
+                               </bl>
+                               <lt>0=42;</lt>
+                       </meth>
+                       <meth name="endContents" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="85">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="82" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="21" e="29" id="83" count="0" val="true"/>
+                                               <cond s="9" e="20" id="84" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="20">
+                                       <goto s="18" e="20">
+                                               <tg s="84" e="84" id="85" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="21" e="29">
+                                       <br s="27" e="29">
+                                               <cond s="42" e="50" id="86" count="0" val="true"/>
+                                               <cond s="30" e="41" id="87" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="30" e="41">
+                                       <goto s="39" e="41">
+                                               <tg s="84" e="84" id="88" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="42" e="50">
+                                       <br s="48" e="50">
+                                               <cond s="60" e="68" id="89" count="0" val="true"/>
+                                               <cond s="51" e="59" id="90" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="51" e="59">
+                                       <goto s="57" e="59">
+                                               <tg s="84" e="84" id="91" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="60" e="68">
+                                       <br s="66" e="68">
+                                               <cond s="78" e="83" id="92" count="0" val="true"/>
+                                               <cond s="69" e="77" id="93" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="69" e="77">
+                                       <br s="75" e="77">
+                                               <cond s="84" e="84" id="94" count="0" val="true"/>
+                                               <cond s="78" e="83" id="95" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="78" e="83">
+                               </bl>
+                               <bl s="84" e="84">
+                                       <fall s="84" e="84" id="96" count="0"/>
+                                       <exit s="84" e="84" opcode="return"/>
+                               </bl>
+                               <lt>0=47;9=48;21=50;30=51;42=53;51=54;60=56;78=57;84=59;</lt>
+                       </meth>
+                       <meth name="endExternal" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="86">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="97" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="85" e="85" id="98" count="0" val="true"/>
+                                               <cond s="9" e="29" id="99" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="29">
+                               </bl>
+                               <bl s="30" e="36">
+                                       <fall s="30" e="36" id="107" count="0"/>
+                                       <br s="34" e="36">
+                                               <cond s="85" e="85" id="100" count="0" val="true"/>
+                                               <cond s="37" e="49" id="101" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="37" e="49">
+                                       <br s="47" e="49">
+                                               <cond s="66" e="84" id="102" count="0" val="true"/>
+                                               <cond s="50" e="57" id="103" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="50" e="57">
+                                       <br s="55" e="57">
+                                               <cond s="66" e="84" id="104" count="0" val="true"/>
+                                               <cond s="58" e="65" id="105" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="58" e="65">
+                                       <exit s="65" e="65" opcode="athrow"/>
+                               </bl>
+                               <bl s="66" e="84">
+                                       <goto s="82" e="84">
+                                               <tg s="30" e="36" id="106" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="85" e="85">
+                                       <exit s="85" e="85" opcode="return"/>
+                               </bl>
+                               <lt>0=64;9=65;18=66;44=67;66=68;79=66;85=71;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="81">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="108" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="109" count="0" val="true"/>
+                                               <cond s="9" e="12" id="110" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="80" id="111" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="80">
+                                       <fall s="14" e="80" id="112" count="0"/>
+                                       <exit s="80" e="80" opcode="return"/>
+                               </bl>
+                               <lt>0=7;17=19;55=20;</lt>
+                       </meth>
+               </class>
+               <class name="RouteSummary" supername="net/jaekl/frank/octranspo/StopInfo" checksum="4047748583" source="RouteSummary.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="13">
+                               <bl s="0" e="12">
+                                       <methenter s="0" e="12" id="113" count="0"/>
+                                       <exit s="12" e="12" opcode="return"/>
+                               </bl>
+                               <lt>0=9;12=10;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="58">
+                               <bl s="0" e="57">
+                                       <methenter s="0" e="57" id="114" count="0"/>
+                                       <exit s="57" e="57" opcode="return"/>
+                               </bl>
+                               <lt>0=5;31=6;</lt>
+                       </meth>
+               </class>
+               <class name="Server" supername="java/lang/Object" checksum="2104221183" source="Server.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;Ljava/io/InputStream;)V" flags=' public' access="1" cons="true" length="130">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="115" count="0"/>
+                                       <br s="7" e="9">
+                                               <cond s="23" e="28" id="116" count="0" val="true"/>
+                                               <cond s="10" e="14" id="117" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="14">
+                                       <br s="12" e="14">
+                                               <cond s="23" e="28" id="118" count="0" val="true"/>
+                                               <cond s="15" e="22" id="119" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="15" e="22">
+                                       <exit s="22" e="22" opcode="athrow"/>
+                               </bl>
+                               <bl s="23" e="28">
+                                       <br s="26" e="28">
+                                               <cond s="42" e="129" id="120" count="0" val="true"/>
+                                               <cond s="29" e="33" id="121" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="29" e="33">
+                                       <br s="31" e="33">
+                                               <cond s="42" e="129" id="122" count="0" val="true"/>
+                                               <cond s="34" e="41" id="123" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="34" e="41">
+                                       <exit s="41" e="41" opcode="athrow"/>
+                               </bl>
+                               <bl s="42" e="129">
+                                       <exit s="129" e="129" opcode="return"/>
+                               </bl>
+                               <lt>0=33;4=34;23=35;42=37;58=38;64=40;75=41;93=42;112=44;129=45;</lt>
+                       </meth>
+                       <meth name="getRouteSummaryForStop" vmsig="(I)Lnet/jaekl/frank/octranspo/StopInfo;" flags=' public' access="1" length="56">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="124" count="0"/>
+                                       <exit s="45" e="45" opcode="areturn"/>
+                               </bl>
+                               <bl s="46" e="55">
+                                       <catch s="46" e="55" id="125" count="0"/>
+                                       <exit s="55" e="55" opcode="athrow"/>
+                               </bl>
+                               <lt>0=51;8=52;29=53;46=55;47=56;</lt>
+                       </meth>
+                       <meth name="getNextTripsForStop" vmsig="(II)Lnet/jaekl/frank/octranspo/StopInfo;" flags=' public' access="1" length="77">
+                               <bl s="0" e="66">
+                                       <methenter s="0" e="66" id="126" count="0"/>
+                                       <exit s="66" e="66" opcode="areturn"/>
+                               </bl>
+                               <bl s="67" e="76">
+                                       <catch s="67" e="76" id="127" count="0"/>
+                                       <exit s="76" e="76" opcode="athrow"/>
+                               </bl>
+                               <lt>0=64;8=65;29=66;50=67;67=69;68=70;</lt>
+                       </meth>
+                       <meth name="getNextTripsForStopAllRoutes" vmsig="(I)Lnet/jaekl/frank/octranspo/StopInfo;" flags=' public' access="1" length="56">
+                               <bl s="0" e="45">
+                                       <methenter s="0" e="45" id="128" count="0"/>
+                                       <exit s="45" e="45" opcode="areturn"/>
+                               </bl>
+                               <bl s="46" e="55">
+                                       <catch s="46" e="55" id="129" count="0"/>
+                                       <exit s="55" e="55" opcode="athrow"/>
+                               </bl>
+                               <lt>0=78;8=79;29=80;46=82;47=83;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="18">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="130" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="131" count="0" val="true"/>
+                                               <cond s="9" e="12" id="132" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="17" id="133" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="17">
+                                       <fall s="14" e="17" id="134" count="0"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=16;</lt>
+                       </meth>
+               </class>
+               <class name="StopInfo" supername="net/jaekl/qd/xml/ParseResult" checksum="2473993047" source="StopInfo.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;[Ljava/lang/String;[[Ljava/lang/Object;)V" flags=' public' access="1" cons="true" length="36">
+                               <bl s="0" e="35">
+                                       <methenter s="0" e="35" id="135" count="0"/>
+                                       <exit s="35" e="35" opcode="return"/>
+                               </bl>
+                               <lt>0=26;7=28;12=29;18=30;24=31;35=32;</lt>
+                       </meth>
+                       <meth name="getStopNo" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="136" count="0"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=37;</lt>
+                       </meth>
+                       <meth name="getDescr" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="137" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=38;</lt>
+                       </meth>
+                       <meth name="getError" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="138" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=39;</lt>
+                       </meth>
+                       <meth name="getNumRoutes" vmsig="()I" flags=' public' access="1" length="8">
+                               <bl s="0" e="7">
+                                       <methenter s="0" e="7" id="139" count="0"/>
+                                       <exit s="7" e="7" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=40;</lt>
+                       </meth>
+                       <meth name="getRoute" vmsig="(I)Lnet/jaekl/frank/octranspo/Route;" flags=' public' access="1" length="12">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="140" count="0"/>
+                                       <exit s="11" e="11" opcode="areturn"/>
+                               </bl>
+                               <lt>0=41;</lt>
+                       </meth>
+                       <meth name="endContents" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="87">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="141" count="0"/>
+                                       <br s="3" e="5">
+                                               <cond s="19" e="28" id="142" count="0" val="true"/>
+                                               <cond s="6" e="10" id="143" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="6" e="10">
+                                       <br s="8" e="10">
+                                               <cond s="19" e="28" id="144" count="0" val="true"/>
+                                               <cond s="11" e="18" id="145" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="11" e="18">
+                                       <exit s="18" e="18" opcode="athrow"/>
+                               </bl>
+                               <bl s="19" e="28">
+                                       <br s="26" e="28">
+                                               <cond s="41" e="50" id="146" count="0" val="true"/>
+                                               <cond s="29" e="40" id="147" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="29" e="40">
+                                       <goto s="38" e="40">
+                                               <tg s="86" e="86" id="148" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="41" e="50">
+                                       <br s="48" e="50">
+                                               <cond s="61" e="69" id="149" count="0" val="true"/>
+                                               <cond s="51" e="60" id="150" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="51" e="60">
+                                       <br s="58" e="60">
+                                               <cond s="70" e="79" id="151" count="0" val="true"/>
+                                               <cond s="61" e="69" id="152" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="61" e="69">
+                                       <goto s="67" e="69">
+                                               <tg s="86" e="86" id="153" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="70" e="79">
+                                       <br s="77" e="79">
+                                               <cond s="86" e="86" id="154" count="0" val="true"/>
+                                               <cond s="80" e="85" id="155" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="80" e="85">
+                               </bl>
+                               <bl s="86" e="86">
+                                       <fall s="86" e="86" id="156" count="0"/>
+                                       <exit s="86" e="86" opcode="return"/>
+                               </bl>
+                               <lt>0=49;19=51;29=52;41=54;61=55;70=57;80=58;86=60;</lt>
+                       </meth>
+                       <meth name="endExternal" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="87">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="157" count="0"/>
+                                       <br s="7" e="9">
+                                               <cond s="86" e="86" id="158" count="0" val="true"/>
+                                               <cond s="10" e="30" id="159" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="30">
+                               </bl>
+                               <bl s="31" e="37">
+                                       <fall s="31" e="37" id="167" count="0"/>
+                                       <br s="35" e="37">
+                                               <cond s="86" e="86" id="160" count="0" val="true"/>
+                                               <cond s="38" e="50" id="161" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="38" e="50">
+                                       <br s="48" e="50">
+                                               <cond s="67" e="85" id="162" count="0" val="true"/>
+                                               <cond s="51" e="58" id="163" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="51" e="58">
+                                       <br s="56" e="58">
+                                               <cond s="67" e="85" id="164" count="0" val="true"/>
+                                               <cond s="59" e="66" id="165" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="59" e="66">
+                                       <exit s="66" e="66" opcode="athrow"/>
+                               </bl>
+                               <bl s="67" e="85">
+                                       <goto s="83" e="85">
+                                               <tg s="31" e="37" id="166" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="86" e="86">
+                                       <exit s="86" e="86" opcode="return"/>
+                               </bl>
+                               <lt>0=65;10=66;19=67;45=68;67=69;80=67;86=72;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="48">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="168" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="169" count="0" val="true"/>
+                                               <cond s="9" e="12" id="170" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="47" id="171" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="47">
+                                       <fall s="14" e="47" id="172" count="0"/>
+                                       <exit s="47" e="47" opcode="return"/>
+                               </bl>
+                               <lt>0=8;17=11;22=12;27=13;32=14;37=15;42=16;</lt>
+                       </meth>
+               </class>
+               <class name="Trip" supername="net/jaekl/qd/xml/ParseResult" checksum="1733828479" source="Trip.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="90">
+                               <bl s="0" e="89">
+                                       <methenter s="0" e="89" id="173" count="0"/>
+                                       <exit s="89" e="89" opcode="return"/>
+                               </bl>
+                               <lt>0=50;12=51;18=52;29=53;34=54;39=55;44=56;50=57;55=58;60=59;65=61;78=62;89=63;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Lnet/jaekl/frank/octranspo/Trip;)V" flags=' public' access="1" cons="true" length="93">
+                               <bl s="0" e="92">
+                                       <methenter s="0" e="92" id="174" count="0"/>
+                                       <exit s="92" e="92" opcode="return"/>
+                               </bl>
+                               <lt>0=66;12=67;20=68;28=69;36=70;44=71;52=72;60=73;68=74;76=75;84=76;92=77;</lt>
+                       </meth>
+                       <meth name="getDest" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="175" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=79;</lt>
+                       </meth>
+                       <meth name="getStart" vmsig="()Ljava/util/Date;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="176" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=80;</lt>
+                       </meth>
+                       <meth name="getAdjTime" vmsig="()I" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="177" count="0"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=81;</lt>
+                       </meth>
+                       <meth name="getAdjAge" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="178" count="0"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=82;</lt>
+                       </meth>
+                       <meth name="isLastTrip" vmsig="()Z" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="179" count="0"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=83;</lt>
+                       </meth>
+                       <meth name="getBusType" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="180" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=84;</lt>
+                       </meth>
+                       <meth name="getSpeed" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="181" count="0"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=85;</lt>
+                       </meth>
+                       <meth name="getLongitude" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="182" count="0"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=86;</lt>
+                       </meth>
+                       <meth name="getLatitude" vmsig="()D" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="183" count="0"/>
+                                       <exit s="4" e="4" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=87;</lt>
+                       </meth>
+                       <meth name="getETA" vmsig="()Ljava/util/Date;" flags=' public' access="1" length="24">
+                               <bl s="0" e="23">
+                                       <methenter s="0" e="23" id="184" count="0"/>
+                                       <exit s="23" e="23" opcode="areturn"/>
+                               </bl>
+                               <lt>0=90;</lt>
+                       </meth>
+                       <meth name="getGPSTime" vmsig="()Ljava/util/Date;" flags=' public' access="1" length="25">
+                               <bl s="0" e="24">
+                                       <methenter s="0" e="24" id="185" count="0"/>
+                                       <exit s="24" e="24" opcode="areturn"/>
+                               </bl>
+                               <lt>0=93;</lt>
+                       </meth>
+                       <meth name="endContents" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="200">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="186" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="18" e="26" id="187" count="0" val="true"/>
+                                               <cond s="9" e="17" id="188" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="17">
+                                       <goto s="15" e="17">
+                                               <tg s="184" e="186" id="189" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="18" e="26">
+                                       <br s="24" e="26">
+                                               <cond s="43" e="51" id="190" count="0" val="true"/>
+                                               <cond s="27" e="42" id="191" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="27" e="42">
+                                       <goto s="40" e="42">
+                                               <tg s="184" e="186" id="192" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="43" e="51">
+                                       <br s="49" e="51">
+                                               <cond s="64" e="72" id="193" count="0" val="true"/>
+                                               <cond s="52" e="63" id="194" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="52" e="63">
+                                       <goto s="61" e="63">
+                                               <tg s="184" e="186" id="195" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="64" e="72">
+                                       <br s="70" e="72">
+                                               <cond s="85" e="93" id="196" count="0" val="true"/>
+                                               <cond s="73" e="84" id="197" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="73" e="84">
+                                       <goto s="82" e="84">
+                                               <tg s="184" e="186" id="198" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="85" e="93">
+                                       <br s="91" e="93">
+                                               <cond s="106" e="114" id="199" count="0" val="true"/>
+                                               <cond s="94" e="105" id="200" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="94" e="105">
+                                       <goto s="103" e="105">
+                                               <tg s="184" e="186" id="201" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="106" e="114">
+                                       <br s="112" e="114">
+                                               <cond s="124" e="132" id="202" count="0" val="true"/>
+                                               <cond s="115" e="123" id="203" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="115" e="123">
+                                       <goto s="121" e="123">
+                                               <tg s="184" e="186" id="204" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="124" e="132">
+                                       <br s="130" e="132">
+                                               <cond s="145" e="153" id="205" count="0" val="true"/>
+                                               <cond s="133" e="144" id="206" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="133" e="144">
+                                       <goto s="142" e="144">
+                                               <tg s="184" e="186" id="207" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="145" e="153">
+                                       <br s="151" e="153">
+                                               <cond s="166" e="174" id="208" count="0" val="true"/>
+                                               <cond s="154" e="165" id="209" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="154" e="165">
+                                       <goto s="163" e="165">
+                                               <tg s="184" e="186" id="210" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="166" e="174">
+                                       <br s="172" e="174">
+                                               <cond s="184" e="186" id="211" count="0" val="true"/>
+                                               <cond s="175" e="183" id="212" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="175" e="183">
+                               </bl>
+                               <bl s="184" e="186">
+                                       <fall s="184" e="186" id="215" count="0"/>
+                                       <goto s="184" e="186">
+                                               <tg s="199" e="199" id="213" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="187" e="198">
+                                       <catch s="187" e="198" id="214" count="0"/>
+                                       <exit s="198" e="198" opcode="athrow"/>
+                               </bl>
+                               <bl s="199" e="199">
+                                       <exit s="199" e="199" opcode="return"/>
+                               </bl>
+                               <lt>0=102;9=103;18=105;27=106;43=108;52=109;64=111;73=112;85=114;94=115;106=117;115=118;124=120;133=121;145=123;154=124;166=126;175=127;184=131;187=129;189=130;199=132;</lt>
+                       </meth>
+                       <meth name="endExternal" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="216" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=138;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="64">
+                               <bl s="0" e="63">
+                                       <methenter s="0" e="63" id="217" count="0"/>
+                                       <exit s="63" e="63" opcode="return"/>
+                               </bl>
+                               <lt>0=25;56=34;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd">
+               <class name="QDBundleFactory" supername="java/lang/Object" checksum="829198806" source="QDBundleFactory.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' private' access="2" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="218" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=20;4=22;</lt>
+                       </meth>
+                       <meth name="getInst" vmsig="()Lnet/jaekl/qd/QDBundleFactory;" flags=' public static' access="9" length="48">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="219" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="46" e="47" id="220" count="0" val="true"/>
+                                               <cond s="9" e="21" id="221" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="21">
+                                       <br s="19" e="21">
+                                               <cond s="32" e="40" id="222" count="0" val="true"/>
+                                               <cond s="22" e="31" id="223" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="22" e="31">
+                               </bl>
+                               <bl s="32" e="40">
+                                       <fall s="32" e="40" id="226" count="0"/>
+                                       <goto s="38" e="40">
+                                               <tg s="46" e="47" id="224" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="41" e="45">
+                                       <catch s="41" e="45" id="225" count="0"/>
+                                       <exit s="45" e="45" opcode="athrow"/>
+                               </bl>
+                               <bl s="46" e="47">
+                                       <exit s="47" e="47" opcode="areturn"/>
+                               </bl>
+                               <lt>0=25;4=26;9=27;15=28;22=29;32=31;36=32;46=34;</lt>
+                       </meth>
+                       <meth name="getBundle" vmsig="(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/ResourceBundle;" flags=' public' access="1" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="227" count="0"/>
+                                       <exit s="5" e="5" opcode="areturn"/>
+                               </bl>
+                               <lt>0=38;</lt>
+                       </meth>
+               </class>
+               <class name="QDException" supername="java/lang/Exception" checksum="3524936329" source="QDException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="228" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=8;4=9;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/Throwable;)V" flags=' public' access="1" cons="true" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="229" count="0"/>
+                                       <exit s="5" e="5" opcode="return"/>
+                               </bl>
+                               <lt>0=12;5=13;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd.http">
+               <class name="RequestBroker" supername="java/lang/Object" checksum="1232047242" source="RequestBroker.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;)V" flags=' public' access="1" cons="true" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;)V" length="35">
+                               <bl s="0" e="34">
+                                       <methenter s="0" e="34" id="230" count="0"/>
+                                       <exit s="34" e="34" opcode="return"/>
+                               </bl>
+                               <lt>0=40;4=33;10=34;17=41;22=42;34=43;</lt>
+                       </meth>
+                       <meth name="doSubmit" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;)Ljava/io/InputStream;" flags='' access="0" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;)Ljava/io/InputStream;" length="202">
+                               <bl s="0" e="146">
+                                       <methenter s="0" e="146" id="231" count="0"/>
+                                       <br s="144" e="146">
+                                               <cond s="159" e="161" id="232" count="0" val="true"/>
+                                               <cond s="147" e="158" id="233" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="147" e="158">
+                                       <exit s="158" e="158" opcode="areturn"/>
+                               </bl>
+                               <bl s="159" e="161">
+                                       <goto s="159" e="161">
+                                               <tg s="200" e="201" id="234" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="162" e="169">
+                                       <catch s="162" e="169" id="237" count="0"/>
+                                       <br s="167" e="169">
+                                               <cond s="178" e="187" id="235" count="0" val="true"/>
+                                               <cond s="170" e="177" id="236" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="170" e="177">
+                                       <exit s="177" e="177" opcode="athrow"/>
+                               </bl>
+                               <bl s="178" e="187">
+                                       <exit s="187" e="187" opcode="athrow"/>
+                               </bl>
+                               <bl s="188" e="199">
+                                       <catch s="188" e="199" id="238" count="0"/>
+                                       <exit s="199" e="199" opcode="athrow"/>
+                               </bl>
+                               <bl s="200" e="201">
+                                       <exit s="201" e="201" opcode="areturn"/>
+                               </bl>
+                               <lt>0=49;12=50;18=53;23=54;33=55;43=56;48=57;59=58;66=59;106=60;121=61;132=62;141=64;147=65;156=66;159=77;162=69;164=72;178=73;188=75;190=76;200=79;</lt>
+                       </meth>
+                       <meth name="submit" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;)Ljava/lang/String;" flags=' public' access="1" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;)Ljava/lang/String;" length="107">
+                               <bl s="0" e="43">
+                                       <methenter s="0" e="43" id="239" count="0"/>
+                               </bl>
+                               <bl s="44" e="49">
+                                       <fall s="44" e="49" id="246" count="0"/>
+                                       <br s="47" e="49">
+                                               <cond s="72" e="79" id="240" count="0" val="true"/>
+                                               <cond s="50" e="71" id="241" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="50" e="71">
+                                       <goto s="69" e="71">
+                                               <tg s="44" e="49" id="242" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="72" e="79">
+                                       <goto s="77" e="79">
+                                               <tg s="102" e="106" id="243" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="80" e="91">
+                                       <catch s="80" e="91" id="244" count="0"/>
+                                       <exit s="91" e="91" opcode="athrow"/>
+                               </bl>
+                               <bl s="92" e="101">
+                                       <catch s="92" e="101" id="245" count="0"/>
+                                       <exit s="101" e="101" opcode="athrow"/>
+                               </bl>
+                               <bl s="102" e="106">
+                                       <exit s="106" e="106" opcode="areturn"/>
+                               </bl>
+                               <lt>0=84;8=85;11=88;19=89;37=90;44=91;50=92;62=93;72=100;77=101;80=96;82=97;92=100;102=103;</lt>
+                       </meth>
+                       <meth name="submitAndParse" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/Class;)Lnet/jaekl/qd/xml/ParseResult;" flags=' public' access="1" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;Ljava/lang/Class&lt;+Lnet/jaekl/qd/xml/ParseResult;&gt;;)Lnet/jaekl/qd/xml/ParseResult;" length="9">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="247" count="0"/>
+                                       <exit s="8" e="8" opcode="areturn"/>
+                               </bl>
+                               <lt>0=111;</lt>
+                       </meth>
+                       <meth name="submitAndParse" vmsig="(Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/Class;Ljava/lang/String;)Lnet/jaekl/qd/xml/ParseResult;" flags=' public' access="1" signature="(Ljava/lang/String;Ljava/util/ArrayList&lt;Lorg/apache/http/NameValuePair;&gt;;Ljava/lang/Class&lt;+Lnet/jaekl/qd/xml/ParseResult;&gt;;Ljava/lang/String;)Lnet/jaekl/qd/xml/ParseResult;" length="137">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="248" count="0"/>
+                                       <br s="9" e="11">
+                                               <cond s="24" e="54" id="249" count="0" val="true"/>
+                                               <cond s="12" e="23" id="250" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="12" e="23">
+                                       <goto s="21" e="23">
+                                               <tg s="55" e="111" id="251" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="24" e="54">
+                               </bl>
+                               <bl s="55" e="111">
+                                       <fall s="55" e="111" id="255" count="0"/>
+                                       <goto s="109" e="111">
+                                               <tg s="134" e="136" id="252" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="112" e="123">
+                                       <catch s="112" e="123" id="253" count="0"/>
+                                       <exit s="123" e="123" opcode="athrow"/>
+                               </bl>
+                               <bl s="124" e="133">
+                                       <catch s="124" e="133" id="254" count="0"/>
+                                       <exit s="133" e="133" opcode="athrow"/>
+                               </bl>
+                               <bl s="134" e="136">
+                                       <exit s="136" e="136" opcode="areturn"/>
+                               </bl>
+                               <lt>0=120;3=121;6=124;12=125;24=128;55=130;63=131;68=132;79=133;88=134;104=147;109=148;112=136;114=144;124=147;134=150;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="18">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="256" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="257" count="0" val="true"/>
+                                               <cond s="9" e="12" id="258" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="17" id="259" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="17">
+                                       <fall s="14" e="17" id="260" count="0"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=31;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd.util">
+               <class name="ExceptionUtils" supername="java/lang/Object" checksum="3353308664" source="ExceptionUtils.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="261" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=8;</lt>
+                       </meth>
+                       <meth name="tryClose" vmsig="(Ljava/io/Closeable;)V" flags=' public static' access="9" length="25">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="262" count="0"/>
+                                       <br s="2" e="4">
+                                               <cond s="11" e="13" id="263" count="0" val="true"/>
+                                               <cond s="5" e="10" id="264" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="10">
+                               </bl>
+                               <bl s="11" e="13">
+                                       <fall s="11" e="13" id="267" count="0"/>
+                                       <goto s="11" e="13">
+                                               <tg s="24" e="24" id="265" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="14" e="23">
+                                       <catch s="14" e="23" id="266" count="0"/>
+                                       <exit s="23" e="23" opcode="athrow"/>
+                               </bl>
+                               <bl s="24" e="24">
+                                       <exit s="24" e="24" opcode="return"/>
+                               </bl>
+                               <lt>0=11;5=12;11=17;14=15;15=16;24=18;</lt>
+                       </meth>
+               </class>
+               <class name="ParseUtils" supername="java/lang/Object" checksum="624394704" source="ParseUtils.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="268" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=3;</lt>
+                       </meth>
+                       <meth name="parseDouble" vmsig="(Ljava/lang/String;)D" flags=' public static' access="9" length="24">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="269" count="0"/>
+                                       <br s="2" e="4">
+                                               <cond s="14" e="15" id="270" count="0" val="true"/>
+                                               <cond s="5" e="13" id="271" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="13">
+                                       <br s="11" e="13">
+                                               <cond s="16" e="20" id="272" count="0" val="true"/>
+                                               <cond s="14" e="15" id="273" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="14" e="15">
+                                       <exit s="15" e="15" opcode="dreturn"/>
+                               </bl>
+                               <bl s="16" e="20">
+                                       <exit s="20" e="20" opcode="dreturn"/>
+                               </bl>
+                               <bl s="21" e="23">
+                                       <catch s="21" e="23" id="274" count="0"/>
+                                       <exit s="23" e="23" opcode="dreturn"/>
+                               </bl>
+                               <lt>0=7;14=8;16=11;21=13;22=14;</lt>
+                       </meth>
+                       <meth name="parseInt" vmsig="(Ljava/lang/String;)I" flags=' public static' access="9" length="24">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="275" count="0"/>
+                                       <br s="2" e="4">
+                                               <cond s="14" e="15" id="276" count="0" val="true"/>
+                                               <cond s="5" e="13" id="277" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="13">
+                                       <br s="11" e="13">
+                                               <cond s="16" e="20" id="278" count="0" val="true"/>
+                                               <cond s="14" e="15" id="279" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="14" e="15">
+                                       <exit s="15" e="15" opcode="ireturn"/>
+                               </bl>
+                               <bl s="16" e="20">
+                                       <exit s="20" e="20" opcode="ireturn"/>
+                               </bl>
+                               <bl s="21" e="23">
+                                       <catch s="21" e="23" id="280" count="0"/>
+                                       <exit s="23" e="23" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=19;14=20;16=23;21=25;22=26;</lt>
+                       </meth>
+               </class>
+               <class name="StringUtils" supername="java/lang/Object" checksum="3174979789" source="StringUtils.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="281" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=3;</lt>
+                       </meth>
+                       <meth name="areEqual" vmsig="(Ljava/lang/String;Ljava/lang/String;)Z" flags=' public static' access="9" length="22">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="282" count="0"/>
+                                       <br s="2" e="4">
+                                               <cond s="16" e="21" id="283" count="0" val="true"/>
+                                               <cond s="5" e="9" id="284" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="5" e="9">
+                                       <br s="7" e="9">
+                                               <cond s="14" e="14" id="285" count="0" val="true"/>
+                                               <cond s="10" e="13" id="286" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="13">
+                                       <goto s="11" e="13">
+                                               <tg s="15" e="15" id="287" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="14" e="14">
+                               </bl>
+                               <bl s="15" e="15">
+                                       <fall s="15" e="15" id="288" count="0"/>
+                                       <exit s="15" e="15" opcode="ireturn"/>
+                               </bl>
+                               <bl s="16" e="21">
+                                       <exit s="21" e="21" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=5;5=6;16=8;</lt>
+                       </meth>
+               </class>
+       </package>
+       <package name="net.jaekl.qd.xml">
+               <class name="MismatchedTagsException" supername="net/jaekl/qd/xml/XmlParseException" checksum="3062725623" source="MismatchedTagsException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" cons="true" length="15">
+                               <bl s="0" e="14">
+                                       <methenter s="0" e="14" id="289" count="0"/>
+                                       <exit s="14" e="14" opcode="return"/>
+                               </bl>
+                               <lt>0=14;4=15;9=16;14=17;</lt>
+                       </meth>
+                       <meth name="getExpected" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="290" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=19;</lt>
+                       </meth>
+                       <meth name="getActual" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="291" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=20;</lt>
+                       </meth>
+               </class>
+               <class name="MissingInfoException" supername="net/jaekl/qd/xml/XmlParseException" checksum="2789497018" source="MissingInfoException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" cons="true" length="32">
+                               <bl s="0" e="31">
+                                       <methenter s="0" e="31" id="292" count="0"/>
+                                       <exit s="31" e="31" opcode="return"/>
+                               </bl>
+                               <lt>0=16;4=17;9=18;20=19;31=20;</lt>
+                       </meth>
+                       <meth name="addMissingAttribute" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="10">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="293" count="0"/>
+                                       <exit s="9" e="9" opcode="return"/>
+                               </bl>
+                               <lt>0=23;9=24;</lt>
+                       </meth>
+                       <meth name="addMissingChild" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="10">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="294" count="0"/>
+                                       <exit s="9" e="9" opcode="return"/>
+                               </bl>
+                               <lt>0=27;9=28;</lt>
+                       </meth>
+                       <meth name="getTagName" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="295" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=30;</lt>
+                       </meth>
+                       <meth name="getMessage" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="163">
+                               <bl s="0" e="47">
+                                       <methenter s="0" e="47" id="296" count="0"/>
+                               </bl>
+                               <bl s="48" e="56">
+                                       <fall s="48" e="56" id="303" count="0"/>
+                                       <br s="54" e="56">
+                                               <cond s="99" e="106" id="297" count="0" val="true"/>
+                                               <cond s="57" e="98" id="298" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="57" e="98">
+                                       <goto s="96" e="98">
+                                               <tg s="48" e="56" id="299" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="99" e="106">
+                               </bl>
+                               <bl s="107" e="115">
+                                       <fall s="107" e="115" id="304" count="0"/>
+                                       <br s="113" e="115">
+                                               <cond s="158" e="162" id="300" count="0" val="true"/>
+                                               <cond s="116" e="157" id="301" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="116" e="157">
+                                       <goto s="155" e="157">
+                                               <tg s="107" e="115" id="302" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="158" e="162">
+                                       <exit s="162" e="162" opcode="areturn"/>
+                               </bl>
+                               <lt>0=34;8=36;40=38;67=39;96=40;99=42;126=43;155=44;158=45;</lt>
+                       </meth>
+               </class>
+               <class name="ParseHandler" supername="java/lang/Object" checksum="3464370400" source="ParseHandler.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="(Lnet/jaekl/qd/xml/ParseResult;)V" flags=' public' access="1" cons="true" length="25">
+                               <bl s="0" e="24">
+                                       <methenter s="0" e="24" id="305" count="0"/>
+                                       <exit s="24" e="24" opcode="return"/>
+                               </bl>
+                               <lt>0=16;4=17;15=18;24=19;</lt>
+                       </meth>
+                       <meth name="characters" vmsig="([CII)V" flags=' public' access="1" length="43">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="306" count="0"/>
+                                       <br s="7" e="9">
+                                               <cond s="11" e="29" id="307" count="0" val="true"/>
+                                               <cond s="10" e="10" id="308" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="10">
+                                       <exit s="10" e="10" opcode="return"/>
+                               </bl>
+                               <bl s="11" e="29">
+                                       <goto s="27" e="29">
+                                               <tg s="42" e="42" id="309" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="30" e="41">
+                                       <catch s="30" e="41" id="310" count="0"/>
+                                       <exit s="41" e="41" opcode="athrow"/>
+                               </bl>
+                               <bl s="42" e="42">
+                                       <exit s="42" e="42" opcode="return"/>
+                               </bl>
+                               <lt>0=24;10=25;11=29;27=33;30=31;32=32;42=34;</lt>
+                       </meth>
+                       <meth name="endElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="85">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="311" count="0"/>
+                                       <br s="7" e="9">
+                                               <cond s="11" e="33" id="312" count="0" val="true"/>
+                                               <cond s="10" e="10" id="313" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="10">
+                                       <exit s="10" e="10" opcode="return"/>
+                               </bl>
+                               <bl s="11" e="33">
+                                       <br s="31" e="33">
+                                               <cond s="69" e="71" id="314" count="0" val="true"/>
+                                               <cond s="34" e="51" id="315" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="34" e="51">
+                                       <br s="49" e="51">
+                                               <cond s="53" e="68" id="316" count="0" val="true"/>
+                                               <cond s="52" e="52" id="317" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="52" e="52">
+                                       <exit s="52" e="52" opcode="return"/>
+                               </bl>
+                               <bl s="53" e="68">
+                               </bl>
+                               <bl s="69" e="71">
+                                       <fall s="69" e="71" id="320" count="0"/>
+                                       <goto s="69" e="71">
+                                               <tg s="84" e="84" id="318" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="72" e="83">
+                                       <catch s="72" e="83" id="319" count="0"/>
+                                       <exit s="83" e="83" opcode="athrow"/>
+                               </bl>
+                               <bl s="84" e="84">
+                                       <exit s="84" e="84" opcode="return"/>
+                               </bl>
+                               <lt>0=40;10=41;11=44;29=45;34=46;42=48;52=49;53=52;69=57;72=55;74=56;84=58;</lt>
+                       </meth>
+                       <meth name="startElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V" flags=' public' access="1" length="57">
+                               <bl s="0" e="30">
+                                       <methenter s="0" e="30" id="321" count="0"/>
+                                       <br s="28" e="30">
+                                               <cond s="41" e="43" id="322" count="0" val="true"/>
+                                               <cond s="31" e="40" id="323" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="31" e="40">
+                               </bl>
+                               <bl s="41" e="43">
+                                       <fall s="41" e="43" id="326" count="0"/>
+                                       <goto s="41" e="43">
+                                               <tg s="56" e="56" id="324" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="44" e="55">
+                                       <catch s="44" e="55" id="325" count="0"/>
+                                       <exit s="55" e="55" opcode="athrow"/>
+                               </bl>
+                               <bl s="56" e="56">
+                                       <exit s="56" e="56" opcode="return"/>
+                               </bl>
+                               <lt>0=64;12=65;24=66;31=67;41=72;44=70;46=71;56=73;</lt>
+                       </meth>
+                       <meth name="endDocument" vmsig="()V" flags=' public' access="1" length="41">
+                               <bl s="0" e="9">
+                                       <methenter s="0" e="9" id="327" count="0"/>
+                                       <br s="7" e="9">
+                                               <cond s="40" e="40" id="328" count="0" val="true"/>
+                                               <cond s="10" e="39" id="329" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="10" e="39">
+                                       <exit s="39" e="39" opcode="athrow"/>
+                               </bl>
+                               <bl s="40" e="40">
+                                       <exit s="40" e="40" opcode="return"/>
+                               </bl>
+                               <lt>0=77;10=78;24=79;40=81;</lt>
+                       </meth>
+                       <meth name="endPrefixMapping" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="330" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=86;</lt>
+                       </meth>
+                       <meth name="ignorableWhitespace" vmsig="([CII)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="331" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=93;</lt>
+                       </meth>
+                       <meth name="processingInstruction" vmsig="(Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="332" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=100;</lt>
+                       </meth>
+                       <meth name="setDocumentLocator" vmsig="(Lorg/xml/sax/Locator;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="333" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=105;</lt>
+                       </meth>
+                       <meth name="skippedEntity" vmsig="(Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="334" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=110;</lt>
+                       </meth>
+                       <meth name="startDocument" vmsig="()V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="335" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=115;</lt>
+                       </meth>
+                       <meth name="startPrefixMapping" vmsig="(Ljava/lang/String;Ljava/lang/String;)V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="336" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=122;</lt>
+                       </meth>
+               </class>
+               <class name="ParseResult" supername="java/lang/Object" checksum="3007858202" source="ParseResult.java" flags=' public abstract'>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/String;[Ljava/lang/String;[[Ljava/lang/Object;)V" flags=' public' access="1" cons="true" length="161">
+                               <bl s="0" e="79">
+                                       <methenter s="0" e="79" id="337" count="0"/>
+                               </bl>
+                               <bl s="80" e="86">
+                                       <fall s="80" e="86" id="344" count="0"/>
+                                       <br s="84" e="86">
+                                               <cond s="110" e="112" id="338" count="0" val="true"/>
+                                               <cond s="87" e="109" id="339" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="87" e="109">
+                                       <goto s="107" e="109">
+                                               <tg s="80" e="86" id="340" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="110" e="112">
+                               </bl>
+                               <bl s="113" e="119">
+                                       <fall s="113" e="119" id="345" count="0"/>
+                                       <br s="117" e="119">
+                                               <cond s="160" e="160" id="341" count="0" val="true"/>
+                                               <cond s="120" e="159" id="342" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="120" e="159">
+                                       <goto s="157" e="159">
+                                               <tg s="113" e="119" id="343" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="160" e="160">
+                                       <exit s="160" e="160" opcode="return"/>
+                               </bl>
+                               <lt>0=32;4=33;15=34;26=35;37=36;42=38;47=39;58=40;69=42;94=43;104=42;110=46;120=47;131=48;142=49;154=46;160=51;</lt>
+                       </meth>
+                       <meth name="getTagName" vmsig="()Ljava/lang/String;" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="346" count="0"/>
+                                       <exit s="4" e="4" opcode="areturn"/>
+                               </bl>
+                               <lt>0=56;</lt>
+                       </meth>
+                       <meth name="haveSeenMyTag" vmsig="()Z" flags=' public' access="1" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="347" count="0"/>
+                                       <exit s="4" e="4" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=57;</lt>
+                       </meth>
+                       <meth name="characters" vmsig="([CII)V" flags=' public' access="1" length="12">
+                               <bl s="0" e="11">
+                                       <methenter s="0" e="11" id="348" count="0"/>
+                                       <exit s="11" e="11" opcode="return"/>
+                               </bl>
+                               <lt>0=61;11=62;</lt>
+                       </meth>
+                       <meth name="collectParsedChildren" vmsig="(Ljava/lang/Class;)[Lnet/jaekl/qd/xml/ParseResult;" flags=' protected' access="4" signature="(Ljava/lang/Class&lt;+Lnet/jaekl/qd/xml/ParseResult;&gt;;)[Lnet/jaekl/qd/xml/ParseResult;" length="83">
+                               <bl s="0" e="15">
+                                       <methenter s="0" e="15" id="349" count="0"/>
+                               </bl>
+                               <bl s="16" e="24">
+                                       <fall s="16" e="24" id="355" count="0"/>
+                                       <br s="22" e="24">
+                                               <cond s="64" e="82" id="350" count="0" val="true"/>
+                                               <cond s="25" e="47" id="351" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="25" e="47">
+                                       <br s="45" e="47">
+                                               <cond s="61" e="63" id="352" count="0" val="true"/>
+                                               <cond s="48" e="60" id="353" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="48" e="60">
+                               </bl>
+                               <bl s="61" e="63">
+                                       <fall s="61" e="63" id="356" count="0"/>
+                                       <goto s="61" e="63">
+                                               <tg s="16" e="24" id="354" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="64" e="82">
+                                       <exit s="82" e="82" opcode="areturn"/>
+                               </bl>
+                               <lt>0=65;8=66;16=67;25=68;36=69;48=70;55=71;61=73;64=75;73=76;</lt>
+                       </meth>
+                       <meth name="endElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z" flags=' public' access="1" length="114">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="357" count="0"/>
+                                       <br s="3" e="5">
+                                               <cond s="19" e="35" id="358" count="0" val="true"/>
+                                               <cond s="6" e="10" id="359" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="6" e="10">
+                                       <br s="8" e="10">
+                                               <cond s="19" e="35" id="360" count="0" val="true"/>
+                                               <cond s="11" e="18" id="361" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="11" e="18">
+                                       <exit s="18" e="18" opcode="athrow"/>
+                               </bl>
+                               <bl s="19" e="35">
+                                       <br s="33" e="35">
+                                               <cond s="38" e="48" id="362" count="0" val="true"/>
+                                               <cond s="36" e="37" id="363" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="36" e="37">
+                                       <exit s="37" e="37" opcode="ireturn"/>
+                               </bl>
+                               <bl s="38" e="48">
+                                       <br s="46" e="48">
+                                               <cond s="55" e="59" id="364" count="0" val="true"/>
+                                               <cond s="49" e="54" id="365" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="49" e="54">
+                                       <exit s="54" e="54" opcode="ireturn"/>
+                               </bl>
+                               <bl s="55" e="59">
+                                       <br s="57" e="59">
+                                               <cond s="62" e="82" id="366" count="0" val="true"/>
+                                               <cond s="60" e="61" id="367" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="60" e="61">
+                                       <exit s="61" e="61" opcode="ireturn"/>
+                               </bl>
+                               <bl s="62" e="82">
+                                       <br s="80" e="82">
+                                               <cond s="94" e="113" id="368" count="0" val="true"/>
+                                               <cond s="83" e="93" id="369" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="83" e="93">
+                                       <exit s="93" e="93" opcode="athrow"/>
+                               </bl>
+                               <bl s="94" e="113">
+                                       <exit s="113" e="113" opcode="ireturn"/>
+                               </bl>
+                               <lt>0=82;19=84;29=86;36=88;38=91;49=92;53=93;55=96;60=98;62=101;74=102;83=103;94=106;103=107;112=109;</lt>
+                       </meth>
+                       <meth name="startElement" vmsig="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)Lnet/jaekl/qd/xml/ParseResult;" flags=' public' access="1" length="152">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="370" count="0"/>
+                                       <br s="3" e="5">
+                                               <cond s="19" e="33" id="371" count="0" val="true"/>
+                                               <cond s="6" e="10" id="372" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="6" e="10">
+                                       <br s="8" e="10">
+                                               <cond s="19" e="33" id="373" count="0" val="true"/>
+                                               <cond s="11" e="18" id="374" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="11" e="18">
+                                       <exit s="18" e="18" opcode="athrow"/>
+                               </bl>
+                               <bl s="19" e="33">
+                                       <br s="31" e="33">
+                                               <cond s="54" e="64" id="375" count="0" val="true"/>
+                                               <cond s="34" e="44" id="376" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="34" e="44">
+                                       <br s="42" e="44">
+                                               <cond s="52" e="53" id="377" count="0" val="true"/>
+                                               <cond s="45" e="51" id="378" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="45" e="51">
+                                       <exit s="51" e="51" opcode="areturn"/>
+                               </bl>
+                               <bl s="52" e="53">
+                                       <exit s="53" e="53" opcode="areturn"/>
+                               </bl>
+                               <bl s="54" e="64">
+                                       <br s="62" e="64">
+                                               <cond s="76" e="94" id="379" count="0" val="true"/>
+                                               <cond s="65" e="75" id="380" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="65" e="75">
+                                       <exit s="75" e="75" opcode="areturn"/>
+                               </bl>
+                               <bl s="76" e="94">
+                                       <br s="92" e="94">
+                                               <cond s="150" e="151" id="381" count="0" val="true"/>
+                                               <cond s="95" e="125" id="382" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="95" e="125">
+                                       <exit s="125" e="125" opcode="areturn"/>
+                               </bl>
+                               <bl s="126" e="137">
+                                       <catch s="126" e="137" id="383" count="0"/>
+                                       <exit s="137" e="137" opcode="athrow"/>
+                               </bl>
+                               <bl s="138" e="149">
+                                       <catch s="138" e="149" id="384" count="0"/>
+                                       <exit s="149" e="149" opcode="athrow"/>
+                               </bl>
+                               <bl s="150" e="151">
+                                       <exit s="151" e="151" opcode="areturn"/>
+                               </bl>
+                               <lt>0=116;19=118;27=120;34=123;45=124;50=125;52=132;54=136;65=137;74=138;76=141;89=142;95=144;105=145;115=146;126=148;128=149;138=151;140=152;150=157;</lt>
+                       </meth>
+                       <meth name="validate" vmsig="()V" flags=' public' access="1" length="1">
+                               <bl s="0" e="0">
+                                       <methenter s="0" e="0" id="385" count="0"/>
+                                       <exit s="0" e="0" opcode="return"/>
+                               </bl>
+                               <lt>0=164;</lt>
+                       </meth>
+                       <meth name="&lt;clinit&gt;" vmsig="()V" flags=' static' access="8" clinit="true" length="18">
+                               <bl s="0" e="8">
+                                       <methenter s="0" e="8" id="386" count="0"/>
+                                       <br s="6" e="8">
+                                               <cond s="13" e="13" id="387" count="0" val="true"/>
+                                               <cond s="9" e="12" id="388" count="0" val="false"/>
+                                       </br>
+                               </bl>
+                               <bl s="9" e="12">
+                                       <goto s="10" e="12">
+                                               <tg s="14" e="17" id="389" count="0"/>
+                                       </goto>
+                               </bl>
+                               <bl s="13" e="13">
+                               </bl>
+                               <bl s="14" e="17">
+                                       <fall s="14" e="17" id="390" count="0"/>
+                                       <exit s="17" e="17" opcode="return"/>
+                               </bl>
+                               <lt>0=19;</lt>
+                       </meth>
+               </class>
+               <class name="XmlParseException" supername="net/jaekl/qd/QDException" checksum="3943647990" source="XmlParseException.java" flags=' public'>
+                       <meth name="&lt;init&gt;" vmsig="()V" flags=' public' access="1" cons="true" length="5">
+                               <bl s="0" e="4">
+                                       <methenter s="0" e="4" id="391" count="0"/>
+                                       <exit s="4" e="4" opcode="return"/>
+                               </bl>
+                               <lt>0=9;4=11;</lt>
+                       </meth>
+                       <meth name="&lt;init&gt;" vmsig="(Ljava/lang/Throwable;)V" flags=' public' access="1" cons="true" length="6">
+                               <bl s="0" e="5">
+                                       <methenter s="0" e="5" id="392" count="0"/>
+                                       <exit s="5" e="5" opcode="return"/>
+                               </bl>
+                               <lt>0=14;5=15;</lt>
+                       </meth>
+               </class>
+       </package>
+</coverage>
diff --git a/test/net/jaekl/frank/Main.java b/test/net/jaekl/frank/Main.java
new file mode 100644 (file)
index 0000000..21f7761
--- /dev/null
@@ -0,0 +1,46 @@
+// Simple driver for ad-hoc testing of the query interface 
+// (useful if we want to try running a query without a Servlet Engine).
+
+package net.jaekl.frank;
+
+import java.io.FileInputStream;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+import net.jaekl.frank.octranspo.Server;
+import net.jaekl.frank.octranspo.StopInfo;
+
+public class Main{
+    public static void main(String[] args) {
+               try {
+                   FileInputStream fis = null;
+                   PrintWriter pw = null;
+                   try {
+                       fis = new FileInputStream("/home/chris/prog/Frank/apikey.txt");
+                               Server server = new Server("192f31d2", fis);
+                               pw = new PrintWriter(System.out);
+                               // StopInfo summary = server.getRouteSummaryForStop(7655);
+                               
+                               Schedule schedule = new Schedule(Locale.getDefault());
+                               // schedule.writePage(pw, summary);
+                               
+                               StopInfo one = server.getNextTripsForStop(7655, 1);
+                               schedule.writePage(pw, one);
+                               // StopInfo seven = server.getNextTripsForStop(7655, 7);
+                               // schedule.writePage(pw, seven);
+                   }
+                   finally {
+                               if (null != fis) {
+                                   fis.close(); 
+                               }
+                               if (null != pw) {
+                                       pw.flush();
+                                       pw.close();
+                               }
+                   }
+               }
+               catch (Throwable t) {
+                   t.printStackTrace();
+               }
+    }
+}
diff --git a/test/net/jaekl/frank/ScheduleTest.java b/test/net/jaekl/frank/ScheduleTest.java
new file mode 100644 (file)
index 0000000..2fc9ac2
--- /dev/null
@@ -0,0 +1,209 @@
+package net.jaekl.frank;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.Locale;
+
+import junit.framework.Assert;
+
+import net.jaekl.frank.octranspo.RouteMock;
+import net.jaekl.frank.octranspo.RouteSummaryMock;
+import net.jaekl.frank.octranspo.TripMock;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ScheduleTest {
+       static final String EXPECTED_STYLE = "<STYLE>\n" + 
+                       "  body {background-color: #F0F0C0; font-size: 1.5em; }\n" + 
+                       "  #trips {border-collapse: collapse; font-size: 1.5em; }\n" + 
+                       "  #trips td, #trips th {border: 1px solid #600000; padding: 3px 3px 3px 3px; text-align: center;}\n" + 
+                       "  #trips th {background-color: #800000; color: #FFFFFF; }\n" + 
+                       "  #trips tr.ghost td {background-color: #C0C0C0;}\n" + 
+                       "</STYLE>\n";
+       static final String TITLE_PREFIX = "<HTML>\n<HEAD>\n<TITLE>";
+       static final String TITLE_SUFFIX = "</TITLE>\n" + EXPECTED_STYLE + "</HEAD>\n";
+       
+       
+       ByteArrayOutputStream m_baos;
+       PrintWriter m_pw;
+       
+       @Before
+       public void setUp() {
+               m_baos = new ByteArrayOutputStream();
+               m_pw = new PrintWriter(m_baos);
+       }
+       
+       @After
+       public void tearDown() throws IOException {
+               if (null != m_baos) {
+                       m_baos.close();
+               }
+       }
+       
+       // Confirm that writeStyle's output does not vary with the locale
+       @Test
+       public void test_writeStyle() {
+               String actual;
+
+               Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
+               
+               for (Locale locale : locales) {
+                       m_baos.reset();
+                       
+                       Schedule schedule = new Schedule(locale);
+                       schedule.writeStyle(m_pw);
+                       m_pw.flush();
+                       
+                       actual = m_baos.toString();
+                       Assert.assertEquals(EXPECTED_STYLE, actual);
+               }
+       }
+       
+       @Test
+       public void test_writeHeader() {
+               Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
+               String[] titles = { "", "CARLETON", "BILLINGS BRIDGE (3204)" };
+               
+               for (Locale locale : locales) {
+                       Schedule schedule = new Schedule(locale);
+                       for (String title : titles) {
+                               String expected = TITLE_PREFIX + title + TITLE_SUFFIX;
+                               
+                               m_baos.reset();
+                               
+                               schedule.writeHeader(m_pw, title);
+                               m_pw.flush();
+                               
+                               String actual = m_baos.toString();
+                               Assert.assertEquals(expected, actual);
+                       }
+               }
+       }
+
+       @Test
+       public void test_writePage_withNoRoutes() {
+               final String stopName = "RIDEAU RIDEAU";
+               final int stopNo = 3009;
+               
+               RouteSummaryMock rsm = new RouteSummaryMock();
+               rsm.mock_setDescr(stopName);
+               rsm.mock_setStopNo(stopNo);
+               
+               Schedule schedule = new Schedule(Locale.CANADA);
+               
+               m_baos.reset();
+               
+               schedule.writePage(m_pw, rsm);
+               m_pw.flush();
+               
+               String actual = m_baos.toString();
+               
+               Assert.assertTrue(actual.contains(EXPECTED_STYLE));
+               
+               String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
+               Assert.assertTrue(actual.contains(expectedTitle));
+       }
+       
+       @Test
+       public void test_writePage_withMultipleRoutes() {
+               final String stopName = "RIDEAU RIDEAU";
+               final String SOUTH_KEYS = "South Keys";
+               final String HURDMAN = "Hurdman"; 
+               final int stopNo = 3009;
+               final Date queryDate = new Date(1418357155000L);
+               final double LAT1 = 45.379298;
+               final double LON1 = -75.652007;
+               final double LAT2 = 45.351322;
+               final double LON2 = -75.652007;
+               
+               RouteSummaryMock rsm;
+               RouteMock route;
+               TripMock trip;
+               
+               rsm = new RouteSummaryMock();
+               rsm.mock_setDescr(stopName);
+               rsm.mock_setStopNo(stopNo);
+               
+               // First route:  Number 1
+               route = new RouteMock();
+               route.mock_setRouteNo(1);
+               
+               trip = new TripMock(queryDate);
+               trip.mock_setDest(SOUTH_KEYS);
+               trip.mock_setAdjTime(10);
+               trip.mock_setLatitude(LAT1);
+               trip.mock_setLongitude(LON1);
+               trip.mock_setSpeed(0.5);
+               route.mock_addTrip(trip);
+               
+               trip = new TripMock(queryDate);
+               trip.mock_setDest(SOUTH_KEYS);
+               trip.mock_setAdjTime(20);
+               trip.mock_setLatitude(LAT2);
+               trip.mock_setLongitude(LON2);
+               trip.mock_setSpeed(22.4);
+               route.mock_addTrip(trip);
+
+               rsm.mock_addRoute(route);
+               
+               // Second route:  Number 4
+               route = new RouteMock();
+               route.mock_setRouteNo(4);
+               
+               trip = new TripMock(queryDate);
+               trip.mock_setDest(HURDMAN);
+               trip.mock_setAdjTime(17);
+               route.mock_addTrip(trip);
+               
+               trip = new TripMock(queryDate);
+               trip.mock_setDest(HURDMAN);
+               trip.mock_setAdjTime(37);
+               route.mock_addTrip(trip);
+               
+               rsm.mock_addRoute(route);
+               
+               // Generate the HTML 
+               Schedule schedule = new Schedule(Locale.CANADA);
+               
+               m_baos.reset();
+               
+               schedule.writePage(m_pw, rsm);
+               m_pw.flush();
+               
+               String actual = m_baos.toString();
+               
+               // Some rudimentary validation of the result.
+               // Should really go through more permutations, and examine them more closely, here.
+               Assert.assertTrue(actual.contains(EXPECTED_STYLE));
+               
+               String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
+               Assert.assertTrue(actual.contains(expectedTitle));
+               
+               Assert.assertTrue(actual.contains("<TABLE ID=\"trips\">"));
+               Assert.assertTrue(actual.contains("<TR><TH COLSPAN=\"5\">" + stopName + " (" + stopNo + ")</TH></TR>"));
+               Assert.assertTrue(actual.contains("<TR><TH>Route</TH><TH>Destination</TH><TH>ETA</TH><TH>Remain</TH><TH>GPS Read</TH>"));
+    
+               Assert.assertTrue(actual.contains("<TD>1</TD>"));
+               Assert.assertTrue(actual.contains("<TD>" + SOUTH_KEYS + "</TD>"));
+               Assert.assertTrue(actual.contains("<TD>11:15PM</TD>"));
+               Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_0\">10m</SPAN></TD>"));
+               Assert.assertTrue(actual.contains("<TD><A HREF=\"" + schedule.mapUrl(LAT1, LON1) + "\">11:05:55PM</A></TD>"));
+               
+               Assert.assertTrue(actual.contains("<TD>1</TD>"));
+               Assert.assertTrue(actual.contains("<TD>" + SOUTH_KEYS + "</TD>"));
+               Assert.assertTrue(actual.contains("<TD>11:25PM"));
+               Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_1\">20m</SPAN></TD>"));
+               Assert.assertTrue(actual.contains("<TD><A HREF=\"" + schedule.mapUrl(LAT1, LON1) + "\">11:05:55PM</A></TD>"));
+               Assert.assertTrue(actual.contains("<TD>4</TD>"));
+               Assert.assertTrue(actual.contains("<TD>" + HURDMAN + "</TD>"));
+               Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_2\">17m</SPAN></TD>"));
+               
+               Assert.assertTrue(actual.contains("<TD>4</TD>"));
+               Assert.assertTrue(actual.contains("<TD>" + HURDMAN + "</TD>"));
+               Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_3\">37m</SPAN></TD>"));
+       }
+}
diff --git a/test/net/jaekl/frank/ViewScheduleTest.java b/test/net/jaekl/frank/ViewScheduleTest.java
new file mode 100644 (file)
index 0000000..eec671f
--- /dev/null
@@ -0,0 +1,100 @@
+package net.jaekl.frank;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Locale;
+
+import net.jaekl.qd.QDException;
+import net.jaekl.qd.http.HttpServletRequestMock;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ViewScheduleTest {
+       
+       private HashMap<String, String[]> makeParamMap() {
+               String[] routeNos = { "127" };
+               String[] alphas = { "abcdefg" };
+               String[] kanas = { "あいうえお" };
+
+               HashMap<String, String[]> paramMap = new HashMap<String, String[]>();
+               paramMap.put("routeNo", routeNos);
+               paramMap.put("alpha", alphas);
+               paramMap.put("kana", kanas);
+               
+               return paramMap;
+       }
+       
+       @Test
+       public void testGetParamInt() {
+               HashMap<String, String[]> paramMap = makeParamMap();
+               HttpServletRequestMock reqMock = new HttpServletRequestMock(paramMap);
+               ViewSchedule vs = new ViewSchedule();
+
+               // Try to get a parameter that is an integer, and is there
+               int value = vs.getParamInt(reqMock, "routeNo");
+               Assert.assertEquals(127, value);
+               
+               // Try to get a parameter that is not an integer
+               value = vs.getParamInt(reqMock, "alpha");
+               Assert.assertEquals(0, value);
+               
+               // Try to get a parameter that is not alphanumeric
+               value = vs.getParamInt(reqMock, "kana");
+               Assert.assertEquals(0, value);
+               
+               // Try to get a parameter that is not present 
+               value = vs.getParamInt(reqMock, "notPresent");
+               Assert.assertEquals(0, value);
+       }
+
+       @Test
+       public void testGetParamString() {
+               HashMap<String, String[]> paramMap = makeParamMap();
+               HttpServletRequestMock reqMock = new HttpServletRequestMock(paramMap);
+               ViewSchedule vs = new ViewSchedule();
+
+               // Try to get a parameter that is an integer, and is there
+               String value = vs.getParamString(reqMock, "routeNo");
+               Assert.assertEquals("127", value);
+               
+               // Try to get a parameter that is not an integer
+               value = vs.getParamString(reqMock, "alpha");
+               Assert.assertEquals("abcdefg", value);
+               
+               // Try to get a parameter that is not alphanumeric
+               value = vs.getParamString(reqMock, "kana");
+               Assert.assertEquals("あいうえお", value);
+               
+               // Try to get a parameter that is not present 
+               value = vs.getParamString(reqMock, "notPresent");
+               Assert.assertEquals(null, value);
+       }
+
+       @Test
+       public void testWriteErrorPage() {
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               PrintWriter pw = new PrintWriter(baos);
+               
+               ViewSchedule vs = new ViewSchedule();
+               
+               Throwable[] throwables = { 
+                               new NullPointerException(),
+                               new QDException(),
+                               new SQLException()
+               };
+               
+               for (Throwable t : throwables) {
+                       baos.reset();
+                       vs.writeErrorPage(pw, t, Locale.CANADA);        // TODO:  test translations
+                       pw.flush();
+                       
+                       String actual = baos.toString();
+                       Assert.assertTrue(actual.contains("<TITLE>Frank: Error Page</TITLE>"));
+                       Assert.assertTrue(actual.contains(t.toString()));
+               }
+       }
+
+}
diff --git a/test/net/jaekl/frank/octranspo/RouteMock.java b/test/net/jaekl/frank/octranspo/RouteMock.java
new file mode 100644 (file)
index 0000000..5a91f21
--- /dev/null
@@ -0,0 +1,11 @@
+package net.jaekl.frank.octranspo;
+
+public class RouteMock extends Route {
+       public void mock_addTrip(Trip trip) {
+               m_trips.add(trip);
+       }
+       
+       public void mock_setRouteNo(int routeNo) {
+               m_routeNo = routeNo;
+       }
+}
diff --git a/test/net/jaekl/frank/octranspo/RouteSummaryMock.java b/test/net/jaekl/frank/octranspo/RouteSummaryMock.java
new file mode 100644 (file)
index 0000000..da54e10
--- /dev/null
@@ -0,0 +1,15 @@
+package net.jaekl.frank.octranspo;
+
+public class RouteSummaryMock extends RouteSummary {
+       public void mock_addRoute(Route route) {
+               m_routes.add(route);
+       }
+       
+       public void mock_setDescr(String descr) {
+               m_descr = descr;
+       }
+       
+       public void mock_setStopNo(int stopNo) {
+               m_stopNo = stopNo;
+       }
+}
diff --git a/test/net/jaekl/frank/octranspo/ServerMock.java b/test/net/jaekl/frank/octranspo/ServerMock.java
new file mode 100644 (file)
index 0000000..2dffc50
--- /dev/null
@@ -0,0 +1,20 @@
+package net.jaekl.frank.octranspo;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+import net.jaekl.qd.http.RequestBrokerMock;
+
+public class ServerMock extends Server {
+       public static final String mock_APP_ID = "4567";
+       public static final String mock_API_KEY = "CaiusIuliusCaesarSPQR";
+       
+       
+       public ServerMock() throws IOException {
+               super(mock_APP_ID, new ByteArrayInputStream(mock_API_KEY.getBytes("UTF-8")));
+
+               m_broker = new RequestBrokerMock(GATEWAY_URL, m_baseParams); 
+       }
+       
+       public RequestBrokerMock mock_getBroker() { return (RequestBrokerMock)m_broker; }
+}
diff --git a/test/net/jaekl/frank/octranspo/ServerTest.java b/test/net/jaekl/frank/octranspo/ServerTest.java
new file mode 100644 (file)
index 0000000..7f576cb
--- /dev/null
@@ -0,0 +1,298 @@
+package net.jaekl.frank.octranspo;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+
+import junit.framework.Assert;
+import net.jaekl.frank.FrankException;
+import net.jaekl.qd.QDException;
+import net.jaekl.qd.http.RequestBrokerMock;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.message.BasicNameValuePair;
+import org.junit.Test;
+
+public class ServerTest {
+       private static final String ROUTE_SUMMARY_FOR_STOP = 
+                       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+                                       + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" 
+                                       +  "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" 
+                                       +  "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
+                                       + "     <soap:Body>\n"
+                                       + "             <GetRouteSummaryForStopResponse xmlns=\"http://octranspo.com\">\n"
+                                       + "                     <GetRouteSummaryForStopResult>\n"
+                                       + "                             <StopNo xmlns=\"http://tempuri.org/\">1234</StopNo>\n"
+                                       + "                             <StopDescription" 
+                                       + "                              xmlns=\"http://tempuri.org/\">ONE-TWO-THREE-FOUR</StopDescription>\n"
+                                       + "                             <Error xmlns=\"http://tempuri.org/\"/>\n"
+                                       + "                             <Routes xmlns=\"http://tempuri.org/\">\n"
+                                       + "                                     <Route>\n"
+                                       + "                                             <RouteNo>123</RouteNo>\n"
+                                       + "                                             <DirectionID>0</DirectionID>\n"
+                                       + "                                             <Direction>NORTH</Direction>\n"
+                                       + "                                             <RouteHeading>First Mall</RouteHeading>\n"
+                                       + "                                     </Route>\n"
+                                       + "                                     <Route>\n"
+                                       + "                                             <RouteNo>123</RouteNo>\n"
+                                       + "                                             <DirectionID>1</DirectionID>\n"
+                                       + "                                             <Direction>SOUTH</Direction>\n"
+                                       + "                                             <RouteHeading>Second Mall</RouteHeading>\n"
+                                       + "                                     </Route>\n"
+                                       + "                             </Routes>\n"
+                                       + "                     </GetRouteSummaryForStopResult>\n"
+                                       + "             </GetRouteSummaryForStopResponse>\n"
+                                       + "     </soap:Body>\n"
+                                       + "</soap:Envelope>\n";
+
+       private static final String NEXT_TRIPS_FOR_STOP =  
+                       "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
+                                       "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
+                                       "<soap:Body>" +
+                                       "<GetNextTripsForStopResponse xmlns=\"http://octranspo.com\">" +
+                                       "<GetNextTripsForStopResult>" +
+                                       "<StopNo xmlns=\"http://tempuri.org/\">7659</StopNo>" +
+                                       "<StopLabel xmlns=\"http://tempuri.org/\">BANK FIFTH</StopLabel>" +
+                                       "<Error xmlns=\"http://tempuri.org/\" />" +
+                                       "<Route xmlns=\"http://tempuri.org/\">" +
+                                       "<RouteDirection>" +
+                                       "<RouteNo>1</RouteNo><RouteLabel>Ottawa-Rockcliffe</RouteLabel>" +
+                                       "<Direction>Northbound</Direction><Error /><RequestProcessingTime>20141130111450</RequestProcessingTime>" +
+                                       "<Trips>" +
+                                       "<Trip>" +
+                                       "<TripDestination>Ottawa Rockcliffe</TripDestination>" +
+                                       "<TripStartTime>11:10</TripStartTime>" +
+                                       "<AdjustedScheduleTime>20</AdjustedScheduleTime>" +
+                                       "<AdjustmentAge>0.18</AdjustmentAge>" +
+                                       "<LastTripOfSchedule>false</LastTripOfSchedule>" +
+                                       "<BusType>4LA - DEH</BusType>" +
+                                       "<Latitude>45.352026</Latitude><Longitude>-75.649993</Longitude><GPSSpeed>50.0</GPSSpeed>" +
+                                       "</Trip>" +
+                                       "<Trip>" +
+                                       "<TripDestination>Ottawa Rockcliffe</TripDestination>" +
+                                       "<TripStartTime>11:40</TripStartTime>" +
+                                       "<AdjustedScheduleTime>51</AdjustedScheduleTime><AdjustmentAge>-1</AdjustmentAge>" +
+                                       "<LastTripOfSchedule>false</LastTripOfSchedule><BusType>4E - DEH</BusType>" +
+                                       "<Latitude /><Longitude /><GPSSpeed />" +
+                                       "</Trip>" +
+                                       "<Trip>" +
+                                       "<TripDestination>Ottawa Rockcliffe</TripDestination>" +
+                                       "<TripStartTime>12:00</TripStartTime>" +
+                                       "<AdjustedScheduleTime>71</AdjustedScheduleTime><AdjustmentAge>-1</AdjustmentAge>" +
+                                       "<LastTripOfSchedule>false</LastTripOfSchedule><BusType>4E - DEH</BusType>" +
+                                       "<Latitude /><Longitude /><GPSSpeed />" +
+                                       "</Trip></Trips>" +
+                                       "</RouteDirection>" +
+                                       "</Route>" +
+                                       "</GetNextTripsForStopResult>" +
+                                       "</GetNextTripsForStopResponse>" +
+                                       "</soap:Body>" +
+                                       "</soap:Envelope>";     
+       
+       private static final String NEXT_TRIPS_FOR_STOP_ALL_ROUTES = 
+                       "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
+                                       "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
+                                       "<soap:Body>" +
+                                       "<GetRouteSummaryForStopResponse xmlns=\"http://octranspo.com\">" +
+                                       "<GetRouteSummaryForStopResult>" +
+                                       "<StopNo xmlns=\"http://tempuri.org/\">7659</StopNo>" +
+                                       "<StopDescription xmlns=\"http://tempuri.org/\">BANK FIFTH</StopDescription>" +
+                                       "<Error xmlns=\"http://tempuri.org/\"/>" +
+                                       "<Routes xmlns=\"http://tempuri.org/\">" +
+                                       "<Route>" +
+                                       "<RouteNo>1</RouteNo><DirectionID>1</DirectionID><Direction>Northbound</Direction>" +
+                                       "<RouteHeading>Ottawa-Rockcliffe</RouteHeading>" +
+                                       "<Trips>" +
+                                       "<Trip>" +
+                                       "<TripDestination>Ottawa Rockcliffe</TripDestination><TripStartTime>11:40</TripStartTime>" +
+                                       "<AdjustedScheduleTime>2</AdjustedScheduleTime><AdjustmentAge>0.55</AdjustmentAge>" +
+                                       "<LastTripOfSchedule/><BusType>4E - DEH</BusType>" +
+                                       "<Latitude>45.392965</Latitude><Longitude>-75.682561</Longitude><GPSSpeed>35.7</GPSSpeed>" +
+                                       "</Trip>" +
+                                       "<Trip>" +
+                                       "<TripDestination>Ottawa Rockcliffe</TripDestination><TripStartTime>12:00</TripStartTime>" +
+                                       "<AdjustedScheduleTime>17</AdjustedScheduleTime><AdjustmentAge>0.62</AdjustmentAge>" +
+                                       "<LastTripOfSchedule/><BusType>4E - DEH</BusType>" +
+                                       "<Latitude>45.362237</Latitude><Longitude>-75.658112</Longitude><GPSSpeed>57.6</GPSSpeed>" +
+                                       "</Trip>" +
+                                       "<Trip>" +
+                                       "<TripDestination>Ottawa Rockcliffe</TripDestination><TripStartTime>12:20</TripStartTime>" +
+                                       "<AdjustedScheduleTime>37</AdjustedScheduleTime><AdjustmentAge>-1</AdjustmentAge>" +
+                                       "<LastTripOfSchedule/><BusType>4E - DEH</BusType>" +
+                                       "<Latitude/><Longitude/><GPSSpeed/>" +
+                                       "</Trip>" +
+                                       "</Trips>" +
+                                       "</Route>" +
+                                       "<Route>" +
+                                       "<RouteNo>7</RouteNo><DirectionID>1</DirectionID><Direction>Eastbound</Direction>" +
+                                       "<RouteHeading>St-Laurent</RouteHeading>" +
+                                       "<Trips><Trip><TripDestination>St. Laurent</TripDestination><TripStartTime>12:11</TripStartTime>" +
+                                       "<AdjustedScheduleTime>12</AdjustedScheduleTime><AdjustmentAge>0.61</AdjustmentAge>" +
+                                       "<LastTripOfSchedule/><BusType>4LB - IN</BusType>" +
+                                       "<Latitude>45.384370</Latitude><Longitude>-75.696361</Longitude><GPSSpeed>0.5</GPSSpeed>" +
+                                       "</Trip>" +
+                                       "<Trip>" +
+                                       "<TripDestination>St. Laurent</TripDestination><TripStartTime>12:31</TripStartTime>" +
+                                       "<AdjustedScheduleTime>32</AdjustedScheduleTime><AdjustmentAge>-1</AdjustmentAge>" +
+                                       "<LastTripOfSchedule/><BusType>4L - DEH</BusType><Latitude/><Longitude/><GPSSpeed/>" +
+                                       "</Trip>" +
+                                       "<Trip>" +
+                                       "<TripDestination>St. Laurent</TripDestination><TripStartTime>12:51</TripStartTime>" +
+                                       "<AdjustedScheduleTime>52</AdjustedScheduleTime><AdjustmentAge>-1</AdjustmentAge>" +
+                                       "<LastTripOfSchedule/><BusType>4LA - DEH</BusType>" +
+                                       "<Latitude/><Longitude/><GPSSpeed/>" +
+                                       "</Trip>" +
+                                       "</Trips>" +
+                                       "</Route>" +
+                                       "</Routes>" +
+                                       "</GetRouteSummaryForStopResult>" +
+                                       "</GetRouteSummaryForStopResponse>" +
+                                       "</soap:Body>" +
+                                       "</soap:Envelope>";
+       
+       @Test
+       public void testGetRouteSummaryForStop() throws IOException, QDException, FrankException {
+               ServerMock sm = new ServerMock();
+               RequestBrokerMock broker = sm.mock_getBroker();
+
+               ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
+               params.add(new BasicNameValuePair(Server.STOP_NO, "1234"));
+               
+               broker.setOutput(Server.GET_ROUTE_SUMMARY_FOR_STOP, params, ROUTE_SUMMARY_FOR_STOP);
+               
+               StopInfo stopInfo = sm.getRouteSummaryForStop(1234);
+               
+               Assert.assertNotNull(stopInfo);
+               Assert.assertEquals(1234, stopInfo.getStopNo());
+               Assert.assertEquals("ONE-TWO-THREE-FOUR", stopInfo.getDescr());
+               Assert.assertEquals("", stopInfo.getError());
+               Assert.assertEquals(2, stopInfo.getNumRoutes());
+               
+               Route route;
+               
+               route = stopInfo.getRoute(0);
+               Assert.assertEquals(123, route.getRouteNo());
+               Assert.assertEquals(0, route.getDirectionID());
+               Assert.assertEquals("NORTH", route.getDirection());
+               Assert.assertEquals("First Mall", route.getRouteHeading());
+               
+               route = stopInfo.getRoute(1);
+               Assert.assertEquals(123, route.getRouteNo());
+               Assert.assertEquals(1, route.getDirectionID());
+               Assert.assertEquals("SOUTH", route.getDirection());
+               Assert.assertEquals("Second Mall", route.getRouteHeading());
+       }
+
+       @Test
+       public void testGetNextTripsForStop() throws FrankException, IOException, ParseException {
+               Route route;
+               Trip trip;
+               Date expectedDate; 
+               DateFormat hourMinFormat = new SimpleDateFormat("hh:mm");
+               
+               ServerMock sm = new ServerMock();
+               RequestBrokerMock broker = sm.mock_getBroker();
+
+               ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
+               params.add(new BasicNameValuePair(Server.STOP_NO, "7659"));
+               params.add(new BasicNameValuePair(Server.ROUTE_NO, "1"));
+               
+               broker.setOutput(Server.GET_NEXT_TRIPS_FOR_STOP, params, NEXT_TRIPS_FOR_STOP);
+               
+               StopInfo stopInfo = sm.getNextTripsForStop(7659, 1);
+               
+               Assert.assertNotNull(stopInfo);
+               Assert.assertEquals(7659, stopInfo.getStopNo());
+               Assert.assertEquals("BANK FIFTH", stopInfo.getDescr());
+               Assert.assertEquals("", stopInfo.getError());
+               Assert.assertEquals(1, stopInfo.getNumRoutes());
+               
+               route = stopInfo.getRoute(0);
+               Assert.assertEquals(1, route.getRouteNo());
+               Assert.assertEquals("Northbound", route.getDirection());
+               Assert.assertEquals("Ottawa-Rockcliffe", route.getRouteHeading());
+               Assert.assertEquals(3, route.getNumTrips());
+               
+               trip = route.getTrip(0);
+               Assert.assertEquals("Ottawa Rockcliffe", trip.getDest());
+               expectedDate = hourMinFormat.parse("11:10");
+               Assert.assertEquals(expectedDate, trip.getStart());
+               Assert.assertEquals(20, trip.getAdjTime());
+               Assert.assertEquals(0.18, trip.getAdjAge());
+               Assert.assertEquals(false, trip.isLastTrip());
+               Assert.assertEquals("4LA - DEH", trip.getBusType());
+               Assert.assertEquals(50.0, trip.getSpeed());
+               Assert.assertEquals(45.352026, trip.getLatitude());
+               Assert.assertEquals(-75.649993, trip.getLongitude());
+               
+               trip = route.getTrip(2);
+               Assert.assertEquals("Ottawa Rockcliffe", trip.getDest());
+               expectedDate = hourMinFormat.parse("12:00");
+               Assert.assertEquals(expectedDate, trip.getStart());
+               Assert.assertEquals(71, trip.getAdjTime());
+               Assert.assertEquals(-1.0, trip.getAdjAge());
+               Assert.assertEquals(false, trip.isLastTrip());
+               Assert.assertEquals("4E - DEH", trip.getBusType());
+               Assert.assertEquals(0.0, trip.getSpeed());
+               Assert.assertEquals(0.0, trip.getLatitude());
+               Assert.assertEquals(0.0, trip.getLongitude());
+       }
+
+       @Test
+       public void testGetNextTripsForStopAllRoutes() throws IOException, FrankException, ParseException {
+               Route route;
+               Trip trip;
+               Date expectedDate; 
+               DateFormat hourMinFormat = new SimpleDateFormat("hh:mm");
+               
+               ServerMock sm = new ServerMock();
+               RequestBrokerMock broker = sm.mock_getBroker();
+
+               ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
+               params.add(new BasicNameValuePair(Server.STOP_NO, "7659"));
+               
+               broker.setOutput(Server.GET_NEXT_TRIPS_FOR_STOP_ALL_ROUTES, params, NEXT_TRIPS_FOR_STOP_ALL_ROUTES);
+               
+               StopInfo stopInfo = sm.getNextTripsForStopAllRoutes(7659);
+               
+               Assert.assertNotNull(stopInfo);
+               Assert.assertEquals(7659, stopInfo.getStopNo());
+               Assert.assertEquals("BANK FIFTH", stopInfo.getDescr());
+               Assert.assertEquals("", stopInfo.getError());
+               Assert.assertEquals(2, stopInfo.getNumRoutes());
+               
+               route = stopInfo.getRoute(0);
+               Assert.assertEquals(1, route.getRouteNo());
+               Assert.assertEquals("Northbound", route.getDirection());
+               Assert.assertEquals("Ottawa-Rockcliffe", route.getRouteHeading());
+               Assert.assertEquals(3, route.getNumTrips());
+               
+               trip = route.getTrip(0);
+               Assert.assertEquals("Ottawa Rockcliffe", trip.getDest());
+               expectedDate = hourMinFormat.parse("11:40");
+               Assert.assertEquals(expectedDate, trip.getStart());
+               Assert.assertEquals(2, trip.getAdjTime());
+               Assert.assertEquals(0.55, trip.getAdjAge());
+               Assert.assertEquals(false, trip.isLastTrip());
+               Assert.assertEquals("4E - DEH", trip.getBusType());
+               Assert.assertEquals(35.7, trip.getSpeed());
+               Assert.assertEquals(45.392965, trip.getLatitude());
+               Assert.assertEquals(-75.682561, trip.getLongitude());
+               
+               trip = route.getTrip(2);
+               Assert.assertEquals("Ottawa Rockcliffe", trip.getDest());
+               expectedDate = hourMinFormat.parse("12:20");
+               Assert.assertEquals(expectedDate, trip.getStart());
+               Assert.assertEquals(37, trip.getAdjTime());
+               Assert.assertEquals(-1.0, trip.getAdjAge());
+               Assert.assertEquals(false, trip.isLastTrip());
+               Assert.assertEquals("4E - DEH", trip.getBusType());
+               Assert.assertEquals(0.0, trip.getSpeed());
+               Assert.assertEquals(0.0, trip.getLatitude());
+               Assert.assertEquals(0.0, trip.getLongitude());
+       }
+
+}
diff --git a/test/net/jaekl/frank/octranspo/TripMock.java b/test/net/jaekl/frank/octranspo/TripMock.java
new file mode 100644 (file)
index 0000000..7585c23
--- /dev/null
@@ -0,0 +1,22 @@
+package net.jaekl.frank.octranspo;
+
+import java.util.Date;
+
+public class TripMock extends Trip {
+       
+       public TripMock(Date constructed) {
+               super();
+               
+               this.m_constructed = constructed;
+       }
+       
+       public void mock_setDest(String dest) { m_dest = dest; }
+    public void mock_setStart(Date start) { m_start = start; }
+    public void mock_setAdjTime(int adjTime) { m_adjTime = adjTime; }
+    public void mock_setAdjAge(double adjAge) { m_adjAge = adjAge; }
+    public void mock_setLastTrip(boolean lastTrip) { m_lastTrip = lastTrip; }
+    public void mock_setBusType(String busType) { m_busType = busType; }
+    public void mock_setSpeed(double speed) { m_speed = speed; }
+    public void mock_setLongitude(double longitude) { m_long = longitude; }
+    public void mock_setLatitude(double lat) { m_lat = lat; }
+}
diff --git a/test/net/jaekl/qd/QDBundleFactoryTest.java b/test/net/jaekl/qd/QDBundleFactoryTest.java
new file mode 100644 (file)
index 0000000..c45bf56
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+package net.jaekl.qd;
+
+import org.junit.Assert;
+
+import org.junit.Test;
+
+public class QDBundleFactoryTest {
+
+       @Test
+       public void test_getInst() {
+               QDBundleFactory factory = QDBundleFactory.getInst();
+               
+               Assert.assertNotNull(factory);
+               Assert.assertTrue(factory instanceof QDBundleFactory);
+               Assert.assertTrue(factory == QDBundleFactory.getInst());
+       }
+}
diff --git a/test/net/jaekl/qd/http/HttpServletRequestMock.java b/test/net/jaekl/qd/http/HttpServletRequestMock.java
new file mode 100644 (file)
index 0000000..8d22b03
--- /dev/null
@@ -0,0 +1,351 @@
+package net.jaekl.qd.http;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+public class HttpServletRequestMock implements HttpServletRequest {
+       Map<String, String[]> m_paramMap;
+       
+       public HttpServletRequestMock(Map<String, String[]> paramMap) {
+               m_paramMap = paramMap;
+       }
+
+       @Override
+       public Object getAttribute(String arg0) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Enumeration<?> getAttributeNames() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getCharacterEncoding() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public int getContentLength() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public String getContentType() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public ServletInputStream getInputStream() throws IOException {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getLocalAddr() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getLocalName() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public int getLocalPort() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public Locale getLocale() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Enumeration<?> getLocales() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getParameter(String arg0) {
+               String[] values = m_paramMap.get(arg0);
+               if (null == values || 0 == values.length) {
+                       return null;
+               }
+               return values[0];
+       }
+
+       @Override
+       public Map<String, String[]> getParameterMap() {
+               return m_paramMap;
+       }
+
+       @Override
+       public Enumeration<?> getParameterNames() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String[] getParameterValues(String arg0) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getProtocol() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public BufferedReader getReader() throws IOException {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getRealPath(String arg0) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getRemoteAddr() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getRemoteHost() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public int getRemotePort() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public RequestDispatcher getRequestDispatcher(String arg0) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getScheme() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getServerName() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public int getServerPort() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public boolean isSecure() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public void removeAttribute(String arg0) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       @Override
+       public void setAttribute(String arg0, Object arg1) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       @Override
+       public void setCharacterEncoding(String arg0)
+                       throws UnsupportedEncodingException {
+               // TODO Auto-generated method stub
+               
+       }
+
+       @Override
+       public String getAuthType() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getContextPath() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Cookie[] getCookies() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public long getDateHeader(String arg0) {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public String getHeader(String arg0) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Enumeration<?> getHeaderNames() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Enumeration<?> getHeaders(String arg0) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public int getIntHeader(String arg0) {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public String getMethod() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getPathInfo() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getPathTranslated() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getQueryString() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getRemoteUser() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getRequestURI() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public StringBuffer getRequestURL() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getRequestedSessionId() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getServletPath() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public HttpSession getSession() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public HttpSession getSession(boolean arg0) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Principal getUserPrincipal() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public boolean isRequestedSessionIdFromCookie() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public boolean isRequestedSessionIdFromURL() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public boolean isRequestedSessionIdFromUrl() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public boolean isRequestedSessionIdValid() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public boolean isUserInRole(String arg0) {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+}
diff --git a/test/net/jaekl/qd/http/RequestBrokerMock.java b/test/net/jaekl/qd/http/RequestBrokerMock.java
new file mode 100644 (file)
index 0000000..7e7624b
--- /dev/null
@@ -0,0 +1,95 @@
+package net.jaekl.qd.http;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import net.jaekl.qd.QDException;
+import net.jaekl.qd.util.StringUtils;
+
+import org.apache.http.NameValuePair;
+import org.junit.Assert;
+
+public class RequestBrokerMock extends RequestBroker {
+       private static class InputParams {
+               private String m_method;
+               private ArrayList<NameValuePair> m_passedParams;
+               
+               public InputParams(String method, ArrayList<NameValuePair> passedParams) {
+                       m_method = method;
+                       m_passedParams = new ArrayList<NameValuePair>();
+                       for (NameValuePair nvp : passedParams) {
+                               m_passedParams.add(nvp);
+                       }
+               }
+               
+               @Override
+               public boolean equals(Object obj) {
+                       if (null == obj || !(obj instanceof InputParams)) {
+                               return false;
+                       }
+                       InputParams other = (InputParams)obj;
+                       if (! StringUtils.areEqual(m_method, other.m_method)) {
+                               return false;
+                       }
+                       if (m_passedParams.size() != other.m_passedParams.size()) {
+                               return false;
+                       }
+                       for (int i = 0; i < m_passedParams.size(); ++i) {
+                               NameValuePair a, b;
+                               a = m_passedParams.get(i);
+                               b = other.m_passedParams.get(i);
+                               if ( ! a.equals(b) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+               
+               @Override
+               public int hashCode() {
+                       final int PRIME = 31;
+                       int result = PRIME + m_method.hashCode();
+                       for (NameValuePair nvp : m_passedParams) {
+                               result *= (PRIME + nvp.hashCode());
+                       }
+                       return result;
+               }
+       }
+       
+       HashMap<InputParams, String> m_output;
+       
+       public RequestBrokerMock(String gatewayUrl, ArrayList<NameValuePair> baseParams) {
+               super(gatewayUrl, baseParams);
+               m_output = new HashMap<InputParams, String>();
+       }
+       
+       public void setOutput(String method, ArrayList<NameValuePair> passedParams, String output) {
+               InputParams ip = new InputParams(method, passedParams);
+               m_output.put(ip, output);
+       }
+       
+       @Override 
+       InputStream doSubmit(String method, ArrayList<NameValuePair> passedParams) throws QDException
+       {
+               InputParams ip = new InputParams(method, passedParams);
+               String output = m_output.get(ip);
+               
+               if (null == output) {
+                       Assert.fail("No output specified for given inputs.");
+               }
+               
+               InputStream is = null;
+               
+               try {
+                       is = new ByteArrayInputStream(output.getBytes("UTF-8"));
+               }
+               catch (UnsupportedEncodingException uee) {
+                       throw new QDException(uee);
+               }
+               
+               return is;
+       }
+}
diff --git a/test/net/jaekl/qd/http/RequestBrokerTest.java b/test/net/jaekl/qd/http/RequestBrokerTest.java
new file mode 100644 (file)
index 0000000..037e079
--- /dev/null
@@ -0,0 +1,170 @@
+package net.jaekl.qd.http;
+
+import java.util.ArrayList;
+
+import junit.framework.Assert;
+import net.jaekl.qd.QDException;
+import net.jaekl.qd.xml.ParseResult;
+import net.jaekl.qd.xml.XmlParseException;
+
+import org.apache.http.NameValuePair;
+import org.junit.Test;
+
+public class RequestBrokerTest {
+
+       private static final String GATEWAY = "http://hostname.bogus/";
+       private static final String METHOD = "apiMethod";
+       private static final String ROUTE_SUMMARY_FOR_STOP = 
+                       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+                                       + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" 
+                                       +  "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" 
+                                       +  "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
+                                       + "     <soap:Body>\n"
+                                       + "             <GetRouteSummaryForStopResponse xmlns=\"http://octranspo.com\">\n"
+                                       + "                     <GetRouteSummaryForStopResult>\n"
+                                       + "                             <StopNo xmlns=\"http://tempuri.org/\">1234</StopNo>\n"
+                                       + "                             <StopDescription" 
+                                       + "                              xmlns=\"http://tempuri.org/\">ONE-TWO-THREE-FOUR</StopDescription>\n"
+                                       + "                             <Error xmlns=\"http://tempuri.org/\"/>\n"
+                                       + "                             <Routes xmlns=\"http://tempuri.org/\">\n"
+                                       + "                                     <Route>\n"
+                                       + "                                             <RouteNo>123</RouteNo>\n"
+                                       + "                                             <DirectionID>0</DirectionID>\n"
+                                       + "                                             <Direction>NORTH</Direction>\n"
+                                       + "                                             <RouteHeading>First Mall</RouteHeading>\n"
+                                       + "                                     </Route>\n"
+                                       + "                                     <Route>\n"
+                                       + "                                             <RouteNo>123</RouteNo>\n"
+                                       + "                                             <DirectionID>1</DirectionID>\n"
+                                       + "                                             <Direction>SOUTH</Direction>\n"
+                                       + "                                             <RouteHeading>Second Mall</RouteHeading>\n"
+                                       + "                                     </Route>\n"
+                                       + "                             </Routes>\n"
+                                       + "                     </GetRouteSummaryForStopResult>\n"
+                                       + "             </GetRouteSummaryForStopResponse>\n"
+                                       + "     </soap:Body>\n"
+                                       + "</soap:Envelope>\n";
+       
+       // Parse sub-tags, handling some internally and some externally
+       public static class RouteSummaryParse extends ParseResult {
+               private static final String STOP_NO = "StopNo";
+
+               private static final String[] INTERNAL = { STOP_NO };
+               private static final Object[][] EXTERNAL = { };
+               
+               // Data gleaned from parsing
+               int m_stopNo;
+               
+               public RouteSummaryParse() {
+                       super("GetRouteSummaryForStopResult", INTERNAL, EXTERNAL);
+                       
+                       m_stopNo = 0;
+               }
+               
+               public int getStopNo() { return m_stopNo; }
+
+               @Override
+               public void endContents(String uri, String localName, String qName,
+                               String chars) throws XmlParseException 
+               {
+                       if (localName.equals(STOP_NO)) {
+                               m_stopNo = Integer.parseInt(chars);
+                       }
+               }
+
+               @Override
+               public void endExternal(String uri, String localName, String qName)
+                               throws XmlParseException 
+               {
+                       Assert.fail("Should not be trying to parse external tags here");
+               }
+       }
+       
+       // Try submitting a request (with a mocked-out http post component)
+       // and validate that we do, in fact, return the expected text (XML).
+       @Test
+       public void test_sumbit() throws QDException {
+               ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
+               
+               RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
+               rbm.setOutput(METHOD, emptyParams, ROUTE_SUMMARY_FOR_STOP);
+               
+               String actual = rbm.submit(METHOD, emptyParams);
+               
+               Assert.assertEquals(ROUTE_SUMMARY_FOR_STOP, actual);
+       }
+       
+       // Try submitting a request (with a mocked-out http post component)
+       // and validate that we do, in fact, parse something correctly.
+       @Test
+       public void test_submitAndParse() throws QDException {
+               ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
+               
+               RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
+               rbm.setOutput(METHOD, emptyParams, ROUTE_SUMMARY_FOR_STOP);
+               
+               ParseResult pr = rbm.submitAndParse(METHOD, emptyParams, RouteSummaryParse.class);
+               
+               Assert.assertNotNull(pr);
+               Assert.assertTrue(pr instanceof RouteSummaryParse);
+               RouteSummaryParse rsp = (RouteSummaryParse)pr;
+               Assert.assertEquals(1234, rsp.getStopNo());
+       }
+       
+       
+       class RequestBrokerParamExpandMock extends RequestBrokerMock {
+               private int m_timesCalled;
+               private String m_methodPassed;
+               private ArrayList<NameValuePair> m_paramsPassed;
+               private Class<? extends ParseResult> m_parserClassPassed;
+               
+               public RequestBrokerParamExpandMock(String gatewayUrl, ArrayList<NameValuePair> baseParams) {
+                       super(gatewayUrl, baseParams);
+                       m_timesCalled = 0;
+                       m_methodPassed = null;
+                       m_paramsPassed = null;
+                       m_parserClassPassed = null;
+               }
+               
+               public int getTimesCalled() { return m_timesCalled; }
+               public String getMethodPassed() { return m_methodPassed; }
+               public ArrayList<NameValuePair> getParamsPassed() { return m_paramsPassed; }
+               public Class<? extends ParseResult> getParserClassPassed() { return m_parserClassPassed; }
+               
+               @Override 
+               public ParseResult submitAndParse(String method, 
+                                 ArrayList<NameValuePair> passedParams, 
+                                 Class<? extends ParseResult> rootParserClass,
+                                 String rootTagName)
+                        throws QDException
+               {
+                       Assert.assertNull(rootTagName);
+                       
+                       m_timesCalled += 1;
+                       m_methodPassed = method;
+                       m_paramsPassed = passedParams;
+                       m_parserClassPassed = rootParserClass;
+                       
+                       return null;
+               }
+       }
+       
+       // submitAndParse(method, passedParams, rootParser) 
+       // should call through to 
+       // submitAndParse(method, passedParams, rootParser, rootTagName=null)
+       @Test
+       public void test_submitAndParse_expandsDefault4thParam() throws QDException {
+               final String GATEWAY_URL = "http://bogus.net:1234/gateway";
+               final String METHOD = "MyMethod";
+               
+               RequestBrokerParamExpandMock rbpem = new RequestBrokerParamExpandMock(GATEWAY_URL, new ArrayList<NameValuePair>() );
+               ArrayList<NameValuePair> passedParams = new ArrayList<NameValuePair>();
+               ParseResult pr = rbpem.submitAndParse(METHOD, passedParams, ParseResult.class);
+               
+               Assert.assertNull(pr);
+               Assert.assertEquals(1, rbpem.getTimesCalled());
+               Assert.assertEquals(METHOD, rbpem.getMethodPassed());
+               Assert.assertEquals(passedParams, rbpem.getParamsPassed());
+               Assert.assertEquals(ParseResult.class, rbpem.getParserClassPassed());
+       }
+}
diff --git a/test/net/jaekl/qd/util/ExceptionUtilsTest.java b/test/net/jaekl/qd/util/ExceptionUtilsTest.java
new file mode 100644 (file)
index 0000000..c1361ba
--- /dev/null
@@ -0,0 +1,77 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+package net.jaekl.qd.util;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import junit.framework.Assert;
+import net.jaekl.qd.QDException;
+
+import org.junit.Test;
+
+public class ExceptionUtilsTest {
+
+       private static class CloseableMock implements Closeable 
+       {
+               private IOException m_exception;
+               private int m_timesClosed;
+               
+               public CloseableMock() {
+                       m_exception = null;
+                       m_timesClosed = 0;
+               }
+               
+               public int getTimesClosed() { return m_timesClosed; }
+               public void setExceptionToThrow(IOException ioe) { m_exception = ioe; }
+
+               @Override
+               public void close() throws IOException { 
+                       m_timesClosed++;
+                       if (null != m_exception) {
+                               throw new IOException("This is a test");
+                       }
+               }
+       }
+       
+       // Try closing a closeable.
+       // It should be closed (once only).
+       @Test
+       public void test_tryClose_success() throws QDException
+       {
+               CloseableMock cm = new CloseableMock();
+               
+               ExceptionUtils.tryClose(cm);
+               Assert.assertEquals(1, cm.getTimesClosed());
+       }
+       
+       // Try closing a closeable that throws an IOException
+       @Test
+       public void test_tryClose_exception() throws QDException
+       {
+               final String MESSAGE = "This is a test";
+               
+               CloseableMock cm = new CloseableMock();
+               cm.setExceptionToThrow(new IOException(MESSAGE));
+               
+               try {
+                       ExceptionUtils.tryClose(cm);
+               }
+               catch (QDException qde) {
+                       Assert.assertNotNull(qde);
+                       Throwable t = qde.getCause();
+                       Assert.assertNotNull(t);
+                       Assert.assertTrue(t instanceof IOException);
+                       Assert.assertEquals(MESSAGE, t.getMessage());
+               }
+       }
+       
+       // Try closing a null pointer. 
+       // This should be harmless (no exception thrown).
+       @Test
+       public void test_tryClose_null() throws QDException 
+       {
+               ExceptionUtils.tryClose(null);
+       }
+
+}
diff --git a/test/net/jaekl/qd/util/ParseUtilsTest.java b/test/net/jaekl/qd/util/ParseUtilsTest.java
new file mode 100644 (file)
index 0000000..0f8d33f
--- /dev/null
@@ -0,0 +1,33 @@
+package net.jaekl.qd.util;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class ParseUtilsTest {
+
+       @Test
+       public void testParseDouble() {
+               String[] inputs =   { null,  "", "0.0", "27.34", "1234", "3.141592653589793238", "-77.18", "bogus" };
+               double[] expected = {  0.0, 0.0,   0.0,   27.34,   1234,   3.141592653589793238,   -77.18,     0.0 };  
+               double actual;
+               
+               for (int i = 0; i < inputs.length; ++i) {
+                       actual = ParseUtils.parseDouble(inputs[i]);
+                       Assert.assertEquals(expected[i], actual);
+               }
+       }
+
+       @Test
+       public void testParseInt() {
+               String[] inputs = { null, "", "0", "7.1", "1234", "314159265", "-7718", "bogus" };
+               int[] expected  = {    0,  0,   0,    0,    1234,   314159265,   -7718,       0 };
+               int actual;
+               
+               for (int i = 0; i < inputs.length; ++i) {
+                       actual = ParseUtils.parseInt(inputs[i]);
+                       Assert.assertEquals(expected[i], actual);
+               }
+       }
+
+}
diff --git a/test/net/jaekl/qd/util/StringUtilsTest.java b/test/net/jaekl/qd/util/StringUtilsTest.java
new file mode 100644 (file)
index 0000000..b57f657
--- /dev/null
@@ -0,0 +1,38 @@
+package net.jaekl.qd.util;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class StringUtilsTest {
+
+       @Test
+       public void test_equals() {
+               String [][] expectFalse = { 
+                               { null, "" },
+                               { "", null },
+                               { null, "abc" },
+                               { "abc", null },
+                               { "ABC", "abc" },
+                               { "123458980abc", "abc123459090" },
+                               { "Fred ", "Fred" },
+                               { "", "Fred" },
+                               { "Fred", "" }
+               };
+               
+               String [][] expectTrue = { 
+                               { null, null },
+                               { "", "" },
+                               { "1234", "1234" },
+                               { "Fred", "Fred" }
+               };
+               
+               for (String[] tuple : expectFalse) {
+                       Assert.assertFalse(StringUtils.areEqual(tuple[0], tuple[1]));
+               }
+               for (String[] tuple : expectTrue) {
+                       Assert.assertTrue(StringUtils.areEqual(tuple[0], tuple[1]));
+               }
+       }
+
+}
diff --git a/test/net/jaekl/qd/xml/MissingInfoExceptionTest.java b/test/net/jaekl/qd/xml/MissingInfoExceptionTest.java
new file mode 100644 (file)
index 0000000..32b5ad8
--- /dev/null
@@ -0,0 +1,40 @@
+package net.jaekl.qd.xml;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class MissingInfoExceptionTest {
+
+       @Test
+       public void test_getMessage_withSimpleTag() {
+               final String TAG = "TagNameGoesHere";
+               MissingInfoException mie = new MissingInfoException(TAG);
+               String expected = "Tag:  \"" + TAG + "\"";
+               String actual = mie.getMessage();
+               Assert.assertTrue(actual.contains(expected));
+       }
+       
+       @Test
+       public void test_getMessage_withAttributesAndChildren() {
+               final String AUGUSTUS = "Augustus";
+               final String NOMEN = "nomen";
+               final String COGNOMEN = "cognomen";
+               final String TIBERIUS = "Tiberius";
+               final String JULIA = "Julia";
+               
+               MissingInfoException mie = new MissingInfoException(AUGUSTUS);
+               mie.addMissingAttribute(NOMEN);
+               mie.addMissingAttribute(COGNOMEN);
+               mie.addMissingChild(TIBERIUS);
+               mie.addMissingChild(JULIA);
+               
+               String actual = mie.getMessage();
+               Assert.assertTrue(actual.contains("Tag:  \"" + AUGUSTUS + "\""));
+               Assert.assertTrue(actual.contains("Attribute:  \"" + NOMEN + "\""));
+               Assert.assertTrue(actual.contains("Attribute:  \"" + COGNOMEN + "\""));
+               Assert.assertTrue(actual.contains("Child tag:  \"" + TIBERIUS + "\""));
+               Assert.assertTrue(actual.contains("Child tag:  \"" + JULIA + "\""));
+       }
+
+}
diff --git a/test/net/jaekl/qd/xml/ParseResultTest.java b/test/net/jaekl/qd/xml/ParseResultTest.java
new file mode 100644 (file)
index 0000000..040308d
--- /dev/null
@@ -0,0 +1,523 @@
+// Copyright (C) 2004, 2014 Christian Jaekl
+
+package net.jaekl.qd.xml;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+public class ParseResultTest {
+       // Some samples of XML that we're going to (try to) parse\
+       private static final String MINIMAL_XML = 
+                       "<Root/>";
+       private static final String MINIMAL_XML_WITH_PROLOGUE = 
+                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Root/>";
+       private static final String XML_WITH_MINOR_CONTENT = 
+                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Root><One/></Root>";
+       private static final String ROOT_INSIDE_SECONDARY_ELEMENT = 
+                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Secondary><Root><One/></Root></Secondary>";
+       private static final String PROLOGUE_AND_SECONDARY_ELEMENT = 
+                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Secondary/>";
+       private static final String SIMPLE_INTERNAL_TAGS = 
+                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Root><One/><Two>content of two</Two><Three>3</Three></Root>";
+       private static final String ROUTE_SUMMARY_FOR_STOP = 
+                       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+                                       + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" 
+                                       +  "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" 
+                                       +  "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
+                                       + "     <soap:Body>\n"
+                                       + "             <GetRouteSummaryForStopResponse xmlns=\"http://octranspo.com\">\n"
+                                       + "                     <GetRouteSummaryForStopResult>\n"
+                                       + "                             <StopNo xmlns=\"http://tempuri.org/\">1234</StopNo>\n"
+                                       + "                             <StopDescription" 
+                                       + "                              xmlns=\"http://tempuri.org/\">ONE-TWO-THREE-FOUR</StopDescription>\n"
+                                       + "                             <Error xmlns=\"http://tempuri.org/\"/>\n"
+                                       + "                             <Routes xmlns=\"http://tempuri.org/\">\n"
+                                       + "                                     <Route>\n"
+                                       + "                                             <RouteNo>123</RouteNo>\n"
+                                       + "                                             <DirectionID>0</DirectionID>\n"
+                                       + "                                             <Direction>NORTH</Direction>\n"
+                                       + "                                             <RouteHeading>First Mall</RouteHeading>\n"
+                                       + "                                     </Route>\n"
+                                       + "                                     <Route>\n"
+                                       + "                                             <RouteNo>123</RouteNo>\n"
+                                       + "                                             <DirectionID>1</DirectionID>\n"
+                                       + "                                             <Direction>SOUTH</Direction>\n"
+                                       + "                                             <RouteHeading>Second Mall</RouteHeading>\n"
+                                       + "                                     </Route>\n"
+                                       + "                             </Routes>\n"
+                                       + "                     </GetRouteSummaryForStopResult>\n"
+                                       + "             </GetRouteSummaryForStopResponse>\n"
+                                       + "     </soap:Body>\n"
+                                       + "</soap:Envelope>\n";
+       private static final String NEXT_TRIPS_FOR_STOP = 
+                       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+                       + "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"
+                       + "<soap:Body><GetRouteSummaryForStopResponse xmlns=\"http://octranspo.com\">"
+                       + "<GetRouteSummaryForStopResult>"
+                       + "<StopNo xmlns=\"http://tempuri.org/\">2438</StopNo>"
+                       + "<StopDescription xmlns=\"http://tempuri.org/\">BRONSON SUNNYSIDE</StopDescription>"
+                       + "<Error xmlns=\"http://tempuri.org/\"/><Routes xmlns=\"http://tempuri.org/\">"
+                       + "<Route><RouteNo>4</RouteNo><DirectionID>1</DirectionID><Direction>Northbound</Direction>"
+                       + "<RouteHeading>Rideau C / Ctr Rideau</RouteHeading>"
+                       + "<Trips>"
+                       + "<Trip><TripDestination>Rideau Centre / Centre Rideau</TripDestination><TripStartTime>19:00</TripStartTime>"
+                       + "<AdjustedScheduleTime>16</AdjustedScheduleTime><AdjustmentAge>0.45</AdjustmentAge><LastTripOfSchedule/>"
+                       + "<BusType>4LB - IN</BusType><Latitude>45.408957</Latitude><Longitude>-75.664125</Longitude>"
+                       + "<GPSSpeed>66.4</GPSSpeed></Trip>"
+                       + "<Trip><TripDestination>Rideau Centre / Centre Rideau</TripDestination>"
+                       + "<TripStartTime>19:30</TripStartTime><AdjustedScheduleTime>40</AdjustedScheduleTime><AdjustmentAge>-1</AdjustmentAge>"
+                       + "<LastTripOfSchedule/><BusType>4LB - IN</BusType><Latitude/><Longitude/><GPSSpeed/></Trip>"
+                       + "<Trip><TripDestination>Rideau Centre / Centre Rideau</TripDestination><TripStartTime>20:00</TripStartTime>"
+                       + "<AdjustedScheduleTime>70</AdjustedScheduleTime><AdjustmentAge>-1</AdjustmentAge><LastTripOfSchedule/>"
+                       + "<BusType>4LB - IN</BusType><Latitude/><Longitude/><GPSSpeed/></Trip>"
+                       + "</Trips></Route></Routes></GetRouteSummaryForStopResult></GetRouteSummaryForStopResponse>"
+                       + "</soap:Body></soap:Envelope>";
+       
+       // Do the least possible parsing:  check for the <Root/> element only.
+       public static class MinimalParse extends ParseResult {
+               private static final String[] INTERNAL = {};
+               private static final Object[][] EXTERNAL = {} ;
+               
+               public MinimalParse() {
+                       super("Root", INTERNAL, EXTERNAL);
+               }
+
+               @Override
+               public void endContents(String uri, String localName, String qName,
+                               String chars) throws XmlParseException 
+               {
+                       Assert.fail("Should not have any contents to end.");
+               }
+
+               @Override
+               public void endExternal(String uri, String localName, String qName)
+                               throws XmlParseException 
+               {
+                       Assert.fail("Should not have any external tags to end.");
+               }
+       }
+       
+       // Check that we can parse a minimal document without errors.
+       // Because there's no content being parsed (beyond the root element), there is 
+       // no "correct" behaviour to assert.  The test is to confirm that we 
+       // don't do anything incorrect--no calls to endContent() nor endExternal(),
+       // and no exceptions thrown along the way.
+       @Test
+       public void test_withMinimalParse() throws IOException, SAXException {
+               MinimalParse mp = new MinimalParse();
+               ByteArrayInputStream bais = null;
+               
+               String[] data = { 
+                                       MINIMAL_XML, 
+                                       MINIMAL_XML_WITH_PROLOGUE, 
+                                       XML_WITH_MINOR_CONTENT,
+                                       ROOT_INSIDE_SECONDARY_ELEMENT 
+                               };
+               
+               for (String datum : data) {
+                       try {
+                               bais = new ByteArrayInputStream(datum.getBytes("UTF-8"));
+                               XMLReader reader = XMLReaderFactory.createXMLReader();
+                               ParseHandler ph = new ParseHandler(mp);
+                               reader.setContentHandler(ph);
+                               reader.parse(new InputSource(bais));
+                       }
+                       finally {
+                               if (null != bais) { 
+                                       bais.close();
+                               }
+                       }
+               }
+       }
+       
+       // If we parse something that doesn't have the expected root element, we should generate an exception
+       @Test
+       public void test_minimalParseWithMismatchedRootElement() throws IOException {
+               MinimalParse mp = new MinimalParse();
+               ByteArrayInputStream bais = null;
+               
+               String[] data = { PROLOGUE_AND_SECONDARY_ELEMENT };
+               
+               for (String datum : data) {
+                       try {
+                               bais = new ByteArrayInputStream(datum.getBytes("UTF-8"));
+                               XMLReader reader = XMLReaderFactory.createXMLReader();
+                               ParseHandler ph = new ParseHandler(mp);
+                               reader.setContentHandler(ph);
+                               reader.parse(new InputSource(bais));
+                               Assert.fail("Should have thrown an exception.");
+                       }
+                       catch ( SAXException se ) {
+                               Throwable cause = se.getCause();
+                               Assert.assertNotNull(cause);
+                               Assert.assertTrue(cause instanceof MissingInfoException);
+                               MissingInfoException mie = (MissingInfoException) cause;
+                               Assert.assertEquals("Root", mie.getTagName());
+                       }
+                       finally {
+                               if (null != bais) { 
+                                       bais.close();
+                               }
+                       }
+               }
+       }
+       
+       // Do the some simple parsing:  <Root/> and some subtags that are processed internally
+       public static class SimpleParse extends ParseResult {
+               private static final String ONE = "One";
+               private static final String TWO = "Two";
+               private static final String THREE = "Three";
+               
+               private static final String[] INTERNAL = {ONE, TWO, THREE};
+               private static final Object[][] EXTERNAL = {} ;
+               
+               String m_one;
+               String m_two;
+               String m_three;
+               
+               public SimpleParse() {
+                       super("Root", INTERNAL, EXTERNAL);
+                       
+                       m_one = m_two = m_three = null;
+               }
+               
+               public String getOne() { return m_one; }
+               public String getTwo() { return m_two; }
+               public String getThree() { return m_three; }
+
+               @Override
+               public void endContents(String uri, String localName, String qName,
+                               String chars) throws XmlParseException 
+               {
+                       if (localName.equals(ONE)) {
+                               m_one = chars;
+                       }
+                       else if (localName.equals(TWO)) {
+                               m_two = chars;
+                       }
+                       else if (localName.equals(THREE)) {
+                               m_three = chars;
+                       }
+               }
+
+               @Override
+               public void endExternal(String uri, String localName, String qName)
+                               throws XmlParseException 
+               {
+                       Assert.fail("Should not have any external tags to end.");
+               }
+       }
+       
+       // Parse some XML containing subtags that are handled internally by SimpleParse
+       @Test
+       public void test_parseWithInternalSubtags() throws IOException, SAXException 
+       {
+               SimpleParse sp = new SimpleParse();
+               ByteArrayInputStream bais = null;
+               
+               String[] data = {
+                                       SIMPLE_INTERNAL_TAGS
+                               };
+               
+               for (String datum : data) {
+                       try {
+                               bais = new ByteArrayInputStream(datum.getBytes("UTF-8"));
+                               XMLReader reader = XMLReaderFactory.createXMLReader();
+                               ParseHandler ph = new ParseHandler(sp);
+                               reader.setContentHandler(ph);
+                               reader.parse(new InputSource(bais));
+                               
+                               Assert.assertEquals("", sp.getOne());
+                               Assert.assertEquals("content of two", sp.getTwo());
+                               Assert.assertEquals("3", sp.getThree());
+                       }
+                       finally {
+                               if (null != bais) { 
+                                       bais.close();
+                               }
+                       }
+               }
+       }
+       
+       // Parse sub-tags, handling some internally and some externally
+       public static class RouteSummaryParse extends ParseResult {
+               private static final String STOP_NO = "StopNo";
+               private static final String STOP_DESCR = "StopDescription";
+               private static final String ERROR = "Error";
+               private static final String ROUTES = "Routes";
+               private static final String ROUTE = "Route";
+               
+               private static final String[] INTERNAL = {STOP_NO, STOP_DESCR, ERROR, ROUTES};
+               private static final Object[][] EXTERNAL = { {ROUTE, RouteParse.class} };
+               
+               // Data gleaned from parsing
+               int m_stopNo;
+               String m_stopDescr;
+               String m_error;
+               ArrayList<RouteParse> m_routes;
+               
+               public RouteSummaryParse() {
+                       super("GetRouteSummaryForStopResult", INTERNAL, EXTERNAL);
+                       
+                       m_stopNo = 0;
+                       m_stopDescr = m_error = null;
+                       m_routes = new ArrayList<RouteParse>();
+               }
+               
+               public int getStopNo() { return m_stopNo; }
+               public String getStopDescription() { return m_stopDescr; }
+               public String getError() { return m_error; }
+               public int getNumRoutes() { return m_routes.size(); }
+               public RouteParse getRoute(int idx) { return m_routes.get(idx); }
+
+               @Override
+               public void endContents(String uri, String localName, String qName,
+                               String chars) throws XmlParseException 
+               {
+                       if (localName.equals(STOP_NO)) {
+                               m_stopNo = Integer.parseInt(chars);
+                       }
+                       else if (localName.equals(STOP_DESCR)) {
+                               m_stopDescr = chars;
+                       }
+                       else if (localName.equals(ERROR)) {
+                               m_error = chars;
+                       }
+               }
+
+               @Override
+               public void endExternal(String uri, String localName, String qName)
+                               throws XmlParseException 
+               {
+                       if (localName.equals(ROUTE)) {
+                               ParseResult[] collected = collectParsedChildren(RouteParse.class);
+                               for (ParseResult pr : collected) {
+                                       Assert.assertTrue(pr instanceof RouteParse);
+                                       m_routes.add((RouteParse)pr);
+                               }
+                       }
+               }
+       }
+       public static class RouteParse extends ParseResult {
+               private static final String ROUTE = "Route";
+               private static final String ROUTE_NO = "RouteNo";
+               private static final String DIR_ID = "DirectionID";
+               private static final String DIR = "Direction";
+               private static final String HEADING = "RouteHeading";
+               private static final String TRIPS = "Trips";
+               private static final String TRIP = "Trip";
+               
+               private static final String[] INTERNAL = {ROUTE_NO, DIR_ID, DIR, HEADING, TRIPS};
+               private static final Object[][] EXTERNAL = { {TRIP, TripParse.class} };
+               
+               // Data gleaned from parsing
+               int m_routeNo;
+               int m_dirID;
+               String m_dir;
+               String m_heading;
+               ArrayList<TripParse> m_trips;
+               
+               public RouteParse() {
+                       super(ROUTE, INTERNAL, EXTERNAL);
+                       
+                       m_routeNo = m_dirID = 0;
+                       m_dir = m_heading = null;
+                       m_trips = new ArrayList<TripParse>();
+               }
+               
+               public int getRouteNo() { return m_routeNo; }
+               public int getDirectionID() { return m_dirID; }
+               public String getDirection() { return m_dir; }
+               public String getHeading() { return m_heading; }
+               public int getNumTrips() { return m_trips.size(); }
+               public TripParse getTrip(int idx) { return m_trips.get(idx); }
+
+               @Override
+               public void endContents(String uri, String localName, String qName,
+                               String chars) throws XmlParseException 
+               {
+                       if (localName.equals(ROUTE_NO)) {
+                               m_routeNo = Integer.parseInt(chars);
+                       }
+                       else if (localName.equals(DIR_ID)) {
+                               m_dirID = Integer.parseInt(chars);
+                       }
+                       else if (localName.equals(DIR)) {
+                               m_dir = chars;
+                       }
+                       else if (localName.equals(HEADING)) {
+                               m_heading = chars;
+                       }
+               }
+
+               @Override
+               public void endExternal(String uri, String localName, String qName)
+                               throws XmlParseException 
+               {
+                       if (localName.equals(TRIP)) {
+                               ParseResult[] collected = collectParsedChildren(TripParse.class);
+                               for (ParseResult pr : collected) {
+                                       Assert.assertTrue(pr instanceof TripParse);
+                                       m_trips.add((TripParse)pr);
+                               }
+                       }
+                       
+               }
+       }
+       public static class TripParse extends ParseResult {
+               private static final String TRIP = "Trip";
+               private static final String TRIP_DEST = "TripDestination";
+               private static final String TRIP_START = "TripStartTime";
+               private static final String ADJ_SCHED_TIME = "AdjustedScheduleTime";
+               
+               private static final String[] INTERNAL = {TRIP_DEST, TRIP_START, ADJ_SCHED_TIME };
+               private static final Object[][] EXTERNAL = { };
+               
+               // Data gleaned from parsing
+               String m_dest;
+               String m_startTime;
+               int m_adjSchedTime;;
+               
+               public TripParse() {
+                       super(TRIP, INTERNAL, EXTERNAL);
+                       
+                       m_dest = m_startTime = null;
+                       m_adjSchedTime = 0;
+               }
+               
+               public String getDestination() { return m_dest; }
+               public String getStartTime() { return m_startTime; }
+               public int getAdjustedScheduleTime() { return m_adjSchedTime; }
+
+               @Override
+               public void endContents(String uri, String localName, String qName,
+                               String chars) throws XmlParseException 
+               {
+                       if (localName.equals(TRIP_DEST)) {
+                               m_dest = chars;
+                       }
+                       else if (localName.equals(TRIP_START)) {
+                               m_startTime = chars;
+                       }
+                       else if (localName.equals(ADJ_SCHED_TIME)) {
+                               m_adjSchedTime = Integer.parseInt(chars);
+                       }
+               }
+
+               @Override
+               public void endExternal(String uri, String localName, String qName)
+                               throws XmlParseException 
+               {
+                       Assert.fail("Should not be attempting to parse external tags.");
+               }
+       }
+       
+       // Parse some XML containing subtags that are handled both internally and externally
+       @Test
+       public void test_parseRouteSummary() throws IOException, SAXException 
+       {
+               RouteSummaryParse rsp = new RouteSummaryParse();
+               ByteArrayInputStream bais = null;
+               
+               try {
+                       RouteParse rp;
+                       
+                       bais = new ByteArrayInputStream(ROUTE_SUMMARY_FOR_STOP.getBytes("UTF-8"));
+                       XMLReader reader = XMLReaderFactory.createXMLReader();
+                       ParseHandler ph = new ParseHandler(rsp);
+                       reader.setContentHandler(ph);
+                       reader.parse(new InputSource(bais));
+                       
+                       Assert.assertEquals(1234, rsp.getStopNo());
+                       Assert.assertEquals("ONE-TWO-THREE-FOUR", rsp.getStopDescription());
+                       Assert.assertEquals("", rsp.getError());
+                       
+                       Assert.assertEquals(2, rsp.getNumRoutes());
+                       
+                       rp = rsp.getRoute(0);
+                       Assert.assertNotNull(rp);
+                       Assert.assertEquals(123, rp.getRouteNo());
+                       Assert.assertEquals(0, rp.getDirectionID());
+                       Assert.assertEquals("NORTH", rp.getDirection());
+                       Assert.assertEquals("First Mall", rp.getHeading());
+                       
+                       rp = rsp.getRoute(1);
+                       Assert.assertNotNull(rp);
+                       Assert.assertEquals(123, rp.getRouteNo());
+                       Assert.assertEquals(1, rp.getDirectionID());
+                       Assert.assertEquals("SOUTH", rp.getDirection());
+                       Assert.assertEquals("Second Mall", rp.getHeading());
+               }
+               finally {
+                       if (null != bais) { 
+                               bais.close();
+                       }
+               }
+       }
+       
+       // Parse a 3-level external-tag hierarchy:  RouteSummary contains Routes contains Trips
+       @Test
+       public void test_parseThreeLevels() throws IOException, SAXException 
+       {
+               RouteSummaryParse rsp = new RouteSummaryParse();
+               ByteArrayInputStream bais = null;
+               
+               try {
+                       RouteParse rp;
+                       TripParse tp;
+                       
+                       bais = new ByteArrayInputStream(NEXT_TRIPS_FOR_STOP.getBytes("UTF-8"));
+                       XMLReader reader = XMLReaderFactory.createXMLReader();
+                       ParseHandler ph = new ParseHandler(rsp);
+                       reader.setContentHandler(ph);
+                       reader.parse(new InputSource(bais));
+                       
+                       Assert.assertEquals(2438, rsp.getStopNo());
+                       Assert.assertEquals("BRONSON SUNNYSIDE", rsp.getStopDescription());
+                       Assert.assertEquals("", rsp.getError());
+                       
+                       Assert.assertEquals(1, rsp.getNumRoutes());
+                       
+                       rp = rsp.getRoute(0);
+                       Assert.assertNotNull(rp);
+                       Assert.assertEquals(4, rp.getRouteNo());
+                       Assert.assertEquals(1, rp.getDirectionID());
+                       Assert.assertEquals("Northbound", rp.getDirection());
+                       Assert.assertEquals("Rideau C / Ctr Rideau", rp.getHeading());
+                       
+                       Assert.assertEquals(3, rp.getNumTrips());
+                       
+                       tp = rp.getTrip(0);
+                       Assert.assertNotNull(tp);
+                       Assert.assertEquals("Rideau Centre / Centre Rideau", tp.getDestination());
+                       Assert.assertEquals("19:00", tp.getStartTime());
+                       Assert.assertEquals(16, tp.getAdjustedScheduleTime());
+                       
+                       tp = rp.getTrip(1);
+                       Assert.assertNotNull(tp);
+                       Assert.assertEquals("Rideau Centre / Centre Rideau", tp.getDestination());
+                       Assert.assertEquals("19:30", tp.getStartTime());
+                       Assert.assertEquals(40, tp.getAdjustedScheduleTime());
+
+                       tp = rp.getTrip(2);
+                       Assert.assertNotNull(tp);
+                       Assert.assertEquals("Rideau Centre / Centre Rideau", tp.getDestination());
+                       Assert.assertEquals("20:00", tp.getStartTime());
+                       Assert.assertEquals(70, tp.getAdjustedScheduleTime());
+               }
+               finally {
+                       if (null != bais) { 
+                               bais.close();
+                       }
+               }
+       }
+}