[cobertura] 01/19: New upstream version 2.1.1

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Wed Sep 27 08:13:00 UTC 2017


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to branch master
in repository cobertura.

commit 1dce9b6dcd754aa1d3d81fb473747d903e833935
Author: Emmanuel Bourg <ebourg at apache.org>
Date:   Wed Sep 27 00:25:42 2017 +0200

    New upstream version 2.1.1
---
 .gitignore                                         |    90 +
 COPYING => LICENSE.txt                             |   680 +-
 README                                             |    31 -
 ChangeLog => README.markdown                       |   643 +-
 build.properties                                   |    34 -
 build.xml                                          |   658 --
 cobertura-check.bat                                |    21 -
 cobertura-check.sh                                 |     1 -
 cobertura-instrument.bat                           |    21 -
 cobertura-instrument.sh                            |     1 -
 cobertura-merge.bat                                |    21 -
 cobertura-merge.sh                                 |     1 -
 cobertura-report.bat                               |    21 -
 cobertura-report.sh                                |     1 -
 cobertura-runtime/pom.xml                          |   114 +
 cobertura/executables/cobertura-check.bat          |    21 +
 cobertura/executables/cobertura-check.sh           |     2 +
 cobertura/executables/cobertura-instrument.bat     |    21 +
 cobertura/executables/cobertura-instrument.sh      |     2 +
 cobertura/executables/cobertura-merge.bat          |    21 +
 cobertura/executables/cobertura-merge.sh           |     2 +
 cobertura/executables/cobertura-report.bat         |    21 +
 cobertura/executables/cobertura-report.sh          |     2 +
 cobertura/pom.xml                                  |   557 +
 cobertura/src/main/assembly/assembly.xml           |    58 +
 .../net/sourceforge/cobertura/CoverageIgnore.java  |    65 +-
 .../net/sourceforge/cobertura/ant/AntUtil.java     |   187 +-
 .../net/sourceforge/cobertura/ant/CheckTask.java   |   424 +-
 .../ant/CoberturaJUnitResultFormatter.java         |    57 +
 .../cobertura/ant/CommonMatchingTask.java          |   517 +-
 .../sourceforge/cobertura/ant/ExcludeClasses.java  |   147 +-
 .../net/sourceforge/cobertura/ant/Ignore.java      |   145 +-
 .../sourceforge/cobertura/ant/IgnoreBranches.java  |   143 +-
 .../cobertura/ant/IgnoreClassAnnotation.java       |   144 +-
 .../cobertura/ant/IgnoreMethodAnnotation.java      |   144 +-
 .../sourceforge/cobertura/ant/IncludeClasses.java  |   147 +-
 .../sourceforge/cobertura/ant/InstrumentTask.java  |   642 +-
 .../net/sourceforge/cobertura/ant/MergeTask.java   |   217 +-
 .../java}/net/sourceforge/cobertura/ant/Regex.java |   175 +-
 .../net/sourceforge/cobertura/ant/ReportTask.java  |   277 +-
 .../net/sourceforge/cobertura/ant/package.html     |    17 +
 .../cobertura/check/CheckCoverageMain.java         |   166 +
 .../cobertura/check/CheckCoverageTask.java         |   267 +
 .../sourceforge/cobertura/check/CoverageRate.java  |    86 +-
 .../cobertura/check/CoverageResultEntry.java       |    55 +
 .../cobertura/check/CoverageThreshold.java         |    35 +
 .../java/net/sourceforge/cobertura/check/Main.java |    57 +
 .../cobertura/check/PackageCoverage.java           |   135 +-
 .../cobertura/coveragedata/BranchCoverageData.java |    83 +-
 .../cobertura/coveragedata/ClassData.java          |  1224 +-
 .../cobertura/coveragedata/CoverageData.java       |    95 +-
 .../coveragedata/CoverageDataContainer.java        |   703 +-
 .../coveragedata/CoverageDataFileHandler.java      |   152 +
 .../cobertura/coveragedata/JumpData.java           |   433 +-
 .../coveragedata/LightClassmapListener.java        |    98 +-
 .../cobertura/coveragedata/LineData.java           |   289 +
 .../cobertura/coveragedata/PackageData.java        |   317 +-
 .../cobertura/coveragedata/ProjectData.java        |   682 +-
 .../cobertura/coveragedata/SaveTimer.java          |    69 +-
 .../cobertura/coveragedata/SourceFileData.java     |   481 +-
 .../cobertura/coveragedata/SwitchData.java         |   163 +
 .../cobertura/coveragedata/TouchCollector.java     |   232 +
 .../cobertura/coveragedata/package.html            |    23 +
 .../net/sourceforge/cobertura/dsl/Arguments.java   |   213 +
 .../cobertura/dsl/ArgumentsBuilder.java            |   330 +
 .../net/sourceforge/cobertura/dsl/Cobertura.java   |   153 +
 .../sourceforge/cobertura/dsl/ReportFormat.java    |    23 +
 .../AbstractFindTouchPointsClassInstrumenter.java  |   113 +
 .../sourceforge/cobertura/instrument/Archive.java  |   205 +-
 .../cobertura/instrument/ClassPattern.java         |   265 +-
 .../cobertura/instrument/CoberturaClassWriter.java |    67 +
 .../cobertura/instrument/CoberturaFile.java        |   172 +-
 .../instrument/CoberturaInstrumenter.java          |   358 +
 .../instrument/CodeInstrumentationTask.java        |   353 +
 .../ContextMethodAwareMethodAdapter.java           |    77 +
 .../instrument/FindTouchPointsMethodAdapter.java   |   343 +
 .../cobertura/instrument/HistoryMethodAdapter.java |   163 +
 .../cobertura/instrument/InstrumentMain.java       |   193 +
 .../net/sourceforge/cobertura/instrument/Main.java |    49 +
 .../cobertura/instrument/TouchPointListener.java   |   134 +
 .../cobertura/instrument/pass1/CodeFootstamp.java  |   200 +
 .../pass1/DetectDuplicatedCodeClassVisitor.java    |   225 +
 .../pass1/DetectDuplicatedCodeMethodVisitor.java   |   259 +
 .../pass1/DetectIgnoredCodeClassVisitor.java       |   102 +
 .../pass1/DetectIgnoredCodeMethodVisitor.java      |   212 +
 .../cobertura/instrument/pass1/package-info.java   |    80 +-
 .../pass2/BuildClassMapClassVisitor.java           |   168 +
 .../pass2/BuildClassMapTouchPointListener.java     |    85 +
 .../instrument/pass3/AbstractCodeProvider.java     |   263 +
 .../instrument/pass3/AtomicArrayCodeProvider.java  |   161 +
 .../cobertura/instrument/pass3/CodeProvider.java   |   161 +
 .../instrument/pass3/FastArrayCodeProvider.java    |   152 +
 .../pass3/InjectCodeClassInstrumenter.java         |   199 +
 .../pass3/InjectCodeTouchPointListener.java        |   186 +
 .../cobertura/instrument/tp/ClassMap.java          |   404 +
 .../instrument/tp/JumpTouchPointDescriptor.java    |    72 +
 .../instrument/tp/LineTouchPointDescriptor.java    |    79 +
 .../instrument/tp/SwitchTouchPointDescriptor.java  |   123 +
 .../instrument/tp/TouchPointDescriptor.java        |    90 +
 .../cobertura/javancss/FunctionMetric.java         |    31 +-
 .../sourceforge/cobertura/javancss/Javancss.java   |   508 +
 .../cobertura/javancss/JavancssFactory.java        |    78 +-
 .../net/sourceforge/cobertura/javancss/Metric.java |    58 +-
 .../cobertura/javancss/ObjectMetric.java           |    36 +-
 .../cobertura/javancss/PackageMetric.java          |    47 +-
 .../cobertura/javancss/ccl/Exitable.java           |   160 +-
 .../cobertura/javancss/ccl/FileUtil.java           |   448 +-
 .../sourceforge/cobertura/javancss/ccl/Init.java   |   102 +-
 .../sourceforge/cobertura/javancss/ccl/Util.java   |   559 +-
 .../java/net/sourceforge/cobertura/merge/Main.java |    49 +
 .../net/sourceforge/cobertura/merge/MergeMain.java |    83 +
 .../cobertura/merge/MergeProjectDataFilesTask.java |    33 +
 .../cobertura/reporting/ComplexityCalculator.java  |   552 +
 .../cobertura/reporting/CompositeReport.java       |    42 +
 .../reporting/CoverageThresholdsReport.java        |    41 +
 .../net/sourceforge/cobertura/reporting/Main.java  |    82 +-
 .../cobertura/reporting/NativeReport.java          |    64 +
 .../cobertura/reporting/NullReport.java            |    18 +
 .../sourceforge/cobertura/reporting/Report.java    |    26 +
 .../cobertura/reporting/ReportFormatStrategy.java  |    20 +
 .../reporting/ReportFormatStrategyRegistry.java    |    44 +
 .../cobertura/reporting/ReportMain.java            |   160 +
 .../cobertura/reporting/ReportName.java            |     5 +
 .../cobertura/reporting/html/HTMLReport.java       |  1588 ++-
 .../reporting/html/HTMLReportFormatStrategy.java   |    29 +
 .../cobertura/reporting/html/JavaToHtml.java       |   653 +-
 .../html/SourceFileDataBaseNameComparator.java     |    90 +-
 .../cobertura/reporting/html/files/CopyFiles.java  |   223 +-
 .../cobertura/reporting/xml/SummaryXMLReport.java  |   220 +-
 .../reporting/xml/SummaryXMLReportStrategy.java    |    28 +
 .../cobertura/reporting/xml/XMLReport.java         |   666 +-
 .../reporting/xml/XMLReportFormatStrategy.java     |    29 +
 .../sourceforge/cobertura/util/ArchiveUtil.java    |   156 +-
 .../cobertura/util/CommandLineBuilder.java         |   444 +-
 .../cobertura/util/ConfigurationUtil.java          |   103 +
 .../net/sourceforge/cobertura/util/FileFinder.java |   569 +-
 .../net/sourceforge/cobertura/util/FileLocker.java |   405 +-
 .../net/sourceforge/cobertura/util/Header.java     |    83 +-
 .../net/sourceforge/cobertura/util/IOUtil.java     |   340 +-
 .../net/sourceforge/cobertura/util/RegexUtil.java  |   174 +-
 .../sourceforge/cobertura/util/ShutdownHooks.java  |    29 +
 .../net/sourceforge/cobertura/util/Source.java     |   178 +-
 .../net/sourceforge/cobertura/util/StringUtil.java |   181 +-
 .../cobertura/webapp/FlushCoberturaServlet.java    |   139 +-
 cobertura/src/main/javacc/Java1.1.jj               |  3489 ++++++
 cobertura/src/main/javacc/JavaParserInterface.java |    47 +
 cobertura/src/main/javacc/debug/JavaDebug1.1.jj    |  3465 ++++++
 cobertura/src/main/javacc/java1.5/GTToken.java     |     5 +
 cobertura/src/main/javacc/java1.5/Java1.5.jj       |  2237 ++++
 .../src/main/javacc/java1.5/debug/GTToken.java     |     5 +
 .../src/main/javacc/java1.5/debug/JavaDebug1.5.jj  |  2237 ++++
 COPYING => cobertura/src/main/resources/COPYING    |   680 +-
 .../src/main/resources/COPYRIGHT                   |    70 +-
 cobertura/src/main/resources/logback.xml           |    37 +
 .../net/sourceforge/cobertura/ant/antlib.xml       |    12 +-
 .../cobertura/reporting/html/files/blank.png       |   Bin
 .../reporting/html/files/customsorttypes.js        |     0
 .../cobertura/reporting/html/files/downsimple.png  |   Bin
 .../cobertura/reporting/html/files/help.css        |    44 +-
 .../cobertura/reporting/html/files/help.html       |    62 +-
 .../cobertura/reporting/html/files/index.html      |    50 +-
 .../cobertura/reporting/html/files/main.css        |   262 +-
 .../cobertura/reporting/html/files/popup.js        |    16 +-
 .../reporting/html/files/sortabletable.css         |    98 +-
 .../reporting/html/files/sortabletable.js          |   910 +-
 .../reporting/html/files/source-viewer.css         |   146 +-
 .../reporting/html/files/stringbuilder.js          |   158 +-
 .../cobertura/reporting/html/files/tooltip.css     |    98 +-
 .../cobertura/reporting/html/files/upsimple.png    |   Bin
 .../net/sourceforge/cobertura/webapp/web.xml       |    83 +-
 .../src/main/resources}/tasks.properties           |     8 +-
 .../test/java/com/acme/servlet/SimpleServlet.java  |    23 +
 .../ant/AbstractCoberturaAntTestCase.java          |    70 +
 .../ant/FunctionalConditionCoverageTest.java       |   905 +-
 .../sourceforge/cobertura/ant/FunctionalTest.java  |   776 +-
 .../ant/IgnoreMethodAnnotationAntTest.java         |    35 +
 .../cobertura/ant/IgnoreTrivialAntTest.java        |   128 +
 .../java}/net/sourceforge/cobertura/ant/Util.java  |   163 +-
 .../sourceforge/cobertura/bugs/GithubIssue170.java |    97 +
 .../sourceforge/cobertura/bugs/GithubIssue191.java |    27 +
 .../sourceforge/cobertura/bugs/GithubIssue30.java  |    66 +
 .../cobertura/bugs/GithubIssue37IT.java            |    43 +
 .../sourceforge/cobertura/bugs/GithubIssue42.java  |    29 +
 .../sourceforge/cobertura/bugs/GithubIssue53.java  |    30 +
 .../cobertura/check/CoverageRateTest.java          |    31 +
 .../cobertura/check/CoverageResultEntryTest.java   |    62 +
 .../cobertura/check/CoverageThresholdTest.java     |    38 +
 .../cobertura/check/PackageCoverageTest.java       |    81 +
 .../cobertura/coveragedata/ClassDataTest.java      |   523 +-
 .../coveragedata/CoverageDataFileHandlerTest.java  |   173 +-
 .../cobertura/coveragedata/JumpDataTest.java       |   184 +-
 .../cobertura/coveragedata/LineDataTest.java       |   628 +-
 .../cobertura/coveragedata/PackageDataTest.java    |   395 +-
 .../cobertura/coveragedata/ProjectDataTest.java    |   342 +-
 .../cobertura/coveragedata/SwitchDataTest.java     |   155 +
 .../cobertura/dsl/ArgumentsBuilderTest.java        |   352 +
 .../sourceforge/cobertura/dsl/ArgumentsTest.java   |   234 +
 .../instrument/CoberturaInstrumenterTest.java      |    88 +-
 .../net/sourceforge/cobertura/jdk/JDK7Test.java    |   211 +
 .../net/sourceforge/cobertura/jdk/JDKTest.java     |   128 +
 .../sourceforge/cobertura/merge/MergeMainTest.java |   315 +-
 .../net/sourceforge/cobertura/merge/MergeTest.java |   287 +
 .../reporting/ComplexityCalculator2Test.java       |   155 +
 ...omplexityCalculatorGetCcnForMethodUnitTest.java |   310 +
 .../reporting/ComplexityCalculatorTest.java        |   190 +
 .../cobertura/reporting/CompositeReportTest.java   |    42 +
 .../reporting/CoverageThresholdsReportTest.java    |    37 +
 .../cobertura/reporting/JUnitXMLHelper.java        |   126 +-
 .../reporting/JUnitXMLParserEntityResolver.java    |   172 +-
 .../reporting/JUnitXMLParserErrorHandler.java      |   118 +-
 .../cobertura/reporting/NullReportTest.java        |    27 +
 .../cobertura/reporting/html/JavaToHtmlTest.java   |   123 +-
 .../reporting/html/files/CopyFilesTest.java        |   165 +-
 .../cobertura/reporting/xml/XMLReportTest.java     |   157 +-
 .../cobertura/test/AbstractCoberturaTestCase.java  |   189 +
 .../sourceforge/cobertura/test/FunctionalTest.java |   339 +
 .../test/IgnoreMethodAnnotationFunctionalTest.java |   187 +
 .../test/IgnoreTrivialFunctionalTest.java          |   521 +
 .../net/sourceforge/cobertura/test/IgnoreUtil.java |   182 +-
 .../sourceforge/cobertura/test/LargeFileTest.java  |   208 +
 .../cobertura/test/PerformanceTest.java            |   198 +
 .../cobertura/test/SwitchFunctionalTest.java       |   536 +
 .../sourceforge/cobertura/test/util/TestUtils.java |   725 ++
 .../cobertura/test/util/WebappServer.java          |   544 +
 .../test/MultipleClassloaderFunctionalTest.java    |   265 +
 .../thread/test/ThreadedFunctionalTest.java        |   368 +
 .../cobertura/util/CommandLineBuilderTest.java     |   183 +
 .../cobertura/util/FileFinder2Test.java            |   225 +-
 .../sourceforge/cobertura/util/FileFinderTest.java |   165 +
 .../sourceforge/cobertura/util/FileFixture.java    |   130 +
 .../sourceforge/cobertura/util/FileFlooder.java    |   164 +-
 .../net/sourceforge/cobertura/util/IOUtilTest.java |   360 +-
 .../sourceforge/cobertura/util/StringUtilTest.java |   114 +-
 .../webapp/test/WebAppFunctionalTest.java          |   383 +
 .../test/java/test/condition/ConditionCalls.java   |   107 +
 .../ant/IgnoreMethodAnnotation/.gitignore          |     3 +
 .../resources/ant/IgnoreMethodAnnotation}/README   |     0
 .../ant/IgnoreMethodAnnotation/build.properties    |    12 +
 .../ant/IgnoreMethodAnnotation}/build.xml          |   194 +-
 .../src/test/condition/CoverageIgnore.java         |     5 +
 .../src/test/condition/IgnoreMe.java               |     8 +
 .../src/test/condition/IgnoreMeAlso.java           |     8 +
 .../src/test/condition/IgnoreMeNot.java            |     8 +
 .../src/test/condition/TestUnit.java               |    12 +
 .../test/resources/ant/IgnoreTrivial/.gitignore    |     3 +
 .../src/test/resources/ant/IgnoreTrivial}/README   |     0
 .../resources/ant/IgnoreTrivial/build.properties   |    12 +
 .../test/resources/ant/IgnoreTrivial}/build.xml    |   187 +-
 .../ant/IgnoreTrivial/src/mypackage/Main.java      |   249 +
 .../IgnoreTrivial/src/mypackage/MyInterface.java   |     5 +
 .../ant/IgnoreTrivial/src/mypackage/Test.java      |     6 +
 .../src/test/resources/ant/basic}/README           |     0
 .../src/test/resources/ant/basic}/build.properties |    20 +-
 .../src/test/resources/ant/basic}/build.xml        |   193 +-
 .../basic}/src/test/condition/ConditionCalls.java  |   208 +-
 .../ant/basic}/src/test/condition/Test.java        |   112 +-
 .../src/test/resources/antLibrary}/library.xml     |   194 +-
 cobertura/src/test/resources/dtds/coverage-01.dtd  |    40 +
 cobertura/src/test/resources/dtds/coverage-02.dtd  |    47 +
 cobertura/src/test/resources/dtds/coverage-03.dtd  |    55 +
 cobertura/src/test/resources/dtds/coverage-04.dtd  |    61 +
 .../src/test/resources/etc}/jalopy.xml             |   752 +-
 .../src/test/resources/etc}/plugin.properties      |     4 +-
 .../src/test/resources/etc}/plugin.xml             |    44 +-
 .../add_cobertura_to_aspectj_examples.diff         |    50 +
 .../src/test/resources/examples}/basic/README      |     0
 .../resources/examples}/basic/build.properties     |    46 +-
 .../src/test/resources/examples}/basic/build.xml   |   292 +-
 .../basic/build_with_specific_data_file.xml        |   254 +-
 .../basic/src/com/example/simple/Simple.java       |   211 +-
 .../basic/src/com/example/simple/SimpleTest.java   |   118 +-
 .../examples/functionalconditiontest/.gitignore    |     3 +
 .../examples}/functionalconditiontest/README       |     0
 .../functionalconditiontest/build.properties       |    20 +-
 .../examples}/functionalconditiontest/build.xml    |   193 +-
 .../src/test/condition/ConditionCalls.java         |   209 +-
 .../src/test/condition/Test.java                   |   112 +-
 .../resources/examples/functionaltest1/.gitignore  |     4 +
 .../resources/examples/functionaltest1}/README     |    28 +-
 .../examples}/functionaltest1/build.properties     |    20 +-
 .../resources/examples}/functionaltest1/build.xml  |   505 +-
 .../examples/functionaltest1/functionalTest.groovy |   216 +
 .../functionaltest1/src/test/first/A.java          |   118 +-
 .../functionaltest1/src/test/first/B.java          |    92 +-
 .../src/test/first/RemoteInterface.java            |    14 +-
 .../src/test/first/RemoteListener.java             |    32 +-
 .../functionaltest1/src/test/first/Test.java       |   122 +-
 .../functionaltest1/src/test/second/A.java         |   110 +-
 .../functionaltest1/src/test/second/B.java         |    92 +-
 .../src/test/resources/examples}/groovy/README     |    28 +-
 .../resources/examples}/groovy/build.properties    |    50 +-
 .../src/test/resources/examples}/groovy/build.xml  |   280 +-
 .../groovy/src/com/example/simple/Simple.groovy    |   201 +-
 .../src/com/example/simple/SimpleTest.groovy       |   112 +-
 cobertura/src/test/resources/jetty/etc/jetty.xml   |   206 +
 .../src/test/resources/jetty/etc/realm.properties  |    21 +
 .../src/test/resources/jetty/etc/webdefault.xml    |   402 +
 cobertura/src/test/resources/logback-test.xml      |    31 +
 .../test/resources/test/performance/Test1.class    |   Bin 0 -> 3008 bytes
 cobertura/src/test/resources/testJetty/simple.war  |   Bin 0 -> 2751 bytes
 cobertura/src/test/resources/testJetty/web.xml     |    13 +
 .../src/test/resources/testUtil.groovy             |   152 +-
 codestyle/pom.xml                                  |   418 +
 .../cobertura/checkstyle-suppressions.xml          |    11 +
 .../resources/codestyle/cobertura/checkstyle.xml   |   146 +
 .../codestyle/cobertura/findbugs-excludes.xml      |     6 +
 .../resources/codestyle/cobertura/findbugs.xml     |  1052 ++
 .../resources/codestyle/cobertura/pmd-rules.xml    |    58 +
 conversion/conversion-api/pom.xml                  |    92 +
 .../conversion/api/jaxb/AtomicLongAdapter.java     |    61 +
 .../cobertura/conversion/api/JaxbUtils.java        |   143 +
 .../conversion/api/jaxb/AtomicLongAdapterTest.java |    74 +
 .../conversion/api/jaxb/helpers/Person.java        |   101 +
 .../src/test/resources/logback-test.xml            |    42 +
 .../src/test/resources/testdata/person.xml         |    25 +
 conversion/pom.xml                                 |    67 +
 etc/log4j.properties                               |    22 -
 interaction/annotations/annotations-api/pom.xml    |    95 +
 .../annotations/api/metrics/CoberturaIgnored.java  |    48 +
 interaction/annotations/pom.xml                    |    67 +
 interaction/pom.xml                                |    67 +
 metrics/metrics-api/pom.xml                        |   133 +
 .../metrics/api/AbstractCoverageCalculator.java    |    80 +
 .../cobertura/metrics/api/CoverageCalculator.java  |    95 +
 .../cobertura/metrics/api/CoverageType.java        |    38 +
 .../api/event/AbstractSourceLocationListener.java  |    71 +
 .../metrics/api/event/SourceLocationListener.java  |    52 +
 .../metrics/api/location/SourceLocationFilter.java |   259 +
 .../api/T_AbstractCoverageCalculatorTest.java      |   160 +
 .../api/helpers/DebugCoverageCalculator.java       |   108 +
 .../api/helpers/DebugSourceLocationListener.java   |    49 +
 .../api/location/SourceLocationFilterTest.java     |   151 +
 .../src/test/resources/logback-test.xml            |    42 +
 metrics/metrics-model/pom.xml                      |   139 +
 .../cobertura/metrics/model/LocationScope.java     |    67 +
 .../cobertura/metrics/model/Namespace.java         |    33 +
 .../metrics/model/coverage/CoverageRecord.java     |   152 +
 .../cobertura/metrics/model/coverage/Rate.java     |   166 +
 .../legacy/AbstractBranchAndLineCoverage.java      |   139 +
 .../coverage/legacy/AbstractBranchCoverage.java    |   175 +
 .../coverage/legacy/BranchAndLineCoverage.java     |    52 +
 .../model/coverage/legacy/BranchCoverage.java      |    56 +
 .../coverage/scope/AbstractCoverageScope.java      |   190 +
 .../model/coverage/scope/ClassCoverageScope.java   |    71 +
 .../model/coverage/scope/CoverageScope.java        |    66 +
 .../model/coverage/scope/MethodCoverageScope.java  |    76 +
 .../model/coverage/scope/PackageCoverageScope.java |    59 +
 .../model/coverage/scope/ProjectCoverageScope.java |    61 +
 .../metrics/model/location/SourceLocation.java     |   290 +
 .../cobertura/metrics/model/JaxbUtils.java         |   141 +
 .../metrics/model/coverage/CoverageRecordTest.java |   164 +
 .../cobertura/metrics/model/coverage/RateTest.java |   126 +
 .../metrics/model/location/SourceLocationTest.java |   164 +
 .../src/test/resources/logback-test.xml            |    42 +
 .../src/test/resources/testdata/coverageRecord.xml |    29 +
 .../src/test/resources/testdata/rate.xml           |    26 +
 .../src/test/resources/testdata/sourcelocation.xml |    27 +
 metrics/pom.xml                                    |    68 +
 pom.xml                                            |   353 +
 poms/cobertura-api-parent/pom.xml                  |    89 +
 poms/cobertura-parent/pom.xml                      |  1776 +++
 poms/pom.xml                                       |    68 +
 src-2/someotherpackage/SomeOtherClass.java         |    58 -
 src/net/sourceforge/cobertura/ant/package.html     |    17 -
 src/net/sourceforge/cobertura/check/Main.java      |   392 -
 .../coveragedata/CoverageDataFileHandler.java      |   208 -
 .../cobertura/coveragedata/LineData.java           |   528 -
 .../cobertura/coveragedata/SwitchData.java         |   294 -
 .../cobertura/coveragedata/TouchCollector.java     |   221 -
 .../coveragedata/countermaps/AtomicCounterMap.java |    92 -
 .../cobertura/coveragedata/package.html            |    23 -
 .../cobertura/instrument/ClassInstrumenter.java    |   152 -
 .../instrument/FirstPassMethodInstrumenter.java    |   221 -
 .../cobertura/instrument/JumpHolder.java           |    43 -
 src/net/sourceforge/cobertura/instrument/Main.java |   520 -
 .../instrument/NewLocalVariableMethodAdapter.java  |    74 -
 .../instrument/SecondPassMethodInstrumenter.java   |   356 -
 .../cobertura/instrument/SwitchHolder.java         |    40 -
 .../cobertura/javancss/FunctionMetric.java         |    83 -
 .../sourceforge/cobertura/javancss/Javancss.java   |   579 -
 src/net/sourceforge/cobertura/javancss/Metric.java |   112 -
 .../cobertura/javancss/ObjectMetric.java           |    88 -
 .../cobertura/javancss/PackageMetric.java          |    78 -
 .../cobertura/javancss/coberturaREADME.txt         |     5 -
 .../cobertura/javancss/parser/JavaCharStream.java  |   653 --
 .../cobertura/javancss/parser/JavaParser.java      | 10403 -----------------
 .../javancss/parser/JavaParserConstants.java       |   415 -
 .../javancss/parser/JavaParserInterface.java       |    86 -
 .../javancss/parser/JavaParserTokenManager.java    |  2144 ----
 .../cobertura/javancss/parser/ParseException.java  |   237 -
 .../cobertura/javancss/parser/Token.java           |   163 -
 .../cobertura/javancss/parser/TokenMgrError.java   |   179 -
 .../javancss/parser/debug/JavaCharStream.java      |   654 --
 .../javancss/parser/debug/JavaParserDebug.java     | 11082 -------------------
 .../parser/debug/JavaParserDebugConstants.java     |   416 -
 .../parser/debug/JavaParserDebugTokenManager.java  |  2146 ----
 .../javancss/parser/debug/ParseException.java      |   238 -
 .../cobertura/javancss/parser/debug/Token.java     |   164 -
 .../javancss/parser/debug/TokenMgrError.java       |   180 -
 .../javancss/parser/java15/JavaCharStream.java     |   653 --
 .../javancss/parser/java15/JavaParser15.java       |  6459 -----------
 .../parser/java15/JavaParser15Constants.java       |   431 -
 .../parser/java15/JavaParser15TokenManager.java    |  2140 ----
 .../javancss/parser/java15/ParseException.java     |   237 -
 .../cobertura/javancss/parser/java15/Token.java    |   128 -
 .../javancss/parser/java15/TokenMgrError.java      |   179 -
 .../parser/java15/debug/JavaCharStream.java        |   653 --
 .../parser/java15/debug/JavaParser15Debug.java     |  7044 ------------
 .../java15/debug/JavaParser15DebugConstants.java   |   431 -
 .../debug/JavaParser15DebugTokenManager.java       |  2140 ----
 .../parser/java15/debug/ParseException.java        |   237 -
 .../javancss/parser/java15/debug/Token.java        |   128 -
 .../parser/java15/debug/TokenMgrError.java         |   179 -
 src/net/sourceforge/cobertura/merge/Main.java      |    98 -
 .../cobertura/reporting/ComplexityCalculator.java  |   269 -
 src/net/sourceforge/cobertura/reporting/Main.java  |   180 -
 .../cobertura/util/ConfigurationUtil.java          |   113 -
 test/HelloWorld.java                               |    77 -
 test/log4j.xml                                     |    15 -
 .../cobertura/coveragedata/SwitchDataTest.java     |   230 -
 .../cobertura/coveragedata/TouchCollectorTest.java |   108 -
 .../countermaps/AtomicCounterMapTest.java          |    90 -
 .../net/sourceforge/cobertura/merge/MergeTest.java |   290 -
 .../reporting/ComplexityCalculator2Test.groovy     |   158 -
 .../reporting/ComplexityCalculatorTest.java        |   171 -
 .../cobertura/test/util/TestUtil.groovy            |   278 -
 .../cobertura/test/util/WebappServer.groovy        |   405 -
 .../test/MultipleClassloaderFunctionalTest.groovy  |   221 -
 .../thread/test/ThreadedFunctionalTest.groovy      |   276 -
 .../cobertura/util/CommandLineBuilderTest.java     |   167 -
 .../sourceforge/cobertura/util/FileFinderTest.java |   142 -
 .../sourceforge/cobertura/util/FileFixture.java    |   127 -
 .../webapp/test/WebAppFunctionalTest.groovy        |   292 -
 433 files changed, 55304 insertions(+), 75179 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f2a064a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,90 @@
+# Custom project ignores
+atlassian-ide-plugin.xml
+.surefire-*
+cobertura/src/main/java/net/sourceforge/cobertura/javancss/parser/
+**/cobertura.ser
+
+# Generated by http://gitignore.io
+
+### Java ###
+*.class
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+### Maven ###
+target/
+
+### Eclipse ###
+*.pydevproject
+.project
+.metadata
+bin/**
+tmp/**
+tmp/**/*
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+### IntelliJ ###
+*.iml
+*.ipr
+*.iws
+.idea/
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+
+### OSX ###
+.DS_Store
+.AppleDouble
+.LSOverride
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+
+### Windows ###
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+### Mercurial ###
+/.hg/*
+*/.hg/*
+.hgignore
diff --git a/COPYING b/LICENSE.txt
similarity index 98%
copy from COPYING
copy to LICENSE.txt
index fbdd65f..d60c31a 100644
--- a/COPYING
+++ b/LICENSE.txt
@@ -1,340 +1,340 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  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
-this service 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 make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  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.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-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
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE 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.
-
-		     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
-convey 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 2 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, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year  name of author
-    Gnomovision 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, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This 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 Library General
-Public License instead of this License.
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  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.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+		     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
+convey 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 2 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, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
diff --git a/README b/README
deleted file mode 100644
index f8daf49..0000000
--- a/README
+++ /dev/null
@@ -1,31 +0,0 @@
-ABOUT
-
-Cobertura is a free Java code coverage reporting tool.  It is
-based on jcoverage 1.0.5.  See the Cobertura web page for more
-details.  http://cobertura.sourceforge.net/
-
-
-COPYRIGHT
-
-See the included file "COPYRIGHT"
-
-
-LICENSE
-
-Cobertura is free software.  Most of it is licensed under the GNU
-GPL, and 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 2 of the License, or (at your option)
-any later version.  Please review the file COPYING included in this
-distribution for further details.
-
-Parts of Cobertura are licensed under the Apache Software License,
-Version 1.1.
-
-
-WARRANTY
-
-Cobertura 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.
diff --git a/ChangeLog b/README.markdown
similarity index 68%
rename from ChangeLog
rename to README.markdown
index f1531b7..e97c14a 100644
--- a/ChangeLog
+++ b/README.markdown
@@ -1,270 +1,373 @@
-version 1.9.4.1:
-	* Fix a problem that occurs in Tomcat.   When TouchCollector 
-	  initializes, it calls ProjectData.initialize() which (with 
-	  Tomcat only) eventually calls TouchCollector.   However, 
-	  TouchCollector's static members have not been initialized.   
-	  Added a test that highlights this problem.   (Thanks to Jack Cobb
-	  for suggesting the fix).
-	* Runs on Java 5.  (Fix for Bug 2962599).
-	
-
-version 1.9.4:
-	* Cobertura is now up to 10x faster. Aggregates changes in
-	  temporary TouchCollector class (thread-safe, but lock-free) and after that
-	  applies it on real model (ProjectData) as a batch operation. (Piotr Tabor)
-	* Fixed "Some packages are included more then once" bug (#2875576) that
-	  caused some counts on the HTML report to be incorrect.  (Charlie Squires)
-	* Fixed "Inner classes not counted in coverage report total" bug (#2943320)
-	  (Charlie Squires)
-
-version 1.9.3:
-	* Update to the latest Javancss (32.53) to fix some complexity calculation
-	  problems.  Bug #2824425. (John Lewis)
-	* Non-Java source files (like Groovy) no longer show the JavaNCSS warnings
-	  during cobertura-report.  Fix of bug #2819844.
-	* Support the case where multiple classloaders each load the Cobertura 
-	  classes.  (Ed Randall)
-	* Fixed bug added with 1.9.2 where a NullPointerException is thrown
-	  if ProjectData.saveGlobalProjectData() is called before any instrumented
-	  code is executed.
-
-version 1.9.2:
-	* Cobertura is now thread safe.
-	* Fix for FileLocker exception when writing coverage data 
-	  (java.lang.IllegalStateException: Shutdown in progress) that started
-	  to appear with Java 6 update 14. (Chris van Es)
-	* Fix for bug "Unix scripts behave oddly due to DOS format - ID: 2788621"
-
-version 1.9.1.1:
-	* Just a copy of 1.9.1 with a corrected Maven POM file (cobertura-runtime.pom).
-	  A new version has to be created to get it uploaded to the central Maven repo.
-
-version 1.9.1:
-	* Complexity calculation now works with Java 5 language
-	  features such as Annotations. (Tri Bao Ho)
-	* Removed the bold font from the source-view for uncovered lines to
-	  improve the alignment.  (Jiri Mares)
-	* Support Ant <dirset>s. (Matt Cordes, John Lewis)
-	* Support the antlib mechanism for defining and importing 
-	  ant tasks. (Richard Atkins)
-	* Reports now support source encoded in something than UTF-8. (Jiri Mares)
-	* Report generation performance improvement. (Ignat Zapolsky)
-	* Report generation will look in zip and jar files if the 
-	  source java file is not found. (Charlie Squires, John Lewis)
-	* cobertura-check with linerate=0, branchrate=0, 
-	  packagebranchrate=0, packagelinerate=0, totalbranchrate=0,
-	  totallinerate=0 will no longer default all the values to
-	  50 as before.   Therefore, cobertura-check will always pass.
-	  Note that this still means that <cobertura-check /> (with
-	  no attributes) will still default to 50 for all rates. (Charlie
-	  Squires) (Bug 2152919)
-	* New coberturaFlush.war is created.   Deploy it to a 
-	  web server and invoke http://<HOST>:<PORT>/coberturaFlush/flushCobertura
-	  for a convenient way of flushing the cobertura data to the
-	  datafile without stopping the web server.  (Amit Nithianandan)
-	* XML report now shows total lines-covered, lines-valid, 
-	  branches-covered, branches-valid, and complexity.  (Julian Gamble)
-	* New report option called "summaryXml" will create
-	  a small summary XML report that does not have all the
-	  details on the classes - just the overall totals.  This
-	  is for large projects where the full XML report gets so
-	  big it impairs continuous build processes.  (Julian Gamble and Dan Godfrey)
-	* Migrated from asm-2.2.1 to asm-3.0. (Jiri Mares)
-	* The percentage coverage of 199 out of 200 lines has been 100%. 
-	  No more! Now it is 99%.  (Jiri Mares)
-	* Spelling error corrected in main.css file - changed magin to
-	  margin. (Dennis Lundberg)
-
-version 1.9:
-	* Much improved branch coverage.  Information on whether
-	  the true as well as the false of an if statement is
-	  collected.  Also, information on the branches of a
-	  switch statement (including the default) is collected.
-	  (Jiri Mares)
-	* Assume Java source files are saved as UTF-8 instead of
-	  the computer's default encoding.
-	* Write all HTML and XML reports in UTF-8 instead of the
-	  computer's default encoding (Naoki Iwami).
-	* Fix a bug where the Cobertura ant tasks would not work
-	  correctly in Microsoft Windows when Cobertura was
-	  installed on a different drive than the drive from which
-	  you're running ant (Srivathsan Varadarajan).
-	* Added a "maxmemory" attribute to the instrument, merge
-	  and report ant tasks (Matt Cordes).
-	* Improve support for Maven and similar environments where
-	  control over system properties is difficult such as
-	  app servers, IoC containers, IDEs, etc.  Setting the
-	  datafile location is difficult in these environments.
-	  To correct this, a cobertura.properties file 
-	  located in the classpath is used to properly set the 
-	  net.sourceforge.cobertura.datafile property.  
-	  (Joakim Erdfelt)
-
-version 1.8 (2006-04-10)
-	* Ability to have multiple <ignore/> regular expressions
-	  in the instrument task (Alexei Yudichev).
-	* Ability to specify a minimum branch coverage rate and
-	  line coverage rate for each package when using
-	  cobertura-check.
-	* Show the number of lines and branches covered and the
-	  total number of lines and branches in the HTML report.
-	* Support for instrumenting classes written in Groovy.
-	* Lock the data file before trying to write to it.  This
-	  allows multiple JVMs (or multiple class loaders within
-	  a single JVM) to write to the same coverage data file
-	  with no problems (John Lewis).
-	* Ability to instrument classes on a given classpath
-	  instead of specifying filesets (John Lewis).
-	* Ability to specify which classes will be instrumented
-	  using regular expressions (John Lewis).
-	* Archives within archives will be instrumented if you
-	  specify an includeClassname regular expression (John
-	  Lewis).
-	* If instrumenting an archive, remove any signatures
-	  and checksums, since they will no longer be valid (John
-	  Lewis).
-	* Removed the Class-Path line from cobertura.jar.  You may
-	  need to modify your Cobertura taskdef to include the jars
-	  in Cobertura's 'lib' directory.  See our Ant task web
-	  page for an example.
-	* Reorganized libs into a flatter directory structure--you
-	  may need to update your ant scripts.
-	* Upgraded from asm 2.1 to asm 2.2.1.  No code changes were
-	  needed.
-	* Copied portions of classes from JavaNCSS into Cobertura
-	  so that we don't need to include the entire JavaNCSS and
-	  CCL jars.
-
-version 1.7 (2005-12-06)
-	* log4j is no longer used by the Cobertura classes that are
-	  accessed by instrumented Java code.  This means you will
-	  not need to add log4j to your project's classpath in order
-	  to use Cobertura (but log4j is still required when
-	  instrumenting and reporting).
-	* Upgraded from asm 2.0 to asm 2.1.  No code changes were
-	  needed.
-	* Improved the merge task.  It should work correctly now
-	  (with help from  Björn Beskow).
-	* Fixed the ability to specify a data file in the merge task.
-	* Changed the command-line interface to the merge task and
-	  added a helper batch/shell script.
-	* Added better error checking to the merge task.
-	* Fixed a bug where an empty or incomplete coverage data
-	  file would be written when you test classes inside Tomcat,
-	  and you stop Tomcat using the shutdown.bat or shutdown.sh
-	  scripts.  This would result in an EOFException when running
-	  cobertura-report.
-	* Added support for classes compiled with AspectJ.
-	* Cobertura now produces valid XHTML 1.0 reports.
-
-version 1.6 (2005-08-22)
-	* Can now use multiple filesets in the cobertura-instrument
-	  task (Thanks to Grzegorz Lukasik).
-	* Can now use multiple filesets in the cobertura-report task
-	  (Thanks to Jeremy Thomerson, Grzegorz Lukasik and James Seigel).
-	* No longer using the Java version of GNU GetOpt
-	* Fixed a bug where the total number of classes displayed in
-	  the HTML report included anonymous classes when it should
-	  not have.
-
-version 1.5 (2005-08-05)
-	* Shortened the header shown when running Cobertura (Thanks
-	  to Jarkko Viinamäki).
-	* Don't save the data file twice after instrumenting.
-	* Print a warning when running cobertura-report with a
-	  data file that does not contain information from the
-	  instrument step.
-	* When instrumenting, you can now specify a zip, jar, war,
-	  ear or sar file and Cobertura will instrument any classes
-	  inside of the archive.  You must explicity give the name
-	  of the archive when instrumenting--giving the name of the
-	  directory containing the archive will not work (Thanks to
-	  Grzegorz Lukasik).
-	* Fixed a bug where the class list in the HTML reports did
-	  not show multiple classes with the same name, but in
-	  different packages.
-	* Add a timestamp and version number to all HTML reports.
-	* Add a timestamp and version number to all XML reports.
-	* Add the combined line-rate and branch-rate for all
-	  packages to all XML reports.
-	* Fixed the merge task (Thanks to Mark Sinke).
-	* The check task now supports checking against a project's
-	  total branch and line coverage rates (Thanks to Nathan
-	  Wilson).
-	* The check ant task now allows you to fail the ant build,
-	  if desired (Thanks to Nathan Wilson).
-	* The check task can set an ant property to "true" on
-	  failure (Thanks to Alex Ruiz).
-	* Changed some of the parameters for the check task.  See
-	  the online documentation for usage information.
-	* The command line Windows batch scripts work better.
-
-version 1.4 (2005-05-30)
-	* Fixed a bug that sometimes resulted in a
-	  StringIndexOutOfBoundsException when running cobertura-report
-	  (Thanks to Grzegorz Lukasik).
-	* Fixed a bug where classes without coverage data ("N/A") were
-	  not always sorted correctly in the HTML report (Thanks to
-	  Olivier Parent).
-	* Fixed a bug where the code complexity column would not always
-	  sort correctly in locales that use a comma to split the decimal
-	  part of the number (Thanks to Olivier Parent).
-	* Show "N/A" in the branch column of the HTML report for classes
-	  and packages that do not have any branches.
-
-version 1.3 (2005-05-20)
-	* Increased speed of HTML reports by filtering the files read
-	  in to determine cyclomatic complexity numbers on.
-	* In the lower left pane of the HTML reports, classes are now
-	  sorted only by their class name (instead of by their package
-	  name plus class name).
-	* Changed the format of the XML reports to something that
-	  is hopefully easier to use and more natural.  This
-	  unfortunately breaks backward compatability.
-	* We're using a DTD for the XML reports now.  See
-	  http://cobertura.sourceforge.net/xml/coverage-01.dtd
-	* Added the ability to specify the location of the coverage
-	  data files from the ant tasks and the command line.
-	* More user-friendly error checking and reporting.
-
-version 1.2 (2005-03-16)
-	* Fix a bug that caused the XML reports to be invalid XML
-	  (they were missing the </package> tag).
-	* Use Java 1.4 pattern matching and remove Jakarta ORO.
-
-version 1.1 (2005-03-08)
-	* Fix a bug in the syntax highlighting code of the HTML report
-	  generation.  Previously, the highlighting for single quotes
-	  containing "\\" would not end correctly.
-	* Check the third party jars into CVS using the correct CVS
-	  substition flag (binary, not ASCII).
-	* Temporary files created by the instrument ant task and merge
-	  ant task are now deleted after the ant task finishes.
-	* Switch the instrumentation classes to use ASM instead of
-	  Apache BCEL.  There are three benefits to this:
-	  1. BCEL was throwing exceptions with some source code compiled
-	     with JDK 1.5--ASM works fine.
-	  2. ASM is licensed under the revised BSD license, which
-	     is compatable with the GPL, which allows us to remove
-	     the questionable exception for BCEL.
-	  3. Instrumentation is about 5 times faster with ASM than BCEL.
-	* Modify the HTML reports so that classes without line number
-	  information will appear as "Not Applicable."  This includes
-	  skeleton classes, stub classes, interfaces, or anything not
-	  compiled with debug=true.
-	* Fix bug #1151777 with a patch from Jeremy Thomerson.
-	  Previously we were not escaping some characters correctly in the
-	  generated XML coverage report (specificially < and >).
-	* Set the class-path in the cobertura.jar manifest file correctly.
-	* Fill feature request #1151779 with a patch from Jeremy Thomerson.
-	  This changes the structure of the XML report so that <classes> are
-	  enclosed inside <packages>.
-
-version 1.0 (2005-02-12)
-	* Forked jcoverage 1.0.5 (although the version in the source says 1.0.4).
-	  All original code is copyright 2003 jcoverage ltd.  Kurt Guenther
-	  highlighted a bug in the branch coverage, was was fixed.
-	* Applied a patch from Joakim Erdfelt to fix a bug where jcoverage
-	  would fail to instrument classes if you attempted to instrument a
-	  very large number of classes (in the hundreds).
-	* Rewrote the HTML reporting and included code complexity in the output.
+# COBERTURA
+[![Build Status](http://www.cloudbees.com/sites/default/files/Button-Built-on-CB-1.png)](https://cobertura.ci.cloudbees.com/job/Cobertura/)
+[![Build Status](http://www.cloudbees.com/sites/default/files/Button-Powered-by-CB.png)](http://www.cloudbees.com/)
+
+## ABOUT
+Cobertura is a free Java code coverage reporting tool.  It is
+based on jcoverage 1.0.5.  See the [Cobertura web page](http://cobertura.sourceforge.net/)
+and [wiki](https://github.com/cobertura/cobertura/wiki) for more details.
+
+Since 2.0.0, Cobertura versions follow the [Semantic versioning](http://semver.org/) guidelines.
+
+## COPYRIGHT
+Code in the net.sourceforge.cobertura.javancss package is
+Copyright (C) 2000 Chr. Clemens Lee   <clemens a.t kclee d.o.t com>
+
+See the included file "LICENSE.txt"
+
+## LICENSE
+Cobertura is free software.  Most of it is licensed under the GNU
+GPL, and 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 2 of the License, or (at your option)
+any later version.  Please review the file LICENSE.txt included in this
+distribution for further details.
+Parts of Cobertura are licensed under the Apache Software License,
+Version 1.1.
+
+## WARRANTY
+Cobertura 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.
+
+## CONVENTIONS
+Before committing
+* check all tests pass
+* build the project, so that all code gets uniformly indented. A Maven plugin ensures this.
+
+## CONTRIBUTORS
+List of all contributors to Cobertura listed alphabetically by last name
+* Copyright (C) 2005 Björn Beskow      <bbeskow a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2008 Matt Cordes        <mcordes a.t visa d.o.t com>
+* Copyright (C) 2005 Erik Dick          <erdick a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2005 Mark Doliner       <thekingant a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2005 Joakim Erdfelt     <joakim a.t erdfelt d.o.t net>
+* Copyright (C) 2008 Scott Frederick    <scottyfred a.t gmail d.o.t com>
+* Copyright (C) 2008 Julian Gamble      <juliangamble a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2006 Dan Godfrey        <dgodfrey99 a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2008 Tri Bao Ho         <hotribao a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2006 Naoki Iwami        <naoki_iwami a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2003 jcoverage ltd.
+* Copyright (C) 2009 John Lewis         <lewijw a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2005 Grzegorz Lukasik   <hauserx a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2006 Jiri Mares         <jirimares a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2009 Amit Nithianandan  <ANithian a.t gmail d.o.t com>
+* Copyright (C) 2005 Olivier Parent     <olivier-parent a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2009 Ed Randall         <ed_randall a.t yahoo d.o.t com>
+* Copyright (C) 2005 Alex Ruiz          <alruiz15 a.t users d.o.t yahoo d.o.t com>
+* Copyright (C) 2005 James Seigel       <cgul a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2005 Mark Sinke         <marksinke a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2010 Tad Smith          <tsmith a.t lw-lmco d.o.t com>
+* Copyright (C) 2009 Charlie Squires    <rockonword a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2010 Piotr Tabor        <piotr.tabor a.t gmail d.o.t com>
+* Copyright (C) 2005 Jeremy Thomerson   <jthomerson a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2009 Chris van Es       <cvanes a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2006 Srivathsan Varadarajan <vatsanv a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2005 Nathan Wilson      <ndciwilson a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2005 Alexei Yudichev    <sflexus a.t users d.o.t sourceforge d.o.t net>
+* Copyright (C) 2013 Steven Christou    <schristou88 a.t gmail d.o.t com>
+
+## MAVEN MIGRATION NOTES
+* *How do we get a good blame while all files were moved?*
+
+Use "git blame --follow" nameOfFile.java
+
+
+## CHANGELOG
+
+### version 2.0.3:
+	* Fixed null version in reports. (Github Issue 37)
+	* Added auxClasspath argument to fix ClassNotFoundException with ClassWriter.getCommonSuperClass. Thanks Hendrik Brummermann(nhnb)
+	* Fixed parsing of anonymous classes. (Github Issue 53)
+	* Fixed ClassCastException with JumpTouchPointDescriptor, SwitchTouchPointDescriptor and LineTouchPointDescriptor.
+	* Fixed parsing for += in if-statement.
+
+### version 2.0.2:
+	* Compiled code using source and target of java 5.
+	* Fixed sensitive test units.
+
+### version 2.0.1:
+	* Fix a problem that occurs if class version lower than 49.
+
+### version 2.0.0:
+	* New --ignoreTrivial switch that tells Cobertura to ignore the 
+	  following in the coverage report: Getter methods that simply 
+	  read a class field; Setter methods that set a class field;
+	  Constructors that only set class fields and call a super 
+	  class constructor.
+	  (Patch 3010530 from 1576631) (Scott Frederick/Tad Smith)
+	* New --ignoreMethodAnnotation switch used to specify an annotation that, 
+	  when present on a method, will cause Cobertura to ignore the 
+	  method in the coverage report.
+	  (Patch 3010530) (Tad Smith)
+
+### version 1.9.4.1:
+	* Fix a problem that occurs in Tomcat.   When TouchCollector 
+	  initializes, it calls ProjectData.initialize() which (with 
+	  Tomcat only) eventually calls TouchCollector.   However, 
+	  TouchCollector's static members have not been initialized.   
+	  Added a test that highlights this problem.   (Thanks to Jack Cobb
+	  for suggesting the fix).
+	* Runs on Java 5.  (Fix for Bug 2962599).
+
+### version 1.9.4:
+	* Cobertura is now up to 10x faster. Aggregates changes in
+	  temporary TouchCollector class (thread-safe, but lock-free) and after that
+	  applies it on real model (ProjectData) as a batch operation. (Piotr Tabor)
+	* Fixed "Some packages are included more then once" bug (#2875576) that
+	  caused some counts on the HTML report to be incorrect.  (Charlie Squires)
+	* Fixed "Inner classes not counted in coverage report total" bug (#2943320)
+	  (Charlie Squires)
+
+### version 1.9.3:
+	* Update to the latest Javancss (32.53) to fix some complexity calculation
+	  problems.  Bug #2824425. (John Lewis)
+	* Non-Java source files (like Groovy) no longer show the JavaNCSS warnings
+	  during cobertura-report.  Fix of bug #2819844.
+	* Support the case where multiple classloaders each load the Cobertura 
+	  classes.  (Ed Randall)
+	* Fixed bug added with 1.9.2 where a NullPointerException is thrown
+	  if ProjectData.saveGlobalProjectData() is called before any instrumented
+	  code is executed.
+
+### version 1.9.2:
+	* Cobertura is now thread safe.
+	* Fix for FileLocker exception when writing coverage data 
+	  (java.lang.IllegalStateException: Shutdown in progress) that started
+	  to appear with Java 6 update 14. (Chris van Es)
+	* Fix for bug "Unix scripts behave oddly due to DOS format - ID: 2788621"
+
+### version 1.9.1.1:
+	* Just a copy of 1.9.1 with a corrected Maven POM file (cobertura-runtime.pom).
+	  A new version has to be created to get it uploaded to the central Maven repo.
+
+### version 1.9.1:
+	* Complexity calculation now works with Java 5 language
+	  features such as Annotations. (Tri Bao Ho)
+	* Removed the bold font from the source-view for uncovered lines to
+	  improve the alignment.  (Jiri Mares)
+	* Support Ant <dirset>s. (Matt Cordes, John Lewis)
+	* Support the antlib mechanism for defining and importing 
+	  ant tasks. (Richard Atkins)
+	* Reports now support source encoded in something than UTF-8. (Jiri Mares)
+	* Report generation performance improvement. (Ignat Zapolsky)
+	* Report generation will look in zip and jar files if the 
+	  source java file is not found. (Charlie Squires, John Lewis)
+	* cobertura-check with linerate=0, branchrate=0, 
+	  packagebranchrate=0, packagelinerate=0, totalbranchrate=0,
+	  totallinerate=0 will no longer default all the values to
+	  50 as before.   Therefore, cobertura-check will always pass.
+	  Note that this still means that <cobertura-check /> (with
+	  no attributes) will still default to 50 for all rates. (Charlie
+	  Squires) (Bug 2152919)
+	* New coberturaFlush.war is created.   Deploy it to a 
+	  web server and invoke http://<HOST>:<PORT>/coberturaFlush/flushCobertura
+	  for a convenient way of flushing the cobertura data to the
+	  datafile without stopping the web server.  (Amit Nithianandan)
+	* XML report now shows total lines-covered, lines-valid, 
+	  branches-covered, branches-valid, and complexity.  (Julian Gamble)
+	* New report option called "summaryXml" will create
+	  a small summary XML report that does not have all the
+	  details on the classes - just the overall totals.  This
+	  is for large projects where the full XML report gets so
+	  big it impairs continuous build processes.  (Julian Gamble and Dan Godfrey)
+	* Migrated from asm-2.2.1 to asm-3.0. (Jiri Mares)
+	* The percentage coverage of 199 out of 200 lines has been 100%. 
+	  No more! Now it is 99%.  (Jiri Mares)
+	* Spelling error corrected in main.css file - changed magin to
+	  margin. (Dennis Lundberg)
+
+### version 1.9:
+	* Much improved branch coverage.  Information on whether
+	  the true as well as the false of an if statement is
+	  collected.  Also, information on the branches of a
+	  switch statement (including the default) is collected.
+	  (Jiri Mares)
+	* Assume Java source files are saved as UTF-8 instead of
+	  the computer's default encoding.
+	* Write all HTML and XML reports in UTF-8 instead of the
+	  computer's default encoding (Naoki Iwami).
+	* Fix a bug where the Cobertura ant tasks would not work
+	  correctly in Microsoft Windows when Cobertura was
+	  installed on a different drive than the drive from which
+	  you're running ant (Srivathsan Varadarajan).
+	* Added a "maxmemory" attribute to the instrument, merge
+	  and report ant tasks (Matt Cordes).
+	* Improve support for Maven and similar environments where
+	  control over system properties is difficult such as
+	  app servers, IoC containers, IDEs, etc.  Setting the
+	  datafile location is difficult in these environments.
+	  To correct this, a cobertura.properties file 
+	  located in the classpath is used to properly set the 
+	  net.sourceforge.cobertura.datafile property.  
+	  (Joakim Erdfelt)
+
+### version 1.8 (2006-04-10)
+	* Ability to have multiple <ignore/> regular expressions
+	  in the instrument task (Alexei Yudichev).
+	* Ability to specify a minimum branch coverage rate and
+	  line coverage rate for each package when using
+	  cobertura-check.
+	* Show the number of lines and branches covered and the
+	  total number of lines and branches in the HTML report.
+	* Support for instrumenting classes written in Groovy.
+	* Lock the data file before trying to write to it.  This
+	  allows multiple JVMs (or multiple class loaders within
+	  a single JVM) to write to the same coverage data file
+	  with no problems (John Lewis).
+	* Ability to instrument classes on a given classpath
+	  instead of specifying filesets (John Lewis).
+	* Ability to specify which classes will be instrumented
+	  using regular expressions (John Lewis).
+	* Archives within archives will be instrumented if you
+	  specify an includeClassname regular expression (John
+	  Lewis).
+	* If instrumenting an archive, remove any signatures
+	  and checksums, since they will no longer be valid (John
+	  Lewis).
+	* Removed the Class-Path line from cobertura.jar.  You may
+	  need to modify your Cobertura taskdef to include the jars
+	  in Cobertura's 'lib' directory.  See our Ant task web
+	  page for an example.
+	* Reorganized libs into a flatter directory structure--you
+	  may need to update your ant scripts.
+	* Upgraded from asm 2.1 to asm 2.2.1.  No code changes were
+	  needed.
+	* Copied portions of classes from JavaNCSS into Cobertura
+	  so that we don't need to include the entire JavaNCSS and
+	  CCL jars.
+
+### version 1.7 (2005-12-06)
+	* log4j is no longer used by the Cobertura classes that are
+	  accessed by instrumented Java code.  This means you will
+	  not need to add log4j to your project's classpath in order
+	  to use Cobertura (but log4j is still required when
+	  instrumenting and reporting).
+	* Upgraded from asm 2.0 to asm 2.1.  No code changes were
+	  needed.
+	* Improved the merge task.  It should work correctly now
+	  (with help from  Björn Beskow).
+	* Fixed the ability to specify a data file in the merge task.
+	* Changed the command-line interface to the merge task and
+	  added a helper batch/shell script.
+	* Added better error checking to the merge task.
+	* Fixed a bug where an empty or incomplete coverage data
+	  file would be written when you test classes inside Tomcat,
+	  and you stop Tomcat using the shutdown.bat or shutdown.sh
+	  scripts.  This would result in an EOFException when running
+	  cobertura-report.
+	* Added support for classes compiled with AspectJ.
+	* Cobertura now produces valid XHTML 1.0 reports.
+
+### version 1.6 (2005-08-22)
+	* Can now use multiple filesets in the cobertura-instrument
+	  task (Thanks to Grzegorz Lukasik).
+	* Can now use multiple filesets in the cobertura-report task
+	  (Thanks to Jeremy Thomerson, Grzegorz Lukasik and James Seigel).
+	* No longer using the Java version of GNU GetOpt
+	* Fixed a bug where the total number of classes displayed in
+	  the HTML report included anonymous classes when it should
+	  not have.
+
+### version 1.5 (2005-08-05)
+	* Shortened the header shown when running Cobertura (Thanks
+	  to Jarkko Viinamäki).
+	* Don't save the data file twice after instrumenting.
+	* Print a warning when running cobertura-report with a
+	  data file that does not contain information from the
+	  instrument step.
+	* When instrumenting, you can now specify a zip, jar, war,
+	  ear or sar file and Cobertura will instrument any classes
+	  inside of the archive.  You must explicity give the name
+	  of the archive when instrumenting--giving the name of the
+	  directory containing the archive will not work (Thanks to
+	  Grzegorz Lukasik).
+	* Fixed a bug where the class list in the HTML reports did
+	  not show multiple classes with the same name, but in
+	  different packages.
+	* Add a timestamp and version number to all HTML reports.
+	* Add a timestamp and version number to all XML reports.
+	* Add the combined line-rate and branch-rate for all
+	  packages to all XML reports.
+	* Fixed the merge task (Thanks to Mark Sinke).
+	* The check task now supports checking against a project's
+	  total branch and line coverage rates (Thanks to Nathan
+	  Wilson).
+	* The check ant task now allows you to fail the ant build,
+	  if desired (Thanks to Nathan Wilson).
+	* The check task can set an ant property to "true" on
+	  failure (Thanks to Alex Ruiz).
+	* Changed some of the parameters for the check task.  See
+	  the online documentation for usage information.
+	* The command line Windows batch scripts work better.
+
+### version 1.4 (2005-05-30)
+	* Fixed a bug that sometimes resulted in a
+	  StringIndexOutOfBoundsException when running cobertura-report
+	  (Thanks to Grzegorz Lukasik).
+	* Fixed a bug where classes without coverage data ("N/A") were
+	  not always sorted correctly in the HTML report (Thanks to
+	  Olivier Parent).
+	* Fixed a bug where the code complexity column would not always
+	  sort correctly in locales that use a comma to split the decimal
+	  part of the number (Thanks to Olivier Parent).
+	* Show "N/A" in the branch column of the HTML report for classes
+	  and packages that do not have any branches.
+
+### version 1.3 (2005-05-20)
+	* Increased speed of HTML reports by filtering the files read
+	  in to determine cyclomatic complexity numbers on.
+	* In the lower left pane of the HTML reports, classes are now
+	  sorted only by their class name (instead of by their package
+	  name plus class name).
+	* Changed the format of the XML reports to something that
+	  is hopefully easier to use and more natural.  This
+	  unfortunately breaks backward compatability.
+	* We're using a DTD for the XML reports now.  See
+	  http://cobertura.sourceforge.net/xml/coverage-01.dtd
+	* Added the ability to specify the location of the coverage
+	  data files from the ant tasks and the command line.
+	* More user-friendly error checking and reporting.
+
+### version 1.2 (2005-03-16)
+	* Fix a bug that caused the XML reports to be invalid XML
+	  (they were missing the </package> tag).
+	* Use Java 1.4 pattern matching and remove Jakarta ORO.
+
+### version 1.1 (2005-03-08)
+	* Fix a bug in the syntax highlighting code of the HTML report
+	  generation.  Previously, the highlighting for single quotes
+	  containing "\\" would not end correctly.
+	* Check the third party jars into CVS using the correct CVS
+	  substition flag (binary, not ASCII).
+	* Temporary files created by the instrument ant task and merge
+	  ant task are now deleted after the ant task finishes.
+	* Switch the instrumentation classes to use ASM instead of
+	  Apache BCEL.  There are three benefits to this:
+	  1. BCEL was throwing exceptions with some source code compiled
+	     with JDK 1.5--ASM works fine.
+	  2. ASM is licensed under the revised BSD license, which
+	     is compatable with the GPL, which allows us to remove
+	     the questionable exception for BCEL.
+	  3. Instrumentation is about 5 times faster with ASM than BCEL.
+	* Modify the HTML reports so that classes without line number
+	  information will appear as "Not Applicable."  This includes
+	  skeleton classes, stub classes, interfaces, or anything not
+	  compiled with debug=true.
+	* Fix bug #1151777 with a patch from Jeremy Thomerson.
+	  Previously we were not escaping some characters correctly in the
+	  generated XML coverage report (specificially < and >).
+	* Set the class-path in the cobertura.jar manifest file correctly.
+	* Fill feature request #1151779 with a patch from Jeremy Thomerson.
+	  This changes the structure of the XML report so that <classes> are
+	  enclosed inside <packages>.
+
+### version 1.0 (2005-02-12)
+	* Forked jcoverage 1.0.5 (although the version in the source says 1.0.4).
+	  All original code is copyright 2003 jcoverage ltd.  Kurt Guenther
+	  highlighted a bug in the branch coverage, was was fixed.
+	* Applied a patch from Joakim Erdfelt to fix a bug where jcoverage
+	  would fail to instrument classes if you attempted to instrument a
+	  very large number of classes (in the hundreds).
+	* Rewrote the HTML reporting and included code complexity in the output.
diff --git a/build.properties b/build.properties
deleted file mode 100644
index 4641708..0000000
--- a/build.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-version=1.9.4.1
-description=A code coverage analysis tool.
-
-# TODO: Make this better.
-eclipse.dir=/opt/eclipse
-
-# Directories of source files
-etc.dir=etc
-examples.dir=examples
-examples.functionalconditiontest.dir=examples/functionalconditiontest/src
-lib.dir=lib
-src.dir=src
-othersrc.dir=src-2
-test.src.dir=test
-jetty.dir=jetty
-
-# Directories for generated output
-build.dir=build
-build.classes.dir=${build.dir}/classes
-build.otherclasses.dir=${build.dir}/otherclasses
-build.functionalconditiontest.dir=${build.dir}/functionalconditiontestclasses
-build.instrumented.dir=${build.dir}/instrumented
-build.api.dir=${build.dir}/api
-build.dist.dir=${build.dir}/dist
-build.dist.eclipse.dir=${build.dist.dir}/eclipse
-build.test.dir=${build.dir}/test
-build.test.classes.dir=${build.test.dir}/classes
-build.reports.dir=${build.dir}/reports
-build.bundle.dir=${build.dir}/bundle
-build.bundle.source.dir=${build.bundle.dir}/source
-build.bundle.runtime.dir=${build.bundle.dir}/runtime
-build.maven.repo=${build.dir}/m2repo
-
-javac.target=1.5
diff --git a/build.xml b/build.xml
deleted file mode 100644
index 2a19d41..0000000
--- a/build.xml
+++ /dev/null
@@ -1,658 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura" default="coverage" basedir="." xmlns:cobertura="antlib:net.sourceforge.cobertura.ant">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    The copyright for this program is retained by its contributors
-    See the included COPYRIGHT file for a complete list of contributors
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-	</description>
-
-	<property file="build.properties" />
-	
-	<!-- Import the Cobertura Ant Library -->
-	<property name="cobertura.local.library" location="antLibrary" />
-	<import file="${cobertura.local.library}/library.xml" />
-
-
-	<path id="base.path">
-		<fileset dir="${lib.dir}">
-			<include name="**/*.jar" />
-		</fileset>
-		<fileset dir="${jetty.dir}">
-			<include name="lib/servlet-api*.jar" />
-		</fileset>
-	</path>
-
-	<path id="cobertura.classpath">
-		<pathelement location="cobertura.jar" />
-		<fileset dir="${lib.dir}">
-			<include name="**/*.jar" />
-		</fileset>
-	</path>
-
-	<macrodef name="cobertura-taskdef">
-		<sequential>
-			<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
-
-			<!--
-				This is probably a bug in Eclipse, but the Eclipse ant
-				editor seems to lock the classpath of the last taskdef,
-				so we do a taskdef of one of the core ant tasks so that
-				cobertura.jar does not become locked.
-			-->
-			<taskdef name="not-used" classname="org.apache.tools.ant.taskdefs.Delete">
-				<classpath>
-					<pathelement path="${java.class.path}" />
-				</classpath>
-			</taskdef>
-		</sequential>
-	</macrodef>
-
-	<target name="init">
-		<!-- Insert our version number in a file. -->
-		<filter token="version" value="${version}" />
-		<copy file="${etc.dir}/plugin.xml" todir="${build.dir}" filtering="true" overwrite="true" />
-	</target>
-
-	<target name="compile" depends="init">
-		<mkdir dir="${build.classes.dir}" />
-		<javac fork="true" srcdir="${src.dir}" destdir="${build.classes.dir}" debug="true" encoding="UTF-8"
-			target="${javac.target}">
-			<compilerarg value="-Xlint:unchecked" compiler="javac1.5"/>
-			<classpath location="${build.classes.dir}" />
-			<classpath refid="base.path" />
-		</javac>
-
-		<mkdir dir="${build.otherclasses.dir}" />
-		<javac fork="true" srcdir="${othersrc.dir}" destdir="${build.otherclasses.dir}" debug="true" encoding="UTF-8"
-			target="${javac.target}">
-			<compilerarg value="-Xlint:unchecked" compiler="javac1.5"/>
-			<classpath location="${build.classes.dir}" />
-			<classpath refid="base.path" />
-		</javac>
-
-		<mkdir dir="${build.functionalconditiontest.dir}" />
-		<javac fork="true" srcdir="${examples.functionalconditiontest.dir}" destdir="${build.functionalconditiontest.dir}" debug="true" encoding="UTF-8"
-			target="${javac.target}">
-			<compilerarg value="-Xlint:unchecked" compiler="javac1.5"/>
-			<classpath location="${build.classes.dir}" />
-			<classpath refid="base.path" />
-		</javac>
-
-		<!-- Copy jar resources (css, images, log4j property file, etc.) -->
-		<copy todir="${build.classes.dir}">
-			<fileset dir="${src.dir}">
-				<exclude name="**/*.java" />
-			</fileset>
-		</copy>
-	</target>
-
-	<target name="compile-tests" depends="init,compile,cobertura-groovy-init">
-		<mkdir dir="${build.test.classes.dir}" />
-		<cobertura:groovyc srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" encoding="UTF-8">
-			<classpath location="${build.classes.dir}" />
-			<classpath location="${build.test.classes.dir}" />
-			<classpath refid="base.path" />
-			<classpath location="${build.otherclasses.dir}" />
-			<classpath location="${build.functionalconditiontest.dir}" />
-			<classpath path="${java.class.path}"/>
-			<javac debug="true" encoding="UTF-8" >
-				<compilerarg value="-Xlint:unchecked" compiler="javac1.5"/>
-			</javac>
-		</cobertura:groovyc>
-
-		<copy todir="${build.test.classes.dir}">
-			<fileset dir="${test.src.dir}">
-				<exclude name="**/*.java" />
-			</fileset>
-		</copy>
-	</target>
-
-	<target name="jar" depends="init,compile">
-		<mkdir dir="${build.dist.dir}" />
-
-		<!-- the standard jar for Cobertura -->
-		<jar jarfile="${basedir}/${ant.project.name}.jar" compress="true">
-			<fileset dir="${build.classes.dir}">
-				<include name="**/*.class" />
-			</fileset>
-			<fileset dir="${etc.dir}">
-				<include name="log4j.properties" />
-				<include name="tasks.properties" />
-			</fileset>
-			<fileset dir="${src.dir}">
-				<exclude name="**/*.java" />
-				<exclude name="**/package.html" />
-			</fileset>
-			<fileset dir="${basedir}">
-				<include name="COPYING" />
-				<include name="COPYRIGHT" />
-				<include name="README" />
-			</fileset>
-			<manifest>
-				<attribute name="Specification-Title" value="${description}"/>
-				<attribute name="Specification-Vendor" value="Cobertura"/>
-				<attribute name="Specification-Version" value="${version}"/>
-				<attribute name="Implementation-Title" value="${description}"/>
-				<attribute name="Implementation-Vendor" value="Cobertura"/>
-				<attribute name="Implementation-Vendor-Id" value="net.sourceforge.cobertura"/>
-				<attribute name="Implementation-Version" value="${version}"/>
-			</manifest>
-		</jar>
-
-		<!--
-			Eclipse needs the ANT tasks and the runtime of Cobertura to be split into
-			separate jars, otherwise lots of bad things happen in eclipse to do with
-			class loading.
-		-->
-		<mkdir dir="${build.dist.eclipse.dir}" />
-		<jar jarfile="${build.dist.eclipse.dir}/${ant.project.name}.jar">
-			<fileset dir="${build.classes.dir}">
-				<include name="net/sourceforge/cobertura/ant/**/*.class" />
-			</fileset>
-			<fileset dir="${etc.dir}">
-				<include name="tasks.properties" />
-			</fileset>
-			<manifest>
-				<attribute name="Specification-Title" value="${description}"/>
-				<attribute name="Specification-Vendor" value="Cobertura"/>
-				<attribute name="Specification-Version" value="${version}"/>
-				<attribute name="Implementation-Title" value="${description}"/>
-				<attribute name="Implementation-Vendor" value="Cobertura"/>
-				<attribute name="Implementation-Vendor-Id" value="net.sourceforge.cobertura"/>
-				<attribute name="Implementation-Version" value="${version}"/>
-			</manifest>
-		</jar>
-		<jar jarfile="${build.dist.eclipse.dir}/${ant.project.name}-main.jar">
-			<fileset dir="${build.classes.dir}">
-				<exclude name="net/sourceforge/cobertura/ant/**/*.class" />
-			</fileset>
-			<fileset dir="${etc.dir}">
-				<include name="log4j.properties" />
-				<include name="tasks.properties" />
-			</fileset>
-			<manifest>
-				<attribute name="Specification-Title" value="${description}"/>
-				<attribute name="Specification-Vendor" value="Cobertura"/>
-				<attribute name="Specification-Version" value="${version}"/>
-				<attribute name="Implementation-Title" value="${description}"/>
-				<attribute name="Implementation-Vendor" value="Cobertura"/>
-				<attribute name="Implementation-Vendor-Id" value="net.sourceforge.cobertura"/>
-				<attribute name="Implementation-Version" value="${version}"/>
-			</manifest>
-		</jar>
-	</target>
-	
-	<target name="war" depends="cobertura-groovy-init">
-		<cobertura:groovy>
-			//load buildUtil definitions
-			evaluate(new File("buildUtil.groovy"))
-			
-			buildWar(new File("coberturaFlush.war"))
-		</cobertura:groovy>
-	</target>
-
-	<target name="instrument" depends="jar">
-		<delete file="${basedir}/cobertura.ser" />
-		<delete file="${build.dir}/cobertura.ser" /> <!-- TODO: Is this needed? -->
-
-		<cobertura-taskdef />
-
-		<cobertura-instrument datafile="${build.dir}/cobertura.ser" todir="${build.instrumented.dir}">
-		    <fileset dir="${build.classes.dir}">
-		        <include name="**/*.class" />
-		        <exclude name="**/*Test.class" />
-				<exclude name="net/sourceforge/cobertura/javancss/**/*.class" />
-		    </fileset>
-		    <fileset dir="${build.otherclasses.dir}">
-		        <include name="**/*.class" />
-		        <exclude name="**/*Test.class" />
-		    </fileset>
-		</cobertura-instrument>
-	</target>
-
-	<!--
-		This target is used when testing both instrumented and
-		non-instrumented code.  The net.sourceforge.cobertura.datafile
-		sysproperty is only used if we're testing instrumented code.
-	-->
-	<target name="test" depends="compile-tests">
-		<delete dir="${build.reports.dir}/junit-xml" failonerror="false" />
-		<delete dir="${test.work.dir}" failonerror="false" />
-		<mkdir dir="${build.reports.dir}/junit-xml" />
-
-		<junit fork="true" forkmode="once" haltonfailure="false" failureProperty="test.failed" printsummary="true" timeout="900000">
-			<sysproperty key="net.sourceforge.cobertura.datafile" file="${build.dir}/cobertura.ser" />
-			<sysproperty key="basedir" value="${basedir}"/>
-			<jvmarg value="-Xmx512M" />
-			<!--
-			<jvmarg value="-Xdebug" />
-			<jvmarg value="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y" />
-			-->
-			<classpath location="${build.test.classes.dir}" />
-			<classpath location="${build.instrumented.dir}" />
-			<classpath location="${build.classes.dir}" />
-			<classpath location="${build.otherclasses.dir}" />
-			<classpath location="${etc.dir}" />
-			<classpath refid="base.path" />
-			<classpath refid="cobertura.common.local.library" />
-			<classpath>
-				<fileset dir="${java.home}/../">
-					<include name="lib/tools.jar"/>
-				</fileset>
-			</classpath>
-			<formatter type="xml" />
-			<formatter type="plain" usefile="false" />
-			<test name="${testcase}" todir="${build.reports.dir}/junit-xml" if="testcase" />
-			<batchtest todir="${build.reports.dir}/junit-xml" unless="testcase">
-				<fileset dir="${build.test.classes.dir}">
-					<include name="**/*Test.class" />
-					<exclude name="test/first/Test.class" />
-					<exclude name="test/condition/Test.class" />
-				</fileset>
-			</batchtest>
-		</junit>
-
-		<delete dir="${build.reports.dir}/junit-html" failonerror="false" />
-		<mkdir dir="${build.reports.dir}/junit-html" />
-
-		<junitreport todir="${build.reports.dir}/junit-html">
-			<fileset dir="${build.reports.dir}/junit-xml">
-				<include name="TEST-*.xml" />
-			</fileset>
-			<report format="frames" todir="${build.reports.dir}/junit-html" />
-		</junitreport>
-
-	</target>
-
-	<target name="coverage-report">
-		<cobertura-taskdef />
-
-		<delete dir="${build.reports.dir}/coverage-html" failonerror="false" />
-		<mkdir dir="${build.reports.dir}/coverage-html" />
-		<cobertura-report datafile="${build.dir}/cobertura.ser"
-		                  destdir="${build.reports.dir}/coverage-html"
-		                  format="html"
-		                  >
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>				  
-			<fileset dir="${othersrc.dir}">
-				<include name="**/*.java" />
-			</fileset>
-	    </cobertura-report>
-
-		<delete dir="${build.reports.dir}/coverage-xml" />
-		<mkdir dir="${build.reports.dir}/coverage-xml" />
-		<cobertura-report datafile="${build.dir}/cobertura.ser"
-		                  destdir="${build.reports.dir}/coverage-xml"
-		                  format="xml"
-					      >
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>				  
-			<fileset dir="${othersrc.dir}">
-				<include name="**/*.java" />
-			</fileset>
-		</cobertura-report>
-
-	</target>
-
-	<!--
-	<target name="format">
-		<property name="dir.jalopy" value="${lib.dir}/jalopy" />
-		<taskdef name="jalopy" classname="de.hunsicker.jalopy.plugin.ant.AntPlugin">
-			<classpath>
-				<fileset dir="${dir.jalopy}">
-					<include name="*.jar" />
-				</fileset>
-			</classpath>
-		</taskdef>
-
-		<jalopy fileformat="unix"
-			convention="etc/jalopy.xml"
-			loglevel="info"
-			classpathref="base.path">
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>
-			<fileset dir="${test.src.dir}">
-				<include name="**/*.java" />
-			</fileset>
-		</jalopy>
-	</target>
-	-->
-
-	<target name="javadoc">
-		<delete dir="${build.api.dir}" />
-		<mkdir dir="${build.api.dir}" />
-
-		<javadoc access="private" author="true" breakiterator="true" destdir="${build.api.dir}" failonerror="true" encoding="UTF-8" linksource="true" serialwarn="false" version="true" windowtitle="Cobertura API">
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>
-			<classpath location="${ant.home}/lib/ant.jar" />
-			<classpath refid="base.path" />
-		</javadoc>
-	</target>
-
-	<target name="dist" depends="jar,javadoc">
-		<!--
-			Copy the files needed for the binary jar to a clean directory
-			tree.  The "binary" jar contains the minimum files needed to
-			use Cobertura.
-		-->
-		<copy-unix-scripts todir="${build.dist.dir}/package-bin/cobertura-${version}" />
-				
-		<copy todir="${build.dist.dir}/package-bin/cobertura-${version}">
-			<fileset dir="${basedir}">
-				<include name="ChangeLog" />
-				<include name="cobertura-*.bat" />
-				<include name="COPYING" />
-				<include name="COPYRIGHT" />
-				<include name="README" />
-				<include name="lib/**" />
-
-				<!-- Exclude jars that are only used by the JUnit tests -->
-				<exclude name="lib/jaxen*" />
-				<exclude name="lib/jdom*" />
-				<exclude name="lib/junit*" />
-				<exclude name="lib/xerces/**" />
-				<exclude name="lib/xalan*" />
-
-				<include name="cobertura.jar" />
-				<include name="coberturaFlush.war" />
-				<include name="examples/basic/README" />
-				<include name="examples/basic/build.properties" />
-				<include name="examples/basic/*.xml" />
-				<include name="examples/basic/src/**" />
-			</fileset>
-		</copy>
-
-		<!--
-			Copy the files needed for the source jar to a clean directory
-			tree.  The "source" jar contains everything needed to build
-			Cobertura.
-		-->
-		<copy-unix-scripts todir="${build.dist.dir}/package-src/cobertura-${version}" />
-
-		<copy todir="${build.dist.dir}/package-src/cobertura-${version}">
-			<fileset dir="${basedir}">
-				<include name="antLibrary/**" />
-				<include name="ChangeLog" />
-				<include name="cobertura-*.bat" />
-				<include name="COPYING" />
-				<include name="COPYRIGHT" />
-				<include name="README" />
-				<include name="build.properties" />
-				<include name="build.xml" />
-				<include name="etc/**" />
-				<include name="lib/**" />
-				<include name="resources/**" />
-				<include name="src/**" />
-				<include name="src-2/**" />
-				<include name="test/**" />
-
-				<include name="examples/*/README" />
-				<include name="examples/*/build.properties" />
-				<include name="examples/*/*.xml" />
-				<include name="examples/*/src/**" />
-			</fileset>
-		</copy>
-
-		<!-- Create bz2 files -->
-		<create-tar basedir="${build.dist.dir}/package-bin" destfile="${ant.project.name}-${version}-bin.tar.bz2" compression="bzip2"/>
-		<create-tar basedir="${build.dist.dir}/package-src" destfile="${ant.project.name}-${version}-src.tar.bz2" compression="bzip2"/>
-
-		<!-- Create gz files -->
-		<create-tar basedir="${build.dist.dir}/package-bin" destfile="${ant.project.name}-${version}-bin.tar.gz" compression="gzip"/>
-		<create-tar basedir="${build.dist.dir}/package-src" destfile="${ant.project.name}-${version}-src.tar.gz" compression="gzip"/>
-
-		<!-- Create zip files -->
-		<create-zip basedir="${build.dist.dir}/package-bin" destfile="${ant.project.name}-${version}-bin.zip"/>
-		<create-zip basedir="${build.dist.dir}/package-src" destfile="${ant.project.name}-${version}-src.zip"/>
-
-		<!-- Make an Eclipse plugin zip -->
-		<!--<zip destfile="${ant.project.name}-${version}-eclipse-plugin.zip" encoding="UTF-8">
-			<zipfileset prefix="com.${ant.project.name}_${version}" dir="${basedir}">
-				<include name="ChangeLog" />
-				<include name="COPYING" />
-				<include name="COPYRIGHT" />
-				<include name="README" />
-				<include name="lib/**" />
-			</zipfileset>
-
-			<zipfileset prefix="com.${ant.project.name}_${version}" dir="${build.dist.eclipse.dir}">
-				<include name="${ant.project.name}.jar" />
-				<include name="${ant.project.name}-main.jar" />
-			</zipfileset>
-
-			<zipfileset prefix="com.${ant.project.name}_${version}" dir="${etc.dir}">
-				<include name="plugin.properties" />
-			</zipfileset>
-
-			<zipfileset prefix="com.${ant.project.name}_${version}" dir="${build.dir}">
-				<include name="plugin.xml" />
-			</zipfileset>
-		</zip>
-		-->
-	</target>
-	
-	<macrodef name="copy-unix-scripts">
-		<attribute name="todir" />
-		<sequential>
-			<copy todir="@{todir}">
-				<fileset dir="${basedir}">
-					<include name="cobertura-*.sh" />
-				</fileset>
-				<!-- remove windows carriage returns from unix scripts -->
-				<filterchain>
-					<fixcrlf eof="remove" eol="unix"/>
-				</filterchain>
-			</copy>
-		</sequential>
-	</macrodef>
-	
-	<macrodef name="create-zip">
-		<attribute name="basedir" />
-		<attribute name="destfile" />
-		<sequential>
-			<zip destfile="@{destfile}" encoding="UTF-8">
-				<zipfileset dir="@{basedir}" filemode="755">
-					<include name="*.sh"/>
-				</zipfileset>
-				<zipfileset dir="@{basedir}">
-					<exclude name="*.sh"/>
-				</zipfileset>
-			</zip>
-		</sequential>
-	</macrodef>
-
-	<macrodef name="create-tar">
-		<attribute name="basedir" />
-		<attribute name="destfile" />
-		<attribute name="compression" />
-		<sequential>
-			<tar destfile="@{destfile}" compression="@{compression}">
-				<tarfileset dir="@{basedir}" mode="755">
-					<include name="*.sh"/>
-				</tarfileset>
-				<tarfileset dir="@{basedir}">
-					<exclude name="*.sh"/>
-				</tarfileset>
-			</tar>
-		</sequential>
-	</macrodef>
-
-	<target name="create-bundles" depends="jar,javadoc">
-	    <mkdir dir="${build.bundle.dir}" />
-
-		<delete>
-			<fileset dir="${build.bundle.dir}">
-				<include name="*" />
-			</fileset>
-		</delete>
-
-	    <mkdir dir="${build.bundle.source.dir}" />
-	    <mkdir dir="${build.bundle.runtime.dir}" />
-
-		<!-- the javadoc jar for Cobertura.
-		     used by IDE, maven, and global artifact repository. -->
-		<jar jarfile="${build.bundle.source.dir}/${ant.project.name}-${version}-javadoc.jar" compress="true">
-			<fileset dir="${build.api.dir}">
-				<include name="**/*" />
-			</fileset>
-			<fileset dir="${basedir}">
-				<include name="COPYING" />
-				<include name="COPYRIGHT" />
-				<include name="README" />
-			</fileset>
-			<manifest>
-				<attribute name="Cobertura" value="Javadoc for ${version}"/>
-			</manifest>
-		</jar>
-
-		<!-- the sources jar for Cobertura.
-		     this is not the same as the -src.tar.gz, and is not expected to be
-			 a fully compilable source jar.
-			 This jar should contain the source for the classes that exist in
-			 the cobertura.jar file, and is used from within an IDE to aide
-			 in debugging of an application that utilizes that jar file.
-		     This is an optional jar file for the global repository. -->
-		<jar jarfile="${build.bundle.source.dir}/${ant.project.name}-${version}-sources.jar" compress="true">
-			<fileset dir="${src.dir}">
-				<include name="**/*" />
-			</fileset>
-			<fileset dir="${basedir}">
-				<include name="COPYING" />
-				<include name="COPYRIGHT" />
-				<include name="README" />
-			</fileset>
-			<manifest>
-				<attribute name="Cobertura" value="Source for ${version}"/>
-			</manifest>
-		</jar>
-
-		<!-- copy existing files into expected and versioned names -->
-	    <copy file="COPYING" tofile="${build.bundle.source.dir}/LICENSE.txt"
-		      overwrite="true" />
-		<copy file="${ant.project.name}.jar" 
-			  tofile="${build.bundle.source.dir}/${ant.project.name}-${version}.jar"
-			  overwrite="true" />
-
-		<!-- Create the bundle for the cobertura lib -->
-
-	    <copy file="${basedir}/maven/ibiblio/cobertura.pom"
-		      tofile="${build.bundle.source.dir}/pom.xml"
-			  overwrite="true">
-			<filterset>
-				<filter token="VERSION" value="${version}" />
-			</filterset>
-		</copy>
-		
-		<!--
-		This bundle jar is only used if the new release is manually uploaded to the
-		maven repository.
-		-->
-		<jar jarfile="${basedir}/${ant.project.name}-${version}-bundle.jar" compress="false">
-		    <fileset dir="${build.bundle.source.dir}">
-				<include name="LICENSE.txt" />
-				<include name="${ant.project.name}-${version}.jar" />
-				<include name="${ant.project.name}-${version}-javadoc.jar" />
-				<include name="${ant.project.name}-${version}-sources.jar" />
-				<include name="pom.xml" />
-			</fileset>
-		</jar>
-
-		<!-- Create the bundle for the cobertura-runtime -->
-
-	    <copy file="${basedir}/maven/ibiblio/cobertura-runtime.pom"
-		      tofile="${build.bundle.runtime.dir}/pom.xml"
-			  overwrite="true">
-			<filterset>
-				<filter token="VERSION" value="${version}" />
-			</filterset>
-		</copy>
-
-	    <copy file="COPYING" tofile="${build.bundle.runtime.dir}/LICENSE.txt"
-		      overwrite="true" />
-
-		<jar jarfile="${basedir}/${ant.project.name}-runtime-${version}-bundle.jar" compress="false">
-		    <fileset dir="${build.bundle.runtime.dir}">
-				<include name="LICENSE.txt" />
-				<include name="pom.xml" />
-			</fileset>
-		</jar>
-		
-	</target>
-	
-	<target name="deploy-to-local-maven-repo-only" depends="cobertura-groovy-init">
-		<cobertura:groovy>
-			//load buildUtil definitions
-			evaluate(new File("buildUtil.groovy"))
-			
-			deployToLocalMavenRepo()
-		</cobertura:groovy>
-		
-	</target>
-
-	<target name="install-eclipse-plugin">
-		<apply dir="${eclipse.dir}/plugins" executable="unzip">
-			<arg value="-o" />
-			<fileset dir="dist">
-				<include name="${ant.project.name}-${version}-eclipse-plugin.zip" />
-			</fileset>
-		</apply>
-	</target>
-
-	<target name="clean" description="Remove all files created by the build process.">
-		<delete dir="${build.dir}" />
-		<delete>
-			<fileset dir="${basedir}">
-				<include name="cobertura.jar" />
-				<include name="cobertura-*-bundle.jar" />
-				<include name="cobertura.ser" />
-				<include name="cobertura.ser.lock" />
-				<include name="cobertura-*-bin.*" />
-				<include name="cobertura-*-src.*" />
-				<include name="cobertura-*-eclipse-plugin.zip" />
-				<include name="coberturaFlush.war" />
-			</fileset>
-		</delete>
-	</target>
-	
-	<target name="failure-check">
-		<fail message="JUnit tests failed" if="test.failed" />
-		
-	</target>
-	
-	<target name="cobertura-check">
-		<cobertura-check datafile="${build.dir}/cobertura.ser"
-		                 totalbranchrate="70"
-		                 totallinerate="80" />
-
-	</target>
-	
-	<!--
-	Used in merging new versions of javancss into Cobertura.   See
-	javancss/coberturaREADME.txt for details.
-	-->
-	<target name="javancss-merge" depends="cobertura-groovy-init">
-		<cobertura:groovy>
-			//load buildUtil definitions
-			evaluate(new File("buildUtil.groovy"))
-			
-			mergeJavancss()
-		</cobertura:groovy>
-	</target>
-
-	<target name="coverage" depends="compile,compile-tests,instrument,test,coverage-report,failure-check,cobertura-check" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports." />
-	<target name="release" depends="clean,compile,compile-tests,test,failure-check,jar,war,javadoc,dist,create-bundles,deploy-to-local-maven-repo-only" description="Full build cycle, producing a distribution." />
-
-</project>
-<!--
-  vim: et sts=4 sw=4 noexpandtab
-  -->
diff --git a/cobertura-check.bat b/cobertura-check.bat
deleted file mode 100644
index 46a3582..0000000
--- a/cobertura-check.bat
+++ /dev/null
@@ -1,21 +0,0 @@
- at echo off
-
-REM
-REM Grab the directory where this script resides, for use later
-REM
-set COBERTURA_HOME=%~dp0
-
-REM
-REM Read all parameters into a single variable using an ugly loop
-REM
-set CMD_LINE_ARGS=%1
-if ""%1""=="""" goto doneStart
-shift
-:getArgs
-if ""%1""=="""" goto doneStart
-set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
-shift
-goto getArgs
-:doneStart
-
-java -cp "%COBERTURA_HOME%cobertura.jar;%COBERTURA_HOME%lib\asm-3.0.jar;%COBERTURA_HOME%lib\asm-tree-3.0.jar;%COBERTURA_HOME%lib\log4j-1.2.9.jar;%COBERTURA_HOME%lib\jakarta-oro-2.0.8.jar" net.sourceforge.cobertura.check.Main %CMD_LINE_ARGS%
diff --git a/cobertura-check.sh b/cobertura-check.sh
deleted file mode 100644
index 31d0aa2..0000000
--- a/cobertura-check.sh
+++ /dev/null
@@ -1 +0,0 @@
-java -cp `dirname $0`/cobertura.jar:`dirname $0`/lib/asm-3.0.jar:`dirname $0`/lib/asm-tree-3.0.jar:`dirname $0`/lib/log4j-1.2.9.jar:`dirname $0`/lib/jakarta-oro-2.0.8.jar net.sourceforge.cobertura.check.Main $*
diff --git a/cobertura-instrument.bat b/cobertura-instrument.bat
deleted file mode 100644
index cfcb762..0000000
--- a/cobertura-instrument.bat
+++ /dev/null
@@ -1,21 +0,0 @@
- at echo off
-
-REM
-REM Grab the directory where this script resides, for use later
-REM
-set COBERTURA_HOME=%~dp0
-
-REM
-REM Read all parameters into a single variable using an ugly loop
-REM
-set CMD_LINE_ARGS=%1
-if ""%1""=="""" goto doneStart
-shift
-:getArgs
-if ""%1""=="""" goto doneStart
-set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
-shift
-goto getArgs
-:doneStart
-
-java -cp "%COBERTURA_HOME%cobertura.jar;%COBERTURA_HOME%lib\asm-3.0.jar;%COBERTURA_HOME%lib\asm-tree-3.0.jar;%COBERTURA_HOME%lib\log4j-1.2.9.jar;%COBERTURA_HOME%lib\jakarta-oro-2.0.8.jar" net.sourceforge.cobertura.instrument.Main %CMD_LINE_ARGS%
diff --git a/cobertura-instrument.sh b/cobertura-instrument.sh
deleted file mode 100644
index b877c3c..0000000
--- a/cobertura-instrument.sh
+++ /dev/null
@@ -1 +0,0 @@
-java -cp `dirname $0`/cobertura.jar:`dirname $0`/lib/asm-3.0.jar:`dirname $0`/lib/asm-tree-3.0.jar:`dirname $0`/lib/log4j-1.2.9.jar:`dirname $0`/lib/jakarta-oro-2.0.8.jar net.sourceforge.cobertura.instrument.Main $*
diff --git a/cobertura-merge.bat b/cobertura-merge.bat
deleted file mode 100644
index c87f79b..0000000
--- a/cobertura-merge.bat
+++ /dev/null
@@ -1,21 +0,0 @@
- at echo off
-
-REM
-REM Grab the directory where this script resides, for use later
-REM
-set COBERTURA_HOME=%~dp0
-
-REM
-REM Read all parameters into a single variable using an ugly loop
-REM
-set CMD_LINE_ARGS=%1
-if ""%1""=="""" goto doneStart
-shift
-:getArgs
-if ""%1""=="""" goto doneStart
-set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
-shift
-goto getArgs
-:doneStart
-
-java -cp "%COBERTURA_HOME%cobertura.jar;%COBERTURA_HOME%lib\asm-3.0.jar;%COBERTURA_HOME%lib\asm-tree-3.0.jar;%COBERTURA_HOME%lib\log4j-1.2.9.jar;%COBERTURA_HOME%lib\jakarta-oro-2.0.8.jar" net.sourceforge.cobertura.merge.Main %CMD_LINE_ARGS%
diff --git a/cobertura-merge.sh b/cobertura-merge.sh
deleted file mode 100644
index 40040f2..0000000
--- a/cobertura-merge.sh
+++ /dev/null
@@ -1 +0,0 @@
-java -cp `dirname $0`/cobertura.jar:`dirname $0`/lib/asm-3.0.jar:`dirname $0`/lib/asm-tree-3.0.jar:`dirname $0`/lib/log4j-1.2.9.jar:`dirname $0`/lib/jakarta-oro-2.0.8.jar net.sourceforge.cobertura.merge.Main $*
diff --git a/cobertura-report.bat b/cobertura-report.bat
deleted file mode 100644
index a0edb68..0000000
--- a/cobertura-report.bat
+++ /dev/null
@@ -1,21 +0,0 @@
- at echo off
-
-REM
-REM Grab the directory where this script resides, for use later
-REM
-set COBERTURA_HOME=%~dp0
-
-REM
-REM Read all parameters into a single variable using an ugly loop
-REM
-set CMD_LINE_ARGS=%1
-if ""%1""=="""" goto doneStart
-shift
-:getArgs
-if ""%1""=="""" goto doneStart
-set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
-shift
-goto getArgs
-:doneStart
-
-java -cp "%COBERTURA_HOME%cobertura.jar;%COBERTURA_HOME%lib\asm-3.0.jar;%COBERTURA_HOME%lib\asm-tree-3.0.jar;%COBERTURA_HOME%lib\log4j-1.2.9.jar;%COBERTURA_HOME%lib\jakarta-oro-2.0.8.jar" net.sourceforge.cobertura.reporting.Main %CMD_LINE_ARGS%
diff --git a/cobertura-report.sh b/cobertura-report.sh
deleted file mode 100644
index 87cd147..0000000
--- a/cobertura-report.sh
+++ /dev/null
@@ -1 +0,0 @@
-java -cp `dirname $0`/cobertura.jar:`dirname $0`/lib/asm-3.0.jar:`dirname $0`/lib/asm-tree-3.0.jar:`dirname $0`/lib/log4j-1.2.9.jar:`dirname $0`/lib/jakarta-oro-2.0.8.jar net.sourceforge.cobertura.reporting.Main $*
diff --git a/cobertura-runtime/pom.xml b/cobertura-runtime/pom.xml
new file mode 100644
index 0000000..a372114
--- /dev/null
+++ b/cobertura-runtime/pom.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" ?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>net.sourceforge.cobertura</groupId>
+  <artifactId>cobertura-runtime</artifactId>
+  <version>2.1.1</version>
+  <packaging>pom</packaging>
+  <name>Cobertura Limited Runtime</name>
+
+  <parent>
+    <groupId>org.sonatype.oss</groupId>
+    <artifactId>oss-parent</artifactId>
+    <version>7</version>
+  </parent>
+
+  <description>
+    Cobertura Runtime artifact to prevent unneeded dependencies at runtime.
+  </description>
+
+  <url>http://cobertura.sourceforge.net</url>
+
+  <dependencies>
+    <dependency>
+      <groupId>net.sourceforge.cobertura</groupId>
+      <artifactId>cobertura</artifactId>
+      <version>${project.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.ow2.asm</groupId>
+          <artifactId>asm</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.ow2.asm</groupId>
+          <artifactId>asm-tree</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.ow2.asm</groupId>
+          <artifactId>asm-commons</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.ow2.asm</groupId>
+          <artifactId>asm-util</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.ow2.asm</groupId>
+          <artifactId>asm-analysis</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>oro</groupId>
+          <artifactId>oro</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-release-plugin</artifactId>
+        <version>2.5.1</version>
+        <configuration>
+          <goals>deploy</goals>
+          <localCheckout>true</localCheckout>
+          <pushChanges>false</pushChanges>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+      <!--
+          Purpose: Use GPG to sign artifacts during release:perform.
+      -->
+      <profile>
+          <id>release-sign-artifacts</id>
+          <activation>
+              <property>
+                  <name>performRelease</name>
+                  <value>true</value>
+              </property>
+          </activation>
+          <build>
+              <plugins>
+                  <plugin>
+                      <groupId>org.apache.maven.plugins</groupId>
+                      <artifactId>maven-gpg-plugin</artifactId>
+                      <version>1.4</version>
+                      <executions>
+                          <execution>
+                              <id>sign-artifacts</id>
+                              <phase>package</phase>
+                              <goals>
+                                  <goal>sign</goal>
+                              </goals>
+                          </execution>
+                      </executions>
+                  </plugin>
+              </plugins>
+          </build>
+      </profile>
+  </profiles>
+
+  <!--
+     Define Maven's Git integration.
+  -->
+  <scm>
+    <connection>${scm.conn}</connection>
+    <developerConnection>${scm.devConnection}</developerConnection>
+    <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+    <tag>cobertura-2.1.1</tag>
+  </scm>
+</project>
diff --git a/cobertura/executables/cobertura-check.bat b/cobertura/executables/cobertura-check.bat
new file mode 100644
index 0000000..3a0e3ca
--- /dev/null
+++ b/cobertura/executables/cobertura-check.bat
@@ -0,0 +1,21 @@
+ at echo off
+
+REM
+REM Grab the directory where this script resides, for use later
+REM
+set COBERTURA_HOME=%~dp0
+
+REM
+REM Read all parameters into a single variable using an ugly loop
+REM
+set CMD_LINE_ARGS=%1
+if ""%1""=="""" goto doneStart
+shift
+:getArgs
+if ""%1""=="""" goto doneStart
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto getArgs
+:doneStart
+
+java -cp "%COBERTURA_HOME%cobertura-${project.version}.jar;%COBERTURA_HOME%lib\asm-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-tree-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-commons-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-util-${asmVersion}.jar;%COBERTURA_HOME%lib\commons-lang3-${commonslangVersion}.jar;%COBERTURA_HOME%lib\slf4j-api-${slf4jVersion}.jar;%COBERTURA_HOME%lib\logback-core-${logbackVersion}.jar;%COBERTURA_HOME%lib\logback-classic-${logbackVersion}.jar;%COBERTURA_HOME%lib\oro- [...]
diff --git a/cobertura/executables/cobertura-check.sh b/cobertura/executables/cobertura-check.sh
new file mode 100644
index 0000000..399d305
--- /dev/null
+++ b/cobertura/executables/cobertura-check.sh
@@ -0,0 +1,2 @@
+BASEDIR=`dirname $0`
+java -cp $BASEDIR/cobertura-${project.version}.jar:$BASEDIR/lib/asm-${asmVersion}.jar:$BASEDIR/lib/asm-tree-${asmVersion}.jar:$BASEDIR/lib/asm-commons-${asmVersion}.jar:$BASEDIR/lib/asm-util-${asmVersion}.jar:$BASEDIR/lib/commons-lang3-${commonslangVersion}.jar:$BASEDIR/lib/slf4j-api-${slf4jVersion}.jar:$BASEDIR/lib/logback-core-${logbackVersion}.jar:$BASEDIR/lib/logback-classic-${logbackVersion}.jar:$BASEDIR/lib/oro-${oroVersion}.jar net.sourceforge.cobertura.check.CheckCoverageMain $*
diff --git a/cobertura/executables/cobertura-instrument.bat b/cobertura/executables/cobertura-instrument.bat
new file mode 100644
index 0000000..6c66eaf
--- /dev/null
+++ b/cobertura/executables/cobertura-instrument.bat
@@ -0,0 +1,21 @@
+ at echo off
+
+REM
+REM Grab the directory where this script resides, for use later
+REM
+set COBERTURA_HOME=%~dp0
+
+REM
+REM Read all parameters into a single variable using an ugly loop
+REM
+set CMD_LINE_ARGS=%1
+if ""%1""=="""" goto doneStart
+shift
+:getArgs
+if ""%1""=="""" goto doneStart
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto getArgs
+:doneStart
+
+java -cp "%COBERTURA_HOME%cobertura-${project.version}.jar;%COBERTURA_HOME%lib\asm-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-util-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-tree-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-commons-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-analysis-${asmVersion}.jar;%COBERTURA_HOME%lib\slf4j-api-${slf4jVersion}.jar;%COBERTURA_HOME%lib\logback-core-${logbackVersion}.jar;%COBERTURA_HOME%lib\logback-classic-${logbackVersion}.jar;%COBERTURA_HOME%lib\oro-${oroVers [...]
diff --git a/cobertura/executables/cobertura-instrument.sh b/cobertura/executables/cobertura-instrument.sh
new file mode 100644
index 0000000..6ed656a
--- /dev/null
+++ b/cobertura/executables/cobertura-instrument.sh
@@ -0,0 +1,2 @@
+BASEDIR=`dirname $0`
+java -cp $BASEDIR/cobertura-${project.version}.jar:$BASEDIR/lib/asm-${asmVersion}.jar:$BASEDIR/lib/asm-analysis-${asmVersion}.jar:$BASEDIR/lib/asm-tree-${asmVersion}.jar:$BASEDIR/lib/asm-commons-${asmVersion}.jar:$BASEDIR/lib/asm-util-${asmVersion}.jar:$BASEDIR/lib/slf4j-api-${slf4jVersion}.jar:$BASEDIR/lib/logback-core-${logbackVersion}.jar:$BASEDIR/lib/logback-classic-${logbackVersion}.jar:$BASEDIR/lib/oro-${oroVersion}.jar net.sourceforge.cobertura.instrument.InstrumentMain $*
diff --git a/cobertura/executables/cobertura-merge.bat b/cobertura/executables/cobertura-merge.bat
new file mode 100644
index 0000000..10a060b
--- /dev/null
+++ b/cobertura/executables/cobertura-merge.bat
@@ -0,0 +1,21 @@
+ at echo off
+
+REM
+REM Grab the directory where this script resides, for use later
+REM
+set COBERTURA_HOME=%~dp0
+
+REM
+REM Read all parameters into a single variable using an ugly loop
+REM
+set CMD_LINE_ARGS=%1
+if ""%1""=="""" goto doneStart
+shift
+:getArgs
+if ""%1""=="""" goto doneStart
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto getArgs
+:doneStart
+
+java -cp "%COBERTURA_HOME%cobertura-${project.version}.jar;%COBERTURA_HOME%lib\asm-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-tree-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-commons-${asmVersion}.jar;%COBERTURA_HOME%lib\slf4j-api-${slf4jVersion}.jar;%COBERTURA_HOME%lib\logback-core-${logbackVersion}.jar;%COBERTURA_HOME%lib\logback-classic-${logbackVersion}.jar;%COBERTURA_HOME%lib\oro-${oroVersion}.jar" net.sourceforge.cobertura.merge.MergeMain %CMD_LINE_ARGS%
diff --git a/cobertura/executables/cobertura-merge.sh b/cobertura/executables/cobertura-merge.sh
new file mode 100644
index 0000000..c21617a
--- /dev/null
+++ b/cobertura/executables/cobertura-merge.sh
@@ -0,0 +1,2 @@
+BASEDIR=`dirname $0`
+java -cp $BASEDIR/cobertura-${project.version}.jar:$BASEDIR/lib/asm-${asmVersion}.jar:$BASEDIR/lib/asm-tree-${asmVersion}.jar:$BASEDIR/lib/asm-commons-${asmVersion}.jar:$BASEDIR/lib/slf4j-api-${slf4jVersion}.jar:$BASEDIR/lib/logback-core-${logbackVersion}.jar:$BASEDIR/lib/logback-classic-${logbackVersion}.jar:$BASEDIR/lib/oro-${oroVersion}.jar net.sourceforge.cobertura.merge.MergeMain $*
diff --git a/cobertura/executables/cobertura-report.bat b/cobertura/executables/cobertura-report.bat
new file mode 100644
index 0000000..34a9208
--- /dev/null
+++ b/cobertura/executables/cobertura-report.bat
@@ -0,0 +1,21 @@
+ at echo off
+
+REM
+REM Grab the directory where this script resides, for use later
+REM
+set COBERTURA_HOME=%~dp0
+
+REM
+REM Read all parameters into a single variable using an ugly loop
+REM
+set CMD_LINE_ARGS=%1
+if ""%1""=="""" goto doneStart
+shift
+:getArgs
+if ""%1""=="""" goto doneStart
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto getArgs
+:doneStart
+
+java -cp "%COBERTURA_HOME%cobertura-${project.version}.jar;%COBERTURA_HOME%lib\asm-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-tree-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-commons-${asmVersion}.jar;%COBERTURA_HOME%lib\asm-util-${asmVersion}.jar;%COBERTURA_HOME%lib\commons-lang3-${commonslangVersion}.jar;%COBERTURA_HOME%lib\slf4j-api-${slf4jVersion}.jar;%COBERTURA_HOME%lib\logback-core-${logbackVersion}.jar;%COBERTURA_HOME%lib\logback-classic-${logbackVersion}.jar;%COBERTURA_HOME%lib\oro- [...]
diff --git a/cobertura/executables/cobertura-report.sh b/cobertura/executables/cobertura-report.sh
new file mode 100644
index 0000000..1e92d44
--- /dev/null
+++ b/cobertura/executables/cobertura-report.sh
@@ -0,0 +1,2 @@
+BASEDIR=`dirname $0`
+java -cp $BASEDIR/cobertura-${project.version}.jar:$BASEDIR/lib/asm-${asmVersion}.jar:$BASEDIR/lib/asm-tree-${asmVersion}.jar:$BASEDIR/lib/asm-commons-${asmVersion}.jar:$BASEDIR/lib/asm-util-${asmVersion}.jar:$BASEDIR/lib/commons-lang3-${commonslangVersion}.jar:$BASEDIR/lib/slf4j-api-${slf4jVersion}.jar:$BASEDIR/lib/logback-core-${logbackVersion}.jar:$BASEDIR/lib/logback-classic-${logbackVersion}.jar:$BASEDIR/lib/oro-${oroVersion}.jar net.sourceforge.cobertura.reporting.ReportMain $*
diff --git a/cobertura/pom.xml b/cobertura/pom.xml
new file mode 100755
index 0000000..eb48fca
--- /dev/null
+++ b/cobertura/pom.xml
@@ -0,0 +1,557 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>net.sourceforge.cobertura</groupId>
+  <artifactId>cobertura</artifactId>
+  <version>2.1.1</version>
+  <packaging>jar</packaging>
+  <name>Cobertura code coverage</name>
+  
+  <parent>
+    <groupId>org.sonatype.oss</groupId>
+    <artifactId>oss-parent</artifactId>
+    <version>7</version>
+    <relativePath />
+  </parent>
+  
+  <description>
+    Cobertura is a free Java tool that calculates the percentage of
+    code accessed by tests. It can be used to identify which parts of
+    your Java program are lacking test coverage. It is based on jcoverage.
+  </description>
+  
+  <url>http://cobertura.sourceforge.net</url>
+  
+  <pluginRepositories>
+    <pluginRepository>
+      <id>sonatype-releases</id>
+      <url>http://oss.sonatype.org/content/repositories/releases</url>
+    </pluginRepository>
+    <pluginRepository>
+      <id>clojars.org</id>
+      <url>http://clojars.org/repo</url>
+    </pluginRepository>
+  </pluginRepositories>
+
+  <properties>
+    <asmVersion>5.0.1</asmVersion>
+    <xercesVersion>2.11.0</xercesVersion>
+    <xalanVersion>2.7.1</xalanVersion>
+    <oroVersion>2.0.8</oroVersion>
+    <jaxenVersion>1.1.4</jaxenVersion>
+    <commonsioVersion>2.2</commonsioVersion>
+    <commonslangVersion>3.3.2</commonslangVersion>
+    <antVersion>1.8.3</antVersion>
+    <jettyVersion>6.1.14</jettyVersion>
+    <simplexmlVersion>2.6.2</simplexmlVersion>
+    <guavaVersion>13.0.1</guavaVersion>
+    <groovyVersion>1.6.9</groovyVersion>
+    <jsr305Version>1.3.2</jsr305Version>
+    <javaccVersion>5.0</javaccVersion>
+    <logbackVersion>1.0.13</logbackVersion>
+    <junitVersion>4.11</junitVersion>
+    <mockitoVersion>1.9.5</mockitoVersion>
+    <jdkVersion>1.6</jdkVersion>
+    <surefireVersion>2.16</surefireVersion>
+    <slf4jVersion>1.7.5</slf4jVersion>
+    <jdomVersion>1.1.3</jdomVersion>
+    <plugin.java.formatter.version>0.4</plugin.java.formatter.version>
+    <plugin.mvn.compiler.version>2.3.2</plugin.mvn.compiler.version>
+    <plugin.mvn.jar.version>2.3.2</plugin.mvn.jar.version>
+    <plugin.pmd.version>3.0.1</plugin.pmd.version>
+    <plugin.jdoc.version>2.9.1</plugin.jdoc.version>
+    <plugin.findbugs.version>2.5.2</plugin.findbugs.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.ow2.asm</groupId>
+      <artifactId>asm</artifactId>
+      <version>${asmVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.ow2.asm</groupId>
+      <artifactId>asm-tree</artifactId>
+      <version>${asmVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.ow2.asm</groupId>
+      <artifactId>asm-commons</artifactId>
+      <version>${asmVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.ow2.asm</groupId>
+      <artifactId>asm-util</artifactId>
+      <version>${asmVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.ow2.asm</groupId>
+      <artifactId>asm-analysis</artifactId>
+      <version>${asmVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>xerces</groupId>
+      <artifactId>xercesImpl</artifactId>
+      <version>${xercesVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>xalan</groupId>
+      <artifactId>xalan</artifactId>
+      <version>${xalanVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jdom</groupId>
+      <artifactId>jdom</artifactId>
+      <version>${jdomVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>oro</groupId>
+      <artifactId>oro</artifactId>
+      <version>${oroVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>jaxen</groupId>
+      <artifactId>jaxen</artifactId>
+      <version>${jaxenVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>${commonsioVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ant</groupId>
+      <artifactId>ant</artifactId>
+      <version>${antVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ant</groupId>
+      <artifactId>ant-junit</artifactId>
+      <version>${antVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>servlet-api-2.5</artifactId>
+      <version>${jettyVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jetty</artifactId>
+      <version>${jettyVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${jettyVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jetty-servlet-tester</artifactId>
+      <version>${jettyVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.groovy</groupId>
+      <artifactId>groovy-all</artifactId>
+      <version>${groovyVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>net.java.dev.javacc</groupId>
+      <artifactId>javacc</artifactId>
+      <version>${javaccVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.sun</groupId>
+      <artifactId>tools</artifactId>
+      <version>0</version>
+      <scope>system</scope>
+      <systemPath>${toolsjar}</systemPath>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4jVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <version>${logbackVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>${junitVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <version>${mockitoVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>${commonslangVersion}</version>
+    </dependency>
+  </dependencies>
+
+  <profiles>
+      <profile>
+          <id>jdk6minus</id>
+          <activation>
+              <jdk>(,1.6]</jdk>
+          </activation>
+          <build>
+              <plugins>
+                  <plugin>
+                      <groupId>org.apache.maven.plugins</groupId>
+                      <artifactId>maven-surefire-plugin</artifactId>
+                      <version>${surefireVersion}</version>
+                      <configuration>
+                          <excludes combine.children="append">
+                              <!-- These tests require JDK 7+ -->
+                              <exclude>net/sourceforge/cobertura/jdk/JDK7Test.java</exclude>
+                              <exclude>net/sourceforge/cobertura/test/FunctionalTest.java</exclude>
+                              <exclude>net/sourceforge/cobertura/test/IgnoreMethodAnnotationFunctionalTest.java</exclude>
+                              <exclude>net/sourceforge/cobertura/test/IgnoreTrivialFunctionalTest.java</exclude>
+                              <exclude>net/sourceforge/cobertura/test/LargeFileTest.java</exclude>
+                              <exclude>net/sourceforge/cobertura/test/PerformanceTest.java</exclude>
+                              <exclude>net/sourceforge/cobertura/test/SwitchFunctionalTest.java</exclude>
+                              <exclude>net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.java</exclude>
+                          </excludes>
+                      </configuration>
+                  </plugin>
+              </plugins>
+          </build>
+      </profile>
+      <profile>
+          <id>standardToolsJar-profile</id>
+          <activation>
+              <activeByDefault>true</activeByDefault>
+              <file>
+                  <exists>${java.home}/../lib/tools.jar</exists>
+              </file>
+          </activation>
+          <properties>
+              <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
+          </properties>
+      </profile>
+      <profile>
+          <id>appleJdkToolsJar-profile</id>
+          <activation>
+              <activeByDefault>false</activeByDefault>
+              <file>
+                  <exists>${java.home}/../Classes/classes.jar</exists>
+              </file>
+          </activation>
+          <properties>
+              <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
+          </properties>
+      </profile>
+      <!--
+          Purpose: Use GPG to sign artifacts during release:perform.
+      -->
+      <profile>
+          <id>release-sign-artifacts</id>
+          <activation>
+              <property>
+                  <name>performRelease</name>
+                  <value>true</value>
+              </property>
+          </activation>
+          <build>
+              <plugins>
+                  <plugin>
+                      <groupId>org.apache.maven.plugins</groupId>
+                      <artifactId>maven-gpg-plugin</artifactId>
+                      <version>1.4</version>
+                      <executions>
+                          <execution>
+                              <id>sign-artifacts</id>
+                              <phase>package</phase>
+                              <goals>
+                                  <goal>sign</goal>
+                              </goals>
+                          </execution>
+                      </executions>
+                  </plugin>
+              </plugins>
+          </build>
+      </profile>
+  </profiles>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+      <resource>
+        <directory>executables</directory>
+        <filtering>true</filtering>
+      </resource>
+    </resources>
+    <plugins>
+      <!--
+        This plugin seems presently to cause more problems than
+        it solves, due to its constant reformatting of code.
+
+        https://code.google.com/p/maven-java-formatter-plugin/
+        https://github.com/treymarc/maven-java-formatter-plugin
+      -->
+      <!-- plugin>
+        <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
+        <artifactId>maven-java-formatter-plugin</artifactId>
+        <version>${plugin.java.formatter.version}</version>
+        <configuration>
+          <lineEnding>LF</lineEnding>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>format</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin -->
+      
+      <!-- Cobertura requires custom jdk version for providing the support for the latest jdk. -->
+      <plugin>
+        <groupId>com.code54.mojo</groupId>
+        <artifactId>buildversion-plugin</artifactId>
+        <version>1.0.3</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>set-properties</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>${plugin.mvn.compiler.version}</version>
+        <configuration>
+          <fork>true</fork>
+          <source>${jdkVersion}</source>
+          <target>${jdkVersion}</target>
+          <excludes>
+            <exclude>**/test/*.java</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>${plugin.mvn.jar.version}</version>
+        <configuration>
+          <archive>
+            <index />
+            <manifest>
+              <addDefaultImplementationEntries />
+              <addDefaultSpecificationEntries />
+            </manifest>
+            <manifestEntries>
+              <Specification-Title>A code coverage analysis tool.</Specification-Title>
+              <Specification-Version>${project.version}</Specification-Version>
+              <Specification-Vendor>Cobertura</Specification-Vendor>
+              <Implementation-Title>A code coverage analysis tool.</Implementation-Title>
+              <Implementation-Version>${project.version}</Implementation-Version>
+              <Implementation-Vendor>Cobertura</Implementation-Vendor>
+              <Implementation-Vendor-Id>${project.groupId}</Implementation-Vendor-Id>
+            </manifestEntries>
+          </archive>
+          <excludes>
+            <exclude>*.sh</exclude>
+            <exclude>*.bat</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>${surefireVersion}</version>
+        <configuration>
+          <redirectTestOutputToFile>true</redirectTestOutputToFile>
+          <excludes combine.children="append">
+            <exclude>**/test/condition/**</exclude>
+            <exclude>**/examples/functionaltest1/**</exclude>
+            <!-- This test is failing and I don't know how to fix it -->
+            <exclude>net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.java</exclude>
+            <!-- This test fails on Windows, see https://github.com/cobertura/cobertura/pull/209 -->
+            <exclude>net/sourceforge/cobertura/dsl/ArgumentsBuilderTest.java</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+
+      <!-- This is required to assemble all of the binary files. -->
+      <!-- The descriptor has more detailed information about what is included/excluded. -->
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2.1</version>
+        <configuration>
+          <descriptors>
+            <descriptor>src/main/assembly/assembly.xml</descriptor>
+          </descriptors>
+        </configuration>
+        <executions>
+          <execution>
+            <id>packageBins</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>${plugin.pmd.version}</version>
+        <configuration>
+          <failOnViolation>false</failOnViolation>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>check</goal>
+              <goal>cpd-check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>findbugs-maven-plugin</artifactId>
+        <version>${plugin.findbugs.version}</version>
+        <configuration>
+          <failOnError>false</failOnError>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      
+      <!-- This is to build the coberturaFlush.war file necessary for servlets. -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>2.3</version>
+        <configuration>
+          <warName>coberturaFlush</warName>
+          <webXml>src/main/resources/net/sourceforge/cobertura/webapp/web.xml</webXml>
+          <packagingIncludes>WEB-INF/classes/net/sourceforge/cobertura/webapp/FlushCoberturaServlet.class</packagingIncludes>
+        </configuration>
+        <executions>
+          <execution>
+            <id>prepare-war</id>
+            <phase>prepare-package</phase>
+            <goals>
+              <goal>war</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-release-plugin</artifactId>
+        <version>2.5.1</version>
+        <configuration>
+          <goals>deploy</goals>
+          <localCheckout>true</localCheckout>
+          <pushChanges>false</pushChanges>
+       </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>javacc-maven-plugin</artifactId>
+        <version>2.6</version>
+        <executions>
+          <execution>
+            <id>javacc</id>
+            <phase>initialize</phase>
+            <goals>
+              <goal>javacc</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>src/main/java</outputDirectory>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-clean-plugin</artifactId>
+        <version>2.5</version>
+        <configuration>
+          <filesets>
+            <fileset>
+              <directory>src/main/java/net/sourceforge/cobertura/javancss/parser</directory>
+              <includes>
+                <include>**/*</include>
+              </includes>
+              <followSymlinks>false</followSymlinks>
+            </fileset>
+          </filesets>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <version>2.15</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>integration-test</goal>
+              <goal>verify</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <version>${plugin.jdoc.version}</version>
+      </plugin>
+    </plugins>
+  </reporting>
+  
+  <scm>
+    <connection>scm:git:git://github.com/cobertura/cobertura</connection>
+    <developerConnection>scm:git:git at github.com:cobertura/cobertura.git</developerConnection>
+    <url>http://github.com/cobertura/cobertura</url>
+    <tag>cobertura-2.1.1</tag>
+  </scm>
+  
+  <developers>
+    <developer>
+      <id>schristou88</id>
+      <name>Steven Christou</name>
+      <email>schristou88 at gmail.com</email>
+      <roles>
+        <role>Developer</role>
+      </roles>
+      <timezone>+6</timezone>
+    </developer>
+  </developers>
+</project>
diff --git a/cobertura/src/main/assembly/assembly.xml b/cobertura/src/main/assembly/assembly.xml
new file mode 100644
index 0000000..2a93cf8
--- /dev/null
+++ b/cobertura/src/main/assembly/assembly.xml
@@ -0,0 +1,58 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>bin</id>
+  <formats>
+    <format>tar.gz</format>
+    <format>tar.bz2</format>
+    <format>zip</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <directory>${project.basedir}/..</directory>
+      <outputDirectory>/</outputDirectory>
+      <includes>
+        <include>../README*</include>
+        <include>../LICENSE*</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>${project.basedir}/src/test/resources/examples</directory>
+      <outputDirectory>examples</outputDirectory>
+      <includes>
+        <include>basic/**/*</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>${project.basedir}/target/classes</directory>
+      <outputDirectory>/</outputDirectory>
+      <includes>
+        <include>*.sh</include>
+        <include>*.bat</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>${project.basedir}/target</directory>
+      <outputDirectory></outputDirectory>
+      <includes>
+        <include>coberturaFlush.war</include>
+        <include>cobertura*.jar</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+  <dependencySets>
+    <dependencySet>
+      <outputDirectory>lib</outputDirectory>
+      <useProjectArtifact>true</useProjectArtifact>
+      <excludes>
+        <exclude>org.apache.ant:ant-junit</exclude>
+        <exclude>org.apache.ant:ant</exclude>
+        <exclude>org.apache.ant:ant-launcher</exclude>
+        <exclude>org.eclipse.jetty:jetty-*</exclude>
+        <exclude>javax.servlet:*</exclude>
+        <exclude>net.sourceforge.cobertura:cobertura*</exclude>
+      </excludes>
+      <scope>runtime</scope>
+    </dependencySet>
+  </dependencySets>
+</assembly>
diff --git a/src/net/sourceforge/cobertura/coveragedata/countermaps/CounterMap.java b/cobertura/src/main/java/net/sourceforge/cobertura/CoverageIgnore.java
similarity index 72%
rename from src/net/sourceforge/cobertura/coveragedata/countermaps/CounterMap.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/CoverageIgnore.java
index 94f4b3b..cfadd63 100644
--- a/src/net/sourceforge/cobertura/coveragedata/countermaps/CounterMap.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/CoverageIgnore.java
@@ -1,35 +1,30 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2010 Piotr Tabor
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata.countermaps;
-
-import java.util.Map;
-
-public interface CounterMap<T> {
-	public void incrementValue(T key);
-	public void incrementValue(T key, int value);	
-	public int getValue(T key);
-	public Map<T,Integer> getFinalStateAndCleanIt();
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura;
+
+// This identifier marks given class or method as ignored by cobertura.
+public @interface CoverageIgnore {
+}
diff --git a/src/net/sourceforge/cobertura/ant/AntUtil.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/AntUtil.java
similarity index 86%
rename from src/net/sourceforge/cobertura/ant/AntUtil.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/AntUtil.java
index dc7e7d1..16846b3 100644
--- a/src/net/sourceforge/cobertura/ant/AntUtil.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/AntUtil.java
@@ -1,94 +1,93 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2006 Mark Doliner
- * Copyright (C) 2006 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-import org.apache.tools.ant.taskdefs.Java;
-import org.apache.tools.ant.types.Environment.Variable;
-
-abstract class AntUtil
-{
-
-	/**
-	 * Used to transfer the net.sourceforge.cobertura.datafile property to a JVM
-	 * that is about to be forked.
-	 * 
-	 * This is confusing, but it's required by our functional test.
-	 * What happens is, we have a JUnit test that runs ant to
-	 * instrument some classes.  When the instrumentation is running,
-	 * we want to get the coverage info that is created by exercising
-	 * our instrumentation classes.
-	 *
-	 * So we pass in two different coverage files:
-	 * 1. The coverage data file command line parameter.  This tells
-	 *    the instrument task where to write the new coverage data.
-	 * 2. The coverage data system property.  This tells the
-	 *    instrumentation inside the instrumented classes where to
-	 *    keep track of the line hit counts, etc.
-	 *
-	 * @param task The Java task that will do the forking.
-	 */
-	static void transferCoberturaDataFileProperty(Java task)
-	{
-		String coberturaProperty = System.getProperty("net.sourceforge.cobertura.datafile");
-		if (coberturaProperty != null)
-		{
-			Variable sysproperty = new Variable();
-			sysproperty.setKey("net.sourceforge.cobertura.datafile");
-			sysproperty.setValue(coberturaProperty);
-			task.addSysproperty(sysproperty);
-		}
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2006 Mark Doliner
+ * Copyright (C) 2006 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.Environment.Variable;
+
+abstract class AntUtil {
+
+	private static final String COBERTURA_DATAFILE = "net.sourceforge.cobertura.datafile";
+
+	/**
+	 * Used to transfer the net.sourceforge.cobertura.datafile property to a JVM
+	 * that is about to be forked.
+	 * <p/>
+	 * This is confusing, but it's required by our functional test.
+	 * What happens is, we have a JUnit test that runs ant to
+	 * instrument some classes.  When the instrumentation is running,
+	 * we want to get the coverage info that is created by exercising
+	 * our instrumentation classes.
+	 * <p/>
+	 * So we pass in two different coverage files:
+	 * 1. The coverage data file command line parameter.  This tells
+	 * the instrument task where to write the new coverage data.
+	 * 2. The coverage data system property.  This tells the
+	 * instrumentation inside the instrumented classes where to
+	 * keep track of the line hit counts, etc.
+	 *
+	 * @param task The Java task that will do the forking.
+	 */
+	static void transferCoberturaDataFileProperty(Java task) {
+		String coberturaProperty = System.getProperty(COBERTURA_DATAFILE);
+		if (coberturaProperty != null) {
+			Variable sysproperty = new Variable();
+			sysproperty.setKey(COBERTURA_DATAFILE);
+			sysproperty.setValue(coberturaProperty);
+			task.addSysproperty(sysproperty);
+		}
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/CheckTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/CheckTask.java
similarity index 80%
rename from src/net/sourceforge/cobertura/ant/CheckTask.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/CheckTask.java
index b253aee..115931a 100644
--- a/src/net/sourceforge/cobertura/ant/CheckTask.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/CheckTask.java
@@ -1,223 +1,201 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Nathan Wilson
- * Copyright (C) 2005 Alex Ruiz
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.tools.ant.BuildException;
-
-/**
- * An ant task that can be used to optionally fail an ant build if
- * the coverage percentage for lines or branches is below a certain,
- * user specifiable threshold.
- */
-public class CheckTask extends CommonMatchingTask
-{
-
-	private String dataFile = null;
-
-	final Set regexes = new HashSet();
-
-	private String branchRate = null;
-
-	private String lineRate = null;
-
-	private String packageBranchRate = null;
-
-	private String packageLineRate = null;
-
-	private String totalBranchRate = null;
-
-	private String totalLineRate = null;
-
-	private String failureProperty = null;
-
-	private boolean haltOnFailure = true;
-
-	public CheckTask() {
-		super("net.sourceforge.cobertura.check.Main");
-	}
-	
-	public void execute() throws BuildException
-	{
-		if (dataFile != null)
-		{
-			getJava().createArg().setValue("--datafile");
-			getJava().createArg().setValue(dataFile);
-		}
-
-		if (branchRate != null)
-		{
-			getJava().createArg().setValue("--branch");
-			getJava().createArg().setValue(branchRate);
-		}
-
-		if (lineRate != null)
-		{
-			getJava().createArg().setValue("--line");
-			getJava().createArg().setValue(lineRate);
-		}
-
-		if (packageBranchRate != null)
-		{
-			getJava().createArg().setValue("--packagebranch");
-			getJava().createArg().setValue(packageBranchRate);
-		}
-
-		if (packageLineRate != null)
-		{
-			getJava().createArg().setValue("--packageline");
-			getJava().createArg().setValue(packageLineRate);
-		}
-
-		if (totalBranchRate != null)
-		{
-			getJava().createArg().setValue("--totalbranch");
-			getJava().createArg().setValue(totalBranchRate);
-		}
-
-		if (totalLineRate != null)
-		{
-			getJava().createArg().setValue("--totalline");
-			getJava().createArg().setValue(totalLineRate);
-		}
-
-		Iterator iter = regexes.iterator();
-		while (iter.hasNext())
-		{
-			getJava().createArg().setValue("--regex");
-			getJava().createArg().setValue(iter.next().toString());
-		}
-
-		AntUtil.transferCoberturaDataFileProperty(getJava());
-		int returnCode = getJava().executeJava();
-
-		// Check the return code and print a message
-		if (returnCode == 0)
-		{
-			System.out.println("All checks passed.");
-		}
-		else
-		{
-			if (haltOnFailure)
-				throw new BuildException(
-						"Coverage check failed. See messages above.");
-			else if (failureProperty != null)
-				getProject().setProperty(failureProperty, "true");
-			else
-				System.err
-						.println("Coverage check failed. See messages above.");
-		}
-	}
-
-	public Regex createRegex()
-	{
-		Regex regex = new Regex();
-		regexes.add(regex);
-		return regex;
-	}
-
-	public void setDataFile(String dataFile)
-	{
-		this.dataFile = dataFile;
-	}
-
-	public void setBranchRate(String branchRate)
-	{
-		this.branchRate = branchRate;
-	}
-
-	public void setLineRate(String lineRate)
-	{
-		this.lineRate = lineRate;
-	}
-
-	public void setPackageBranchRate(String packageBranchRate)
-	{
-		this.packageBranchRate = packageBranchRate;
-	}
-
-	public void setPackageLineRate(String packageLineRate)
-	{
-		this.packageLineRate = packageLineRate;
-	}
-
-	public void setTotalBranchRate(String totalBranchRate)
-	{
-		this.totalBranchRate = totalBranchRate;
-	}
-
-	public void setTotalLineRate(String totalLineRate)
-	{
-		this.totalLineRate = totalLineRate;
-	}
-
-	public void setFailureProperty(String failureProperty)
-	{
-		this.failureProperty = failureProperty;
-	}
-
-	public void setHaltOnFailure(boolean haltOnFailure)
-	{
-		this.haltOnFailure = haltOnFailure;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Nathan Wilson
+ * Copyright (C) 2005 Alex Ruiz
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import net.sourceforge.cobertura.check.CheckCoverageMain;
+import org.apache.tools.ant.BuildException;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * An ant task that can be used to optionally fail an ant build if
+ * the coverage percentage for lines or branches is below a certain,
+ * user specifiable threshold.
+ */
+public class CheckTask extends CommonMatchingTask {
+
+	private String dataFile = null;
+
+	final Set<Regex> regexes = new HashSet<Regex>();
+
+	private String branchRate = null;
+
+	private String lineRate = null;
+
+	private String packageBranchRate = null;
+
+	private String packageLineRate = null;
+
+	private String totalBranchRate = null;
+
+	private String totalLineRate = null;
+
+	private String failureProperty = null;
+
+	private boolean haltOnFailure = true;
+
+	public CheckTask() {
+		super(CheckCoverageMain.class.getCanonicalName());
+	}
+
+	public void execute() throws BuildException {
+		if (dataFile != null) {
+			getJava().createArg().setValue("--datafile");
+			getJava().createArg().setValue(dataFile);
+		}
+
+		if (branchRate != null) {
+			getJava().createArg().setValue("--branch");
+			getJava().createArg().setValue(branchRate);
+		}
+
+		if (lineRate != null) {
+			getJava().createArg().setValue("--line");
+			getJava().createArg().setValue(lineRate);
+		}
+
+		if (packageBranchRate != null) {
+			getJava().createArg().setValue("--packagebranch");
+			getJava().createArg().setValue(packageBranchRate);
+		}
+
+		if (packageLineRate != null) {
+			getJava().createArg().setValue("--packageline");
+			getJava().createArg().setValue(packageLineRate);
+		}
+
+		if (totalBranchRate != null) {
+			getJava().createArg().setValue("--totalbranch");
+			getJava().createArg().setValue(totalBranchRate);
+		}
+
+		if (totalLineRate != null) {
+			getJava().createArg().setValue("--totalline");
+			getJava().createArg().setValue(totalLineRate);
+		}
+
+		Iterator<Regex> iter = regexes.iterator();
+		while (iter.hasNext()) {
+			getJava().createArg().setValue("--regex");
+			getJava().createArg().setValue(iter.next().toString());
+		}
+
+		AntUtil.transferCoberturaDataFileProperty(getJava());
+		int returnCode = getJava().executeJava();
+
+		// Check the return code and print a message
+		if (returnCode == 0) {
+			System.out.println("All checks passed.");
+		} else {
+			if (haltOnFailure)
+				throw new BuildException(
+						"Coverage check failed. See messages above.");
+			else if (failureProperty != null)
+				getProject().setProperty(failureProperty, "true");
+			else
+				System.err
+						.println("Coverage check failed. See messages above.");
+		}
+	}
+
+	public Regex createRegex() {
+		Regex regex = new Regex();
+		regexes.add(regex);
+		return regex;
+	}
+
+	public void setDataFile(String dataFile) {
+		this.dataFile = dataFile;
+	}
+
+	public void setBranchRate(String branchRate) {
+		this.branchRate = branchRate;
+	}
+
+	public void setLineRate(String lineRate) {
+		this.lineRate = lineRate;
+	}
+
+	public void setPackageBranchRate(String packageBranchRate) {
+		this.packageBranchRate = packageBranchRate;
+	}
+
+	public void setPackageLineRate(String packageLineRate) {
+		this.packageLineRate = packageLineRate;
+	}
+
+	public void setTotalBranchRate(String totalBranchRate) {
+		this.totalBranchRate = totalBranchRate;
+	}
+
+	public void setTotalLineRate(String totalLineRate) {
+		this.totalLineRate = totalLineRate;
+	}
+
+	public void setFailureProperty(String failureProperty) {
+		this.failureProperty = failureProperty;
+	}
+
+	public void setHaltOnFailure(boolean haltOnFailure) {
+		this.haltOnFailure = haltOnFailure;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/ant/CoberturaJUnitResultFormatter.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/CoberturaJUnitResultFormatter.java
new file mode 100644
index 0000000..7baff4a
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/CoberturaJUnitResultFormatter.java
@@ -0,0 +1,57 @@
+package net.sourceforge.cobertura.ant;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.util.ShutdownHooks;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
+
+import java.io.OutputStream;
+
+/**
+ * This formatter is used to apply shutdown hooks previously bundled to
+ * a static statement on TouchCollector class, so that a shutdown hook
+ * and some classes would be loaded when the TouchCollector class would be loaded.
+ */
+public class CoberturaJUnitResultFormatter implements JUnitResultFormatter {
+
+	public void startTestSuite(JUnitTest jUnitTest) throws BuildException {
+		//dummy, nothing here
+	}
+
+	public void endTestSuite(JUnitTest jUnitTest) throws BuildException {
+		System.out
+				.println("Running CoberturaJUnitResultFormatter: applying shutdown hooks...");
+		ShutdownHooks.saveGlobalProjectDataWithTomcatInits();
+	}
+
+	public void setOutput(OutputStream outputStream) {
+		//dummy, nothing here
+	}
+
+	public void setSystemOutput(String s) {
+		//dummy, nothing here
+	}
+
+	public void setSystemError(String s) {
+		//dummy, nothing here
+	}
+
+	public void addFailure(Test test, AssertionFailedError assertionFailedError) {
+		//dummy, nothing here
+	}
+
+	public void endTest(Test test) {
+		//dummy, nothing here
+	}
+
+	public void startTest(Test test) {
+		//dummy, nothing here
+	}
+
+	public void addError(Test test, Throwable throwable) {
+		//dummy, nothing here
+	}
+}
diff --git a/src/net/sourceforge/cobertura/ant/CommonMatchingTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/CommonMatchingTask.java
similarity index 67%
rename from src/net/sourceforge/cobertura/ant/CommonMatchingTask.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/CommonMatchingTask.java
index 38d7dda..4d874a1 100644
--- a/src/net/sourceforge/cobertura/ant/CommonMatchingTask.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/CommonMatchingTask.java
@@ -1,268 +1,249 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Joakim Erdfelt
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2006 Srivathsan Varadarajan
- * Copyright (C) 2008 Matt Cordes
- * Copyright (C) 2008 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import net.sourceforge.cobertura.util.CommandLineBuilder;
-import net.sourceforge.cobertura.util.StringUtil;
-
-import org.apache.tools.ant.AntClassLoader;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Java;
-import org.apache.tools.ant.taskdefs.MatchingTask;
-import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.types.AbstractFileSet;
-import org.apache.tools.ant.types.DirSet;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.Reference;
-
-public abstract class CommonMatchingTask extends MatchingTask
-{
-
-	final String className;
-	final List fileSets = new LinkedList();
-
-	private Java java = null;
-	private String maxMemory = null;
-	private int forkedJVMDebugPort;
-
-	public CommonMatchingTask(String className)
-	{
-		this.className = className;
-	}
-
-	private String getClassName()
-	{
-		return className;
-	}
-
-	protected Java getJava()
-	{
-		if (java == null)
-		{
-			java = (Java)getProject().createTask("java");
-			java.setTaskName(getTaskName());
-			java.setClassname(getClassName());
-			java.setFork(true);
-			java.setDir(getProject().getBaseDir());
-			if (maxMemory != null)
-				java.setJvmargs("-Xmx" + maxMemory);
-			if (forkedJVMDebugPort > 0)
-			{
-				java.setJvmargs("-Xdebug");
-				java.setJvmargs("-Xrunjdwp:transport=dt_socket,address=" + forkedJVMDebugPort + ",server=y,suspend=y");
-			}
-
-			/**
-			 * We replace %20 with a space character because, for some
-			 * reason, when we call Cobertura from within CruiseControl,
-			 * the classpath here contains %20's instead of spaces.  I
-			 * don't know if this is our problem, or CruiseControl, or
-			 * ant, but this seems to fix it.  --Mark
-			 */
-			if (getClass().getClassLoader() instanceof AntClassLoader)
-			{
-				String classpath = ((AntClassLoader)getClass()
-						.getClassLoader()).getClasspath();
-				createClasspath().setPath(
-						StringUtil.replaceAll(classpath, "%20", " "));
-			}
-			else if (getClass().getClassLoader() instanceof URLClassLoader)
-			{
-				URL[] earls = ((URLClassLoader)getClass().getClassLoader())
-						.getURLs();
-				for (int i = 0; i < earls.length; i++)
-				{
-					String classpath = (new File(earls[i].getFile())).getAbsolutePath();
-					createClasspath().setPath(
-							StringUtil.replaceAll(classpath, "%20", " "));
-				}
-			}
-		}
-
-		return java;
-	}
-
-	protected void createArgumentsForFilesets( CommandLineBuilder builder) throws IOException {
-		Iterator iter = fileSets.iterator();
-		boolean filesetFound = false;
-		while (iter.hasNext())
-		{
-			AbstractFileSet fileSet = (AbstractFileSet)iter.next();
-
-			if (fileSet instanceof FileSet)
-			{
-				filesetFound = true;
-				builder.addArg("--basedir", baseDir(fileSet));
-				createArgumentsForFilenames( builder, getFilenames(fileSet));
-			}
-			else
-			{
-				if (filesetFound)
-				{
-					/*
-					 * Once --basedir has been used, it cannot be undone without changes to the
-					 * Main methods.   So, any dirsets have to come before filesets.
-					 */
-					throw new BuildException("Dirsets have to come before filesets");
-				}
-				createArgumentsForFilenames( builder, getDirectoryScanner(fileSet).getIncludedDirectories());
-			}
-		}
-	}
-
-	private void createArgumentsForFilenames( CommandLineBuilder builder, String[] filenames) throws IOException
-	{
-		for (int i = 0; i < filenames.length; i++)
-		{
-			getProject().log("Adding " + filenames[i] + " to list",
-					Project.MSG_VERBOSE);
-			builder.addArg(filenames[i]);
-		}
-	}
-
-	public Path createClasspath()
-	{
-		return getJava().createClasspath().createPath();
-	}
-
-	public void setClasspath(Path classpath)
-	{
-		createClasspath().append(classpath);
-	}
-
-	public void setClasspathRef(Reference r)
-	{
-		createClasspath().setRefid(r);
-	}
-
-	DirectoryScanner getDirectoryScanner(AbstractFileSet fileSet)
-	{
-		return fileSet.getDirectoryScanner(getProject());
-	}
-
-	String[] getIncludedFiles(AbstractFileSet fileSet)
-	{
-		return getDirectoryScanner(fileSet).getIncludedFiles();
-	}
-
-	String[] getExcludedFiles(FileSet fileSet)
-	{
-		return getDirectoryScanner(fileSet).getExcludedFiles();
-	}
-
-	String[] getFilenames(AbstractFileSet fileSet)
-	{
-		String[] filesToReturn = getIncludedFiles(fileSet);
-
-		return filesToReturn;
-	}
-
-	String baseDir(AbstractFileSet fileSet)
-	{
-		return fileSet.getDirectoryScanner(getProject()).getBasedir()
-				.toString();
-	}
-
-	public void addDirSet(DirSet dirSet)
-	{
-		fileSets.add(dirSet);
-	}
-	
-	public void addFileset(FileSet fileSet)
-	{
-		fileSets.add(fileSet);
-	}
-
-	/**
-	 * @param maxMemory Assumed to be something along the lines of
-	 *        100M or 50K or 1G.
-	 */
-	public void setMaxMemory(String maxMemory)
-	{
-		this.maxMemory = maxMemory != null ? maxMemory.trim() : null;
-	}
-	
-	/**
-	 * Used to debug the process that is forked to perform the operation.
-	 * Setting this to a non-zero number will cause the process to open
-	 * a debug port on that port number.   It will suspend until a 
-	 * remote debugger is attached to the port.
-	 * 
-	 * @param forkedJVMDebugPort
-	 */
-	public void setForkedJVMDebugPort(int forkedJVMDebugPort)
-	{
-		this.forkedJVMDebugPort = forkedJVMDebugPort;
-	}
-
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Joakim Erdfelt
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 Srivathsan Varadarajan
+ * Copyright (C) 2008 Matt Cordes
+ * Copyright (C) 2008 John Lewis
+ * Copyright (C) 2010 Piotr Tabor
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import net.sourceforge.cobertura.util.CommandLineBuilder;
+import net.sourceforge.cobertura.util.StringUtil;
+import org.apache.tools.ant.AntClassLoader;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.LinkedList;
+import java.util.List;
+
+public abstract class CommonMatchingTask extends MatchingTask {
+
+	final String className;
+	final List<AbstractFileSet> fileSets = new LinkedList<AbstractFileSet>();
+
+	private Java java = null;
+	private String maxMemory = null;
+	private int forkedJVMDebugPort;
+	protected boolean failOnError = false;
+
+	public CommonMatchingTask(String className) {
+		this.className = className;
+	}
+
+	private String getClassName() {
+		return className;
+	}
+
+	protected Java getJava() {
+		if (java == null) {
+			java = (Java) getProject().createTask("java");
+			java.setTaskName(getTaskName());
+			java.setClassname(getClassName());
+			java.setFork(true);
+			java.setFailonerror(failOnError);
+			java.setDir(getProject().getBaseDir());
+			if (maxMemory != null)
+				java.setJvmargs("-Xmx" + maxMemory);
+			if (forkedJVMDebugPort > 0) {
+				java.setJvmargs("-Xdebug");
+				java.setJvmargs("-Xrunjdwp:transport=dt_socket,address="
+						+ forkedJVMDebugPort + ",server=y,suspend=y");
+			}
+
+			/**
+			 * We replace %20 with a space character because, for some
+			 * reason, when we call Cobertura from within CruiseControl,
+			 * the classpath here contains %20's instead of spaces.  I
+			 * don't know if this is our problem, or CruiseControl, or
+			 * ant, but this seems to fix it.  --Mark
+			 */
+			if (getClass().getClassLoader() instanceof AntClassLoader) {
+				String classpath = ((AntClassLoader) getClass()
+						.getClassLoader()).getClasspath();
+				createClasspath().setPath(
+						StringUtil.replaceAll(classpath, "%20", " "));
+			} else if (getClass().getClassLoader() instanceof URLClassLoader) {
+				URL[] earls = ((URLClassLoader) getClass().getClassLoader())
+						.getURLs();
+				for (int i = 0; i < earls.length; i++) {
+					String classpath = (new File(earls[i].getFile()))
+							.getAbsolutePath();
+					createClasspath().setPath(
+							StringUtil.replaceAll(classpath, "%20", " "));
+				}
+			}
+		}
+
+		return java;
+	}
+
+	protected void createArgumentsForFilesets(CommandLineBuilder builder)
+			throws IOException {
+		boolean filesetFound = false;
+		for (AbstractFileSet fileSet : fileSets) {
+			if (fileSet instanceof FileSet) {
+				filesetFound = true;
+				builder.addArg("--basedir", baseDir(fileSet));
+				createArgumentsForFilenames(builder, getFilenames(fileSet));
+			} else {
+				if (filesetFound) {
+					/*
+					 * Once --basedir has been used, it cannot be undone without changes to the
+					 * Main methods.   So, any dirsets have to come before filesets.
+					 */
+					throw new BuildException(
+							"Dirsets have to come before filesets");
+				}
+				createArgumentsForFilenames(builder, getDirectoryScanner(
+						fileSet).getIncludedDirectories());
+			}
+		}
+	}
+
+	private void createArgumentsForFilenames(CommandLineBuilder builder,
+			String[] filenames) throws IOException {
+		for (int i = 0; i < filenames.length; i++) {
+			getProject().log("Adding " + filenames[i] + " to list",
+					Project.MSG_VERBOSE);
+			builder.addArg(filenames[i]);
+		}
+	}
+
+	public Path createClasspath() {
+		return getJava().createClasspath().createPath();
+	}
+
+	public void setClasspath(Path classpath) {
+		createClasspath().append(classpath);
+	}
+
+	public void setClasspathRef(Reference r) {
+		createClasspath().setRefid(r);
+	}
+
+	DirectoryScanner getDirectoryScanner(AbstractFileSet fileSet) {
+		return fileSet.getDirectoryScanner(getProject());
+	}
+
+	String[] getIncludedFiles(AbstractFileSet fileSet) {
+		return getDirectoryScanner(fileSet).getIncludedFiles();
+	}
+
+	String[] getExcludedFiles(FileSet fileSet) {
+		return getDirectoryScanner(fileSet).getExcludedFiles();
+	}
+
+	String[] getFilenames(AbstractFileSet fileSet) {
+		String[] filesToReturn = getIncludedFiles(fileSet);
+
+		return filesToReturn;
+	}
+
+	String baseDir(AbstractFileSet fileSet) {
+		return fileSet.getDirectoryScanner(getProject()).getBasedir()
+				.toString();
+	}
+
+	public void addDirSet(DirSet dirSet) {
+		fileSets.add(dirSet);
+	}
+
+	public void addFileset(FileSet fileSet) {
+		fileSets.add(fileSet);
+	}
+
+	/**
+	 * @param maxMemory Assumed to be something along the lines of
+	 *                  100M or 50K or 1G.
+	 */
+	public void setMaxMemory(String maxMemory) {
+		this.maxMemory = maxMemory != null ? maxMemory.trim() : null;
+	}
+
+	/**
+	 * Used to debug the process that is forked to perform the operation.
+	 * Setting this to a non-zero number will cause the process to open
+	 * a debug port on that port number.   It will suspend until a
+	 * remote debugger is attached to the port.
+	 *
+	 * @param forkedJVMDebugPort
+	 */
+	public void setForkedJVMDebugPort(int forkedJVMDebugPort) {
+		this.forkedJVMDebugPort = forkedJVMDebugPort;
+	}
+
+	/**
+	 * If true, then fail if the command exits with a
+	 * returncode other than zero.
+	 *
+	 * @param fail if true fail the build when the command exits with a
+	 *             nonzero returncode.
+	 */
+	public void setFailonerror(boolean fail) {
+		failOnError = fail;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/ExcludeClasses.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/ExcludeClasses.java
similarity index 94%
rename from src/net/sourceforge/cobertura/ant/ExcludeClasses.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/ExcludeClasses.java
index 0df7ac5..20239c0 100644
--- a/src/net/sourceforge/cobertura/ant/ExcludeClasses.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/ExcludeClasses.java
@@ -1,75 +1,72 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class ExcludeClasses
-{
-
-	String regex;
-
-	public void setRegex(String regex)
-	{
-		this.regex = regex;
-	}
-
-	public String getRegex()
-	{
-		return regex;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2006 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+public class ExcludeClasses {
+
+	String regex;
+
+	public void setRegex(String regex) {
+		this.regex = regex;
+	}
+
+	public String getRegex() {
+		return regex;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/Ignore.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/Ignore.java
similarity index 94%
copy from src/net/sourceforge/cobertura/ant/Ignore.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/ant/Ignore.java
index 749cf35..09e5e29 100644
--- a/src/net/sourceforge/cobertura/ant/Ignore.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/Ignore.java
@@ -1,74 +1,71 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class Ignore
-{
-
-	String regex;
-
-	public void setRegex(String regex)
-	{
-		this.regex = regex;
-	}
-
-	public String getRegex()
-	{
-		return regex;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+public class Ignore {
+
+	String regex;
+
+	public void setRegex(String regex) {
+		this.regex = regex;
+	}
+
+	public String getRegex() {
+		return regex;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/IgnoreBranches.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreBranches.java
similarity index 94%
rename from src/net/sourceforge/cobertura/ant/IgnoreBranches.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreBranches.java
index 1fba5b9..ba6a265 100644
--- a/src/net/sourceforge/cobertura/ant/IgnoreBranches.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreBranches.java
@@ -1,73 +1,70 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2006 Jiri Mares 
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class IgnoreBranches
-{
-
-	String regex;
-
-	public void setRegex(String regex)
-	{
-		this.regex = regex;
-	}
-
-	public String getRegex()
-	{
-		return regex;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2006 Jiri Mares 
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+public class IgnoreBranches {
+
+	String regex;
+
+	public void setRegex(String regex) {
+		this.regex = regex;
+	}
+
+	public String getRegex() {
+		return regex;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/Ignore.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreClassAnnotation.java
similarity index 92%
copy from src/net/sourceforge/cobertura/ant/Ignore.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreClassAnnotation.java
index 749cf35..d8ba9b8 100644
--- a/src/net/sourceforge/cobertura/ant/Ignore.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreClassAnnotation.java
@@ -1,74 +1,70 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class Ignore
-{
-
-	String regex;
-
-	public void setRegex(String regex)
-	{
-		this.regex = regex;
-	}
-
-	public String getRegex()
-	{
-		return regex;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+public class IgnoreClassAnnotation {
+	private String annotationName;
+
+	public String getAnnotationName() {
+		return annotationName;
+	}
+
+	public void setAnnotationName(String annotationName) {
+		this.annotationName = annotationName;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/Ignore.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreMethodAnnotation.java
similarity index 92%
rename from src/net/sourceforge/cobertura/ant/Ignore.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreMethodAnnotation.java
index 749cf35..dc31d5c 100644
--- a/src/net/sourceforge/cobertura/ant/Ignore.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IgnoreMethodAnnotation.java
@@ -1,74 +1,70 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class Ignore
-{
-
-	String regex;
-
-	public void setRegex(String regex)
-	{
-		this.regex = regex;
-	}
-
-	public String getRegex()
-	{
-		return regex;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+public class IgnoreMethodAnnotation {
+	private String annotationName;
+
+	public String getAnnotationName() {
+		return annotationName;
+	}
+
+	public void setAnnotationName(String annotationName) {
+		this.annotationName = annotationName;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/IncludeClasses.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IncludeClasses.java
similarity index 94%
copy from src/net/sourceforge/cobertura/ant/IncludeClasses.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/ant/IncludeClasses.java
index 8bcc889..a323806 100644
--- a/src/net/sourceforge/cobertura/ant/IncludeClasses.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/IncludeClasses.java
@@ -1,75 +1,72 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class IncludeClasses
-{
-
-	String regex;
-
-	public void setRegex(String regex)
-	{
-		this.regex = regex;
-	}
-
-	public String getRegex()
-	{
-		return regex;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2006 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+public class IncludeClasses {
+
+	String regex;
+
+	public void setRegex(String regex) {
+		this.regex = regex;
+	}
+
+	public String getRegex() {
+		return regex;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/InstrumentTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/InstrumentTask.java
similarity index 53%
rename from src/net/sourceforge/cobertura/ant/InstrumentTask.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/InstrumentTask.java
index 610b06b..ed30a67 100644
--- a/src/net/sourceforge/cobertura/ant/InstrumentTask.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/InstrumentTask.java
@@ -1,274 +1,368 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Joakim Erdfelt
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2005 Alexei Yudichev
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2006 Jiri Mares 
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import net.sourceforge.cobertura.util.CommandLineBuilder;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.types.Path;
-
-public class InstrumentTask extends CommonMatchingTask
-{
-
-	private String dataFile = null;
-
-	private File toDir = null;
-
-	List ignoreRegexs = new ArrayList();
-
-	List ignoreBranchesRegexs = new ArrayList();
-	
-	List includeClassesRegexs = new ArrayList();
-
-	List excludeClassesRegexs = new ArrayList();
-
-	private Integer forkedJVMDebugPort;
-	
-	private Path instrumentationClasspath = null;
-
-	private HashMap fileSetMap = new HashMap();
-
-	public InstrumentTask()
-	{
-		super("net.sourceforge.cobertura.instrument.Main");
-	}
-
-	public Ignore createIgnore()
-	{
-		Ignore ignoreRegex = new Ignore();
-		ignoreRegexs.add(ignoreRegex);
-		return ignoreRegex;
-	}
-
-	public IgnoreBranches createIgnoreBranches()
-	{
-		IgnoreBranches ignoreBranchesRegex = new IgnoreBranches();
-		ignoreBranchesRegexs.add(ignoreBranchesRegex);
-		return ignoreBranchesRegex;
-	}
-
-	public IncludeClasses createIncludeClasses()
-	{
-		IncludeClasses includeClassesRegex = new IncludeClasses();
-		includeClassesRegexs.add(includeClassesRegex);
-		return includeClassesRegex;
-	}
-
-	public ExcludeClasses createExcludeClasses()
-	{
-		ExcludeClasses excludeClassesRegex = new ExcludeClasses();
-		excludeClassesRegexs.add(excludeClassesRegex);
-		return excludeClassesRegex;
-	}
-
-	public Path createInstrumentationClasspath()
-	{
-		if (instrumentationClasspath == null) {
-			instrumentationClasspath = new Path(getProject());
-		}
-		return instrumentationClasspath.createPath();
-	}
-
-	/*
-	 * TODO: Is the following method needed to use a classpath ref?  If so,
-	 *       test it and uncomment it.
-	 */
-	/*
-	public void setInstrumentationClasspathRef(Reference r)
-	{
-		createInstrumentationClasspath().setRefid(r);
-	}
-	*/
-
-	public void execute() throws BuildException
-	{
-		CommandLineBuilder builder = null;
-		try {
-			builder = new CommandLineBuilder();
-			if (dataFile != null)
-				builder.addArg("--datafile", dataFile);
-			if (toDir != null)
-				builder.addArg("--destination", toDir.getAbsolutePath());
-
-			for (int i = 0; i < ignoreRegexs.size(); i++) {
-				Ignore ignoreRegex = (Ignore)ignoreRegexs.get(i);
-				builder.addArg("--ignore", ignoreRegex.getRegex());
-			}
-
-			for (int i = 0; i < ignoreBranchesRegexs.size(); i++) {
-				IgnoreBranches ignoreBranchesRegex = (IgnoreBranches)ignoreBranchesRegexs.get(i);
-				builder.addArg("--ignoreBranches", ignoreBranchesRegex.getRegex());
-			}
-
-			for (int i = 0; i < includeClassesRegexs.size(); i++) {
-				IncludeClasses includeClassesRegex = (IncludeClasses)includeClassesRegexs.get(i);
-				builder.addArg("--includeClasses", includeClassesRegex.getRegex());
-			}
-
-			for (int i = 0; i < excludeClassesRegexs.size(); i++) {
-				ExcludeClasses excludeClassesRegex = (ExcludeClasses)excludeClassesRegexs.get(i);
-				builder.addArg("--excludeClasses", excludeClassesRegex.getRegex());
-			}
-
-			if (instrumentationClasspath != null) {
-				processInstrumentationClasspath();
-			}
-			createArgumentsForFilesets(builder);
-
-			builder.saveArgs();
-		} catch (IOException ioe) {
-			getProject().log("Error creating commands file.", Project.MSG_ERR);
-			throw new BuildException("Unable to create the commands file.", ioe);
-		}
-
-		// Execute GPL licensed code in separate virtual machine
-		getJava().createArg().setValue("--commandsfile");
-		getJava().createArg().setValue(builder.getCommandLineFile());
-		if (forkedJVMDebugPort != null && forkedJVMDebugPort.intValue() > 0) {
-			getJava().createJvmarg().setValue("-Xdebug");
-			getJava().createJvmarg().setValue("-Xrunjdwp:transport=dt_socket,address=" + forkedJVMDebugPort + ",server=y,suspend=y");
-		}
-		AntUtil.transferCoberturaDataFileProperty(getJava());
-		if (getJava().executeJava() != 0) {
-			throw new BuildException(
-					"Error instrumenting classes. See messages above.");
-		}
-
-		builder.dispose();
-	}
-
-	private void processInstrumentationClasspath()
-	{
-		if (includeClassesRegexs.size() == 0)
-		{
-			throw new BuildException("'includeClasses' is required when 'instrumentationClasspath' is used");
-		}
-
-		String[] sources = instrumentationClasspath.list();
-		for (int i = 0; i < sources.length; i++) {
-			File fileOrDir = new File(sources[i]);
-			if (fileOrDir.exists())
-			{
-				if (fileOrDir.isDirectory()) {
-					createFilesetForDirectory(fileOrDir);
-				} else {
-					addFileToFilesets(fileOrDir);
-				}
-			}
-		}
-	}
-
-	private void addFileToFilesets(File file)
-	{
-		File dir = file.getParentFile();
-		String filename = file.getName();
-		FileSet fileSet = getFileSet(dir);
-		fileSet.createInclude().setName(filename);
-	}
-
-	private FileSet getFileSet(File dir)
-	{
-		String key = dir.getAbsolutePath();
-		FileSet fileSet = (FileSet)fileSetMap.get(key);
-		if (fileSet == null)
-		{
-	        fileSet = new FileSet();
-	        fileSet.setProject(getProject());
-	        fileSet.setDir(dir);
-
-	        // Now add the new fileset to the map and to the fileSets list 
-	        fileSetMap.put(key, fileSet);
-	        addFileset(fileSet);
-		}
-		return fileSet;
-	}
-
-	private void createFilesetForDirectory(File dir)
-	{
-		FileSet fileSet = getFileSet(dir);
-		fileSet.createInclude().setName("**/*.class");
-	}
-
-	public void setDataFile(String dataFile)
-	{
-		this.dataFile = dataFile;
-	}
-
-	public void setToDir(File toDir)
-	{
-		this.toDir = toDir;
-	}
-
-	public void setForkedJVMDebugPort(Integer forkedJVMDebugPort)
-	{
-		this.forkedJVMDebugPort = forkedJVMDebugPort;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Joakim Erdfelt
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2005 Alexei Yudichev
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Jiri Mares
+ * Copyright (C) 2008 Scott Frederick
+ * Copyright (C) 2010 Tad Smith
+ * Copyright (C) 2010 Piotr Tabor
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.sourceforge.cobertura.instrument.InstrumentMain;
+import net.sourceforge.cobertura.util.CommandLineBuilder;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.AbstractFileSet;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+
+public class InstrumentTask extends CommonMatchingTask {
+
+	private String dataFile = null;
+
+	private File toDir = null;
+
+	final List<Ignore> ignoreRegexs = new ArrayList<Ignore>();
+
+	final List<IgnoreBranches> ignoreBranchesRegexs = new ArrayList<IgnoreBranches>();
+
+	final List<IgnoreMethodAnnotation> ignoreMethodAnnotations = new ArrayList<IgnoreMethodAnnotation>();
+
+	final List<IgnoreClassAnnotation> ignoreClassAnnotations = new ArrayList<IgnoreClassAnnotation>();
+
+	final List<IncludeClasses> includeClassesRegexs = new ArrayList<IncludeClasses>();
+
+	final List<ExcludeClasses> excludeClassesRegexs = new ArrayList<ExcludeClasses>();
+
+	Path auxClasspath = null;
+
+	boolean ignoreTrivial = false;
+
+	private Integer forkedJVMDebugPort;
+
+	private Path instrumentationClasspath = null;
+
+	boolean threadsafeRigorous = false;
+
+	final private HashMap<String, FileSet> fileSetMap = new HashMap<String, FileSet>();
+
+	public InstrumentTask() {
+		super(InstrumentMain.class.getCanonicalName());
+	}
+
+	public Ignore createIgnore() {
+		Ignore ignoreRegex = new Ignore();
+		ignoreRegexs.add(ignoreRegex);
+		return ignoreRegex;
+	}
+
+	public IgnoreBranches createIgnoreBranches() {
+		IgnoreBranches ignoreBranchesRegex = new IgnoreBranches();
+		ignoreBranchesRegexs.add(ignoreBranchesRegex);
+		return ignoreBranchesRegex;
+	}
+
+	public IgnoreMethodAnnotation createIgnoreMethodAnnotation() {
+		IgnoreMethodAnnotation ignoreAnnotation = new IgnoreMethodAnnotation();
+		ignoreMethodAnnotations.add(ignoreAnnotation);
+		return ignoreAnnotation;
+	}
+
+	public IgnoreClassAnnotation createIgnoreClassAnnotation() {
+		IgnoreClassAnnotation ignoreAnnotation = new IgnoreClassAnnotation();
+		ignoreClassAnnotations.add(ignoreAnnotation);
+		return ignoreAnnotation;
+	}
+
+	public IncludeClasses createIncludeClasses() {
+		IncludeClasses includeClassesRegex = new IncludeClasses();
+		includeClassesRegexs.add(includeClassesRegex);
+		return includeClassesRegex;
+	}
+
+	public ExcludeClasses createExcludeClasses() {
+		ExcludeClasses excludeClassesRegex = new ExcludeClasses();
+		excludeClassesRegexs.add(excludeClassesRegex);
+		return excludeClassesRegex;
+	}
+
+	public Path createInstrumentationClasspath() {
+		if (instrumentationClasspath == null) {
+			instrumentationClasspath = new Path(getProject());
+		}
+		return instrumentationClasspath.createPath();
+	}
+
+	/*
+	 * TODO: Is the following method needed to use a classpath ref? If so, test
+	 * it and uncomment it.
+	 */
+	/*
+	 * public void setInstrumentationClasspathRef(Reference r) {
+	 * createInstrumentationClasspath().setRefid(r); }
+	 */
+
+	@Override
+	public void execute() throws BuildException {
+		CommandLineBuilder builder = null;
+		try {
+			builder = new CommandLineBuilder();
+			if (dataFile != null) {
+				builder.addArg("--datafile", dataFile);
+			}
+			if (toDir != null) {
+				builder.addArg("--destination", toDir.getAbsolutePath());
+			}
+
+			for (int i = 0; i < ignoreRegexs.size(); i++) {
+				Ignore ignoreRegex = ignoreRegexs.get(i);
+				builder.addArg("--ignore", ignoreRegex.getRegex());
+			}
+
+			for (int i = 0; i < ignoreBranchesRegexs.size(); i++) {
+				IgnoreBranches ignoreBranchesRegex = ignoreBranchesRegexs
+						.get(i);
+				builder.addArg("--ignoreBranches",
+						ignoreBranchesRegex.getRegex());
+			}
+
+			for (int i = 0; i < ignoreMethodAnnotations.size(); i++) {
+				IgnoreMethodAnnotation ignoreMethodAnn = ignoreMethodAnnotations
+						.get(i);
+				builder.addArg("--ignoreMethodAnnotation",
+						ignoreMethodAnn.getAnnotationName());
+			}
+
+			for (int i = 0; i < ignoreClassAnnotations.size(); i++) {
+				IgnoreClassAnnotation ignoreClassAnn = ignoreClassAnnotations
+						.get(i);
+				builder.addArg("--ignoreClassAnnotation",
+						ignoreClassAnn.getAnnotationName());
+			}
+
+			for (int i = 0; i < includeClassesRegexs.size(); i++) {
+				IncludeClasses includeClassesRegex = includeClassesRegexs
+						.get(i);
+				builder.addArg("--includeClasses",
+						includeClassesRegex.getRegex());
+			}
+
+			for (int i = 0; i < excludeClassesRegexs.size(); i++) {
+				ExcludeClasses excludeClassesRegex = excludeClassesRegexs
+						.get(i);
+				builder.addArg("--excludeClasses",
+						excludeClassesRegex.getRegex());
+			}
+
+			if (ignoreTrivial) {
+				builder.addArg("--ignoreTrivial");
+			}
+
+			if (threadsafeRigorous) {
+				builder.addArg("--threadsafeRigorous");
+			}
+
+			if (failOnError) {
+				builder.addArg("--failOnError");
+			}
+
+			if (instrumentationClasspath != null) {
+				processInstrumentationClasspath();
+			}
+			createArgumentsForFilesets(builder);
+
+			Path classPath = createClasspathForInstrumenter();
+			if (classPath != null && classPath.toString() != null
+					&& !classPath.toString().equals("")) {
+
+				builder.addArg("--auxClasspath", classPath.toString());
+			}
+
+			builder.saveArgs();
+		} catch (IOException ioe) {
+			getProject().log("Error creating commands file.", Project.MSG_ERR);
+			throw new BuildException("Unable to create the commands file.", ioe);
+		}
+
+		// Execute GPL licensed code in separate virtual machine
+		getJava().createArg().setValue("--commandsfile");
+		getJava().createArg().setValue(builder.getCommandLineFile());
+		if (forkedJVMDebugPort != null && forkedJVMDebugPort.intValue() > 0) {
+			getJava().createJvmarg().setValue("-Xdebug");
+			getJava().createJvmarg().setValue(
+					"-Xrunjdwp:transport=dt_socket,address="
+							+ forkedJVMDebugPort + ",server=y,suspend=y");
+		}
+
+		AntUtil.transferCoberturaDataFileProperty(getJava());
+		if (getJava().executeJava() != 0) {
+			throw new BuildException(
+					"Error instrumenting classes. See messages above.");
+		}
+
+		builder.dispose();
+	}
+
+	/**
+	 * Creates a classpath to be used by the instrumenter because asm uses
+	 * Class.forName() in its own classpath to determine common super classes.
+	 */
+	private Path createClasspathForInstrumenter() {
+		Path path = (Path) createInstrumentationClasspath().clone();
+		path = path.concatSystemClasspath();
+		for (AbstractFileSet fileSet : fileSets) {
+			if (fileSet instanceof FileSet) {
+				path.add(new Path(getProject(), baseDir(fileSet)));
+			}
+		}
+		if (auxClasspath != null) {
+			path.add(auxClasspath);
+		}
+		return path;
+	}
+
+	private void processInstrumentationClasspath() {
+		if (includeClassesRegexs.size() == 0) {
+			throw new BuildException(
+					"'includeClasses' is required when 'instrumentationClasspath' is used");
+		}
+
+		String[] sources = instrumentationClasspath.list();
+		for (int i = 0; i < sources.length; i++) {
+			File fileOrDir = new File(sources[i]);
+			if (fileOrDir.exists()) {
+				if (fileOrDir.isDirectory()) {
+					createFilesetForDirectory(fileOrDir);
+				} else {
+					addFileToFilesets(fileOrDir);
+				}
+			}
+		}
+	}
+
+	private void addFileToFilesets(File file) {
+		File dir = file.getParentFile();
+		String filename = file.getName();
+		FileSet fileSet = getFileSet(dir);
+		fileSet.createInclude().setName(filename);
+	}
+
+	private FileSet getFileSet(File dir) {
+		String key = dir.getAbsolutePath();
+		FileSet fileSet = fileSetMap.get(key);
+		if (fileSet == null) {
+			fileSet = new FileSet();
+			fileSet.setProject(getProject());
+			fileSet.setDir(dir);
+
+			// Now add the new fileset to the map and to the fileSets list
+			fileSetMap.put(key, fileSet);
+			addFileset(fileSet);
+		}
+		return fileSet;
+	}
+
+	private void createFilesetForDirectory(File dir) {
+		FileSet fileSet = getFileSet(dir);
+		fileSet.createInclude().setName("**/*.class");
+	}
+
+	public void setDataFile(String dataFile) {
+		this.dataFile = dataFile;
+	}
+
+	public void setToDir(File toDir) {
+		this.toDir = toDir;
+	}
+
+	public void setIgnoreTrivial(boolean ignoreTrivial) {
+		this.ignoreTrivial = ignoreTrivial;
+	}
+
+	public void setThreadsafeRigorous(boolean threadsafeRigorous) {
+		this.threadsafeRigorous = threadsafeRigorous;
+	}
+
+	public void setForkedJVMDebugPort(Integer forkedJVMDebugPort) {
+		this.forkedJVMDebugPort = forkedJVMDebugPort;
+	}
+
+	public void setAuxClasspath(Path path) {
+		if (auxClasspath == null) {
+			auxClasspath = path;
+		} else {
+			auxClasspath.append(path);
+		}
+	}
+
+	public Path createAuxClasspath() {
+		if (auxClasspath == null) {
+			auxClasspath = new Path(getProject());
+		}
+		return auxClasspath.createPath();
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/MergeTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/MergeTask.java
similarity index 93%
rename from src/net/sourceforge/cobertura/ant/MergeTask.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/MergeTask.java
index 66ab29f..5197647 100644
--- a/src/net/sourceforge/cobertura/ant/MergeTask.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/MergeTask.java
@@ -1,110 +1,107 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Joakim Erdfelt
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.io.IOException;
-
-import net.sourceforge.cobertura.util.CommandLineBuilder;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-
-public class MergeTask extends CommonMatchingTask
-{
-
-	private String dataFile = null;
-
-	public MergeTask()
-	{
-		super("net.sourceforge.cobertura.merge.Main");
-	}
-
-	public void execute() throws BuildException {
-		CommandLineBuilder builder = null;
-		try {
-			builder = new CommandLineBuilder();
-			if (dataFile != null)
-				builder.addArg("--datafile", dataFile);
-
-			createArgumentsForFilesets(builder);
-
-			builder.saveArgs();
-		} catch (IOException ioe) {
-			getProject().log("Error creating commands file.", Project.MSG_ERR);
-			throw new BuildException("Unable to create the commands file.", ioe);
-		}
-
-		// Execute GPL licensed code in separate virtual machine
-		getJava().createArg().setValue("--commandsfile");
-		getJava().createArg().setValue(builder.getCommandLineFile());
-		AntUtil.transferCoberturaDataFileProperty(getJava());
-		if (getJava().executeJava() != 0) {
-			throw new BuildException(
-					"Error running reports. See messages above.");
-		}
-
-		builder.dispose();
-	}
-
-	public void setDataFile(String dataFile)
-	{
-		this.dataFile = dataFile;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Joakim Erdfelt
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import net.sourceforge.cobertura.merge.MergeMain;
+import net.sourceforge.cobertura.util.CommandLineBuilder;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+
+import java.io.IOException;
+
+public class MergeTask extends CommonMatchingTask {
+
+	private String dataFile = null;
+
+	public MergeTask() {
+		super(MergeMain.class.getCanonicalName());
+	}
+
+	public void execute() throws BuildException {
+		CommandLineBuilder builder = null;
+		try {
+			builder = new CommandLineBuilder();
+			if (dataFile != null)
+				builder.addArg("--datafile", dataFile);
+
+			createArgumentsForFilesets(builder);
+
+			builder.saveArgs();
+		} catch (IOException ioe) {
+			getProject().log("Error creating commands file.", Project.MSG_ERR);
+			throw new BuildException("Unable to create the commands file.", ioe);
+		}
+
+		// Execute GPL licensed code in separate virtual machine
+		getJava().createArg().setValue("--commandsfile");
+		getJava().createArg().setValue(builder.getCommandLineFile());
+		AntUtil.transferCoberturaDataFileProperty(getJava());
+		if (getJava().executeJava() != 0) {
+			throw new BuildException(
+					"Error running reports. See messages above.");
+		}
+
+		builder.dispose();
+	}
+
+	public void setDataFile(String dataFile) {
+		this.dataFile = dataFile;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/ant/Regex.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/Regex.java
similarity index 91%
copy from src/net/sourceforge/cobertura/ant/Regex.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/ant/Regex.java
index 1128487..8e8804d 100644
--- a/src/net/sourceforge/cobertura/ant/Regex.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/Regex.java
@@ -1,91 +1,86 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class Regex
-{
-
-	String pattern;
-	String lineRate;
-	String branchRate;
-
-	public void setPattern(String pattern)
-	{
-		this.pattern = pattern;
-	}
-
-	public void setBranchRate(String branchRate)
-	{
-		this.branchRate = branchRate;
-	}
-
-	public void setLineRate(String lineRate)
-	{
-		this.lineRate = lineRate;
-	}
-
-	public String toString()
-	{
-		StringBuffer sb = new StringBuffer();
-		sb.append(pattern);
-		sb.append(':');
-		sb.append(lineRate);
-		sb.append(':');
-		sb.append(branchRate);
-		return sb.toString();
-	}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+public class Regex {
+
+	String pattern;
+	String lineRate;
+	String branchRate;
+
+	public void setPattern(String pattern) {
+		this.pattern = pattern;
+	}
+
+	public void setBranchRate(String branchRate) {
+		this.branchRate = branchRate;
+	}
+
+	public void setLineRate(String lineRate) {
+		this.lineRate = lineRate;
+	}
+
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		sb.append(pattern);
+		sb.append(':');
+		sb.append(lineRate);
+		sb.append(':');
+		sb.append(branchRate);
+		return sb.toString();
+	}
 }
\ No newline at end of file
diff --git a/src/net/sourceforge/cobertura/ant/ReportTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/ant/ReportTask.java
similarity index 89%
rename from src/net/sourceforge/cobertura/ant/ReportTask.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/ant/ReportTask.java
index c109bef..ff494f3 100644
--- a/src/net/sourceforge/cobertura/ant/ReportTask.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/ReportTask.java
@@ -1,139 +1,138 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.io.File;
-import java.io.IOException;
-
-import net.sourceforge.cobertura.util.CommandLineBuilder;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-
-/**
- * Generate a coverage report based on coverage data generated 
- * by instrumented classes.
- */
-public class ReportTask extends CommonMatchingTask
-{
-
-	private String dataFile = null;
-	private String format = "html";
-	private File destDir;
-	private String srcDir;
-   private String encoding;
-
-	public ReportTask() {
-		super("net.sourceforge.cobertura.reporting.Main");
-	}
-	
-	public void execute() throws BuildException {
-		CommandLineBuilder builder = null;
-		try {
-			builder = new CommandLineBuilder();
-			if (dataFile != null)
-				builder.addArg("--datafile", dataFile);
-			if (destDir != null)
-				builder.addArg("--destination", destDir.getAbsolutePath());
-			if (format != null)
-				builder.addArg("--format", format);
-         if (encoding != null)
-            builder.addArg("--encoding", encoding);
-			if (srcDir != null)
-				builder.addArg(srcDir);
-			createArgumentsForFilesets(builder);
-
-			builder.saveArgs();
-		} catch (IOException ioe) {
-			getProject().log("Error creating commands file.", Project.MSG_ERR);
-			throw new BuildException("Unable to create the commands file.", ioe);
-		}
-
-		// Execute GPL licensed code in separate virtual machine
-		getJava().createArg().setValue("--commandsfile");
-		getJava().createArg().setValue(builder.getCommandLineFile());
-		AntUtil.transferCoberturaDataFileProperty(getJava());
-		if (getJava().executeJava() != 0) {
-			throw new BuildException(
-					"Error running reports. See messages above.");
-		}
-
-		builder.dispose();
-	}
-
-	public void setDataFile(String dataFile) {
-		this.dataFile = dataFile;
-	}
-
-	public void setDestDir(File destDir) {
-		this.destDir = destDir;
-	}
-
-	public void setFormat(String format) {
-		this.format = format;
-	}
-
-   public void setEncoding(String encoding) {
-      this.encoding = encoding;
-   }
-	
-	public void setSrcDir(String dir) {
-		srcDir = dir;
-	}
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import net.sourceforge.cobertura.reporting.ReportMain;
+import net.sourceforge.cobertura.util.CommandLineBuilder;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Generate a coverage report based on coverage data generated
+ * by instrumented classes.
+ */
+public class ReportTask extends CommonMatchingTask {
+
+	private String dataFile = null;
+	private String format = "html";
+	private File destDir;
+	private String srcDir;
+	private String encoding;
+
+	public ReportTask() {
+		super(ReportMain.class.getCanonicalName());
+	}
+
+	public void execute() throws BuildException {
+		CommandLineBuilder builder = null;
+		try {
+			builder = new CommandLineBuilder();
+			if (dataFile != null)
+				builder.addArg("--datafile", dataFile);
+			if (destDir != null)
+				builder.addArg("--destination", destDir.getAbsolutePath());
+			if (format != null)
+				builder.addArg("--format", format);
+			if (encoding != null)
+				builder.addArg("--encoding", encoding);
+			if (srcDir != null)
+				builder.addArg(srcDir);
+			createArgumentsForFilesets(builder);
+
+			builder.saveArgs();
+		} catch (IOException ioe) {
+			getProject().log("Error creating commands file.", Project.MSG_ERR);
+			throw new BuildException("Unable to create the commands file.", ioe);
+		}
+
+		// Execute GPL licensed code in separate virtual machine
+		getJava().createArg().setValue("--commandsfile");
+		getJava().createArg().setValue(builder.getCommandLineFile());
+		AntUtil.transferCoberturaDataFileProperty(getJava());
+		if (getJava().executeJava() != 0) {
+			throw new BuildException(
+					"Error running reports. See messages above.");
+		}
+
+		builder.dispose();
+	}
+
+	public void setDataFile(String dataFile) {
+		this.dataFile = dataFile;
+	}
+
+	public void setDestDir(File destDir) {
+		this.destDir = destDir;
+	}
+
+	public void setFormat(String format) {
+		this.format = format;
+	}
+
+	public void setEncoding(String encoding) {
+		this.encoding = encoding;
+	}
+
+	public void setSrcDir(String dir) {
+		srcDir = dir;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/ant/package.html b/cobertura/src/main/java/net/sourceforge/cobertura/ant/package.html
new file mode 100644
index 0000000..b4943d4
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/ant/package.html
@@ -0,0 +1,17 @@
+<body>
+
+<p>
+    The ant tasks for Cobertura and assorted helper classes.
+</p>
+
+<p>
+    The license for the ant tasks is different than the license for the
+    rest of Cobertura (Apache Software License version 1.1 v. GPL
+    version 2).  The GPL prohibits linking GPL-licensed code with code
+    licensed under a GPL-incompatible license such as the Apache Software
+    License version 1.1.  For this reason, the Cobertura ant tasks do not
+    directly invoke the Cobertura classes.  Rather, they invoke a JVM which
+    runs the Cobertura classes.
+</p>
+
+</body>
\ No newline at end of file
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/check/CheckCoverageMain.java b/cobertura/src/main/java/net/sourceforge/cobertura/check/CheckCoverageMain.java
new file mode 100644
index 0000000..c90e33e
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/check/CheckCoverageMain.java
@@ -0,0 +1,166 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Nathan Wilson
+ * Copyright (C) 2009 Charlie Squires
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.check;
+
+import net.sourceforge.cobertura.dsl.Arguments;
+import net.sourceforge.cobertura.dsl.ArgumentsBuilder;
+import net.sourceforge.cobertura.dsl.Cobertura;
+import net.sourceforge.cobertura.reporting.CoverageThresholdsReport;
+import net.sourceforge.cobertura.reporting.ReportName;
+import net.sourceforge.cobertura.util.Header;
+import org.apache.oro.text.regex.MalformedPatternException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import static net.sourceforge.cobertura.check.CoverageResultEntry.CoverageType.BRANCH;
+
+public class CheckCoverageMain {
+	private static final Logger logger = LoggerFactory
+			.getLogger(CheckCoverageMain.class);
+
+	public CheckCoverageMain(String[] args) throws MalformedPatternException {
+		int exitStatus = checkCoverage(args);
+		System.exit(exitStatus);
+	}
+
+	private static int checkCoverageTypeStatusAndLogMessage(
+			CoverageResultEntry entry, int branchStatus, int lineStatus) {
+		if (entry.getCoverageType().equals(BRANCH)) {
+			logger
+					.error(entry.getName() +
+						   " failed coverage check. Branch coverage rate of "+
+						   percentage(entry.getCurrentCoverage()) +
+					       "% is below " +
+						   percentage(entry.getExpectedCoverage()) +
+						   "%");
+			return branchStatus;
+		} else {
+			logger
+					.error(entry.getName() +
+						   " failed coverage check. Line coverage rate of " +
+						   percentage(entry.getCurrentCoverage()) +
+					       "% is below " +
+						   percentage(entry.getExpectedCoverage()) +
+					       "%");
+			return lineStatus;
+		}
+	}
+
+	private static double inRangeAndDivideByOneHundred(
+			String coverageRateAsPercentage) {
+		return inRangeAndDivideByOneHundred(Integer
+				.valueOf(coverageRateAsPercentage));
+	}
+
+	private static double inRangeAndDivideByOneHundred(
+			int coverageRateAsPercentage) {
+		if ((coverageRateAsPercentage >= 0)
+				&& (coverageRateAsPercentage <= 100)) {
+			return (double) coverageRateAsPercentage / 100;
+		}
+		throw new IllegalArgumentException("The value "
+				+ coverageRateAsPercentage
+				+ "% is invalid.  Percentages must be between 0 and 100.");
+	}
+
+    private static String percentage(double coverateRate) {
+        BigDecimal decimal = new BigDecimal(coverateRate * 100);
+        return decimal.setScale(1, BigDecimal.ROUND_DOWN).toString();
+    }
+
+	public static int checkCoverage(String[] args)
+			throws MalformedPatternException {
+		Header.print(System.out);
+
+		ArgumentsBuilder builder = new ArgumentsBuilder();
+
+		for (int i = 0; i < args.length; i++) {
+			if (args[i].equals("--branch")) {
+				builder
+						.setClassBranchCoverageThreshold(inRangeAndDivideByOneHundred(args[++i]));
+			} else if (args[i].equals("--datafile")) {
+				builder.setDataFile(args[++i]);
+			} else if (args[i].equals("--line")) {
+				builder
+						.setClassLineCoverageThreshold(inRangeAndDivideByOneHundred(args[++i]));
+			} else if (args[i].equals("--regex")) {
+				StringTokenizer tokenizer = new StringTokenizer(args[++i], ":");
+				builder.addMinimumCoverageRates(tokenizer.nextToken(),
+						inRangeAndDivideByOneHundred(tokenizer.nextToken()),
+						inRangeAndDivideByOneHundred(tokenizer.nextToken()));
+			} else if (args[i].equals("--packagebranch")) {
+				builder
+						.setPackageBranchCoverageThreshold(inRangeAndDivideByOneHundred(args[++i]));
+			} else if (args[i].equals("--packageline")) {
+				builder
+						.setPackageLineCoverageThreshold(inRangeAndDivideByOneHundred(args[++i]));
+			} else if (args[i].equals("--totalbranch")) {
+				builder
+						.setTotalBranchCoverageThreshold(inRangeAndDivideByOneHundred(args[++i]));
+			} else if (args[i].equals("--totalline")) {
+				builder
+						.setTotalLineCoverageThreshold(inRangeAndDivideByOneHundred(args[++i]));
+			}
+		}
+
+		Arguments arguments = builder.build();
+
+		CoverageThresholdsReport coverageThresholdsReport = (CoverageThresholdsReport) new Cobertura(
+				arguments).checkThresholds().report().getByName(
+				ReportName.THRESHOLDS_REPORT);
+
+		List<CoverageResultEntry> coverageResultEntries = coverageThresholdsReport
+				.getCoverageResultEntries();
+		int exitStatus = 0;
+		for (CoverageResultEntry entry : coverageResultEntries) {
+			if (entry.isBelowExpectedCoverage()) {
+				switch (entry.getCoverageLevel()) {
+					case CLASS :
+						exitStatus |= checkCoverageTypeStatusAndLogMessage(
+								entry, 2, 4);
+						break;
+					case PACKAGE :
+						exitStatus |= checkCoverageTypeStatusAndLogMessage(
+								entry, 32, 64);
+						break;
+					case PROJECT :
+						exitStatus |= checkCoverageTypeStatusAndLogMessage(
+								entry, 8, 16);
+						break;
+				}
+			}
+		}
+		return exitStatus;
+	}
+
+	public static void main(String[] args) throws MalformedPatternException {
+		int exitStatus = checkCoverage(args);
+		System.exit(exitStatus);
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/check/CheckCoverageTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/check/CheckCoverageTask.java
new file mode 100644
index 0000000..344d508
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/check/CheckCoverageTask.java
@@ -0,0 +1,267 @@
+package net.sourceforge.cobertura.check;
+
+import net.sourceforge.cobertura.coveragedata.ClassData;
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.dsl.Arguments;
+import net.sourceforge.cobertura.reporting.CoverageThresholdsReport;
+import net.sourceforge.cobertura.reporting.Report;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.oro.text.regex.MalformedPatternException;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.Perl5Compiler;
+import org.apache.oro.text.regex.Perl5Matcher;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.*;
+
+import static net.sourceforge.cobertura.check.CoverageResultEntry.CoverageLevel.*;
+import static net.sourceforge.cobertura.check.CoverageResultEntry.CoverageType.BRANCH;
+import static net.sourceforge.cobertura.check.CoverageResultEntry.CoverageType.LINE;
+
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/**
+ * Checks if project meets the required coverage thresholds.
+ */
+public class CheckCoverageTask {
+
+	private static final Logger logger = LoggerFactory
+			.getLogger(CheckCoverageMain.class);
+
+	private final Perl5Matcher pm = new Perl5Matcher();
+
+	private final Perl5Compiler pc = new Perl5Compiler();
+
+	/**
+	 * The default CoverageRate needed for a class to pass the check.
+	 */
+	private CoverageRate minimumCoverageRate;
+
+	/**
+	 * The keys of this map contain regular expression Patterns that
+	 * match against classes.  The values of this map contain
+	 * CoverageRate objects that specify the minimum coverage rates
+	 * needed for a class that matches the pattern.
+	 */
+	private Map<Pattern, CoverageRate> minimumCoverageRates = new HashMap<Pattern, CoverageRate>();
+
+	/**
+	 * The keys of this map contain package names. The values of this
+	 * map contain PackageCoverage objects that track the line and
+	 * branch coverage values for a package.
+	 */
+	private Map<String, PackageCoverage> packageCoverageMap = new HashMap<String, PackageCoverage>();
+
+	/**
+	 * This method returns the CoverageRate object that
+	 * applies to the given class.  If checks if there is a
+	 * pattern that matches the class name, and returns that
+	 * if it finds one.  Otherwise it uses the global minimum
+	 * rates that were passed in.
+	 */
+	private CoverageRate findMinimumCoverageRate(String classname) {
+		for (Map.Entry<Pattern, CoverageRate> patternCoverageRateEntry : this.minimumCoverageRates
+				.entrySet()) {
+			Map.Entry entry = (Map.Entry) patternCoverageRateEntry;
+
+			if (pm.matches(classname, (Pattern) entry.getKey())) {
+				return (CoverageRate) entry.getValue();
+			}
+		}
+		return this.minimumCoverageRate;
+	}
+
+	public Report checkCoverage(Arguments arguments, ProjectData projectData) {
+		File dataFile = CoverageDataFileHandler.getDefaultDataFile();
+		double branchCoverageRate;
+		double lineCoverageRate;
+		double packageBranchCoverageRate;
+		double packageLineCoverageRate;
+		double totalBranchCoverageRate;
+		double totalLineCoverageRate;
+
+		branchCoverageRate = arguments.getClassBranchThreshold();
+		dataFile = arguments.getDataFile();
+		lineCoverageRate = arguments.getClassLineThreshold();
+		for (CoverageThreshold threshold : arguments
+				.getMinimumCoverageThresholds()) {
+			try {
+				this.minimumCoverageRates.put(pc.compile(threshold.getRegex()),
+						new CoverageRate(threshold.getMinBranchPercentage(),
+								threshold.getMinLinePercentage()));
+			} catch (MalformedPatternException e) {
+				logger.error(String.format("Got malformed regex expression %s",
+						threshold.getRegex()), e);
+			}
+		}
+		packageBranchCoverageRate = arguments.getPackageBranchThreshold();
+		packageLineCoverageRate = arguments.getPackageLineThreshold();
+		totalBranchCoverageRate = arguments.getTotalBranchThreshold();
+		totalLineCoverageRate = arguments.getTotalLineThreshold();
+
+		// If they didn't specify any thresholds, then use some defaults
+		if ((branchCoverageRate == -1.0) && (lineCoverageRate == -1.0)
+				&& (packageLineCoverageRate == -1.0)
+				&& (packageBranchCoverageRate == -1.0)
+				&& (totalLineCoverageRate == -1.0)
+				&& (totalBranchCoverageRate == -1.0)
+				&& (this.minimumCoverageRates.size() == 0)) {
+			branchCoverageRate = 0.5;
+			lineCoverageRate = 0.5;
+			packageBranchCoverageRate = 0.5;
+			packageLineCoverageRate = 0.5;
+			totalBranchCoverageRate = 0.5;
+			totalLineCoverageRate = 0.5;
+		}
+		// If they specified one or more thresholds, default everything else to 0
+		else {
+			if (branchCoverageRate == -1.0)
+				branchCoverageRate = 0.0;
+			if (lineCoverageRate == -1.0)
+				lineCoverageRate = 0.0;
+			if (packageLineCoverageRate == -1.0)
+				packageLineCoverageRate = 0.0;
+			if (packageBranchCoverageRate == -1.0)
+				packageBranchCoverageRate = 0.0;
+			if (totalLineCoverageRate == -1.0)
+				totalLineCoverageRate = 0.0;
+			if (totalBranchCoverageRate == -1.0)
+				totalBranchCoverageRate = 0.0;
+		}
+
+		this.minimumCoverageRate = new CoverageRate(lineCoverageRate,
+				branchCoverageRate);
+
+		double totalLines = 0;
+		double totalLinesCovered = 0;
+		double totalBranches = 0;
+		double totalBranchesCovered = 0;
+
+		Iterator iter = projectData.getClasses().iterator();
+		List<CoverageResultEntry> coverageResultEntries = new ArrayList<CoverageResultEntry>();
+		while (iter.hasNext()) {
+			ClassData classData = (ClassData) iter.next();
+			CoverageRate coverageRate = findMinimumCoverageRate(classData
+					.getName());
+
+			if (totalBranchCoverageRate > 0.0) {
+				totalBranches += classData.getNumberOfValidBranches();
+				totalBranchesCovered += classData.getNumberOfCoveredBranches();
+			}
+
+			if (totalLineCoverageRate > 0.0) {
+				totalLines += classData.getNumberOfValidLines();
+				totalLinesCovered += classData.getNumberOfCoveredLines();
+			}
+
+			PackageCoverage packageCoverage = getPackageCoverage(classData
+					.getPackageName());
+			if (packageBranchCoverageRate > 0.0) {
+				packageCoverage.addBranchCount(classData
+						.getNumberOfValidBranches());
+				packageCoverage.addBranchCoverage(classData
+						.getNumberOfCoveredBranches());
+			}
+
+			if (packageLineCoverageRate > 0.0) {
+				packageCoverage.addLineCount(classData.getNumberOfValidLines());
+				packageCoverage.addLineCoverage(classData
+						.getNumberOfCoveredLines());
+			}
+
+			logger.debug("Class " + classData.getName()
+					+ ", line coverage rate: "
+					+ percentage(classData.getLineCoverageRate())
+					+ "%, branch coverage rate: "
+					+ percentage(classData.getBranchCoverageRate()) + "%");
+
+			coverageResultEntries.add(new CoverageResultEntry(CLASS, BRANCH,
+					classData.getName(), classData.getBranchCoverageRate(),
+					coverageRate.getBranchCoverageRate()));
+
+			coverageResultEntries.add(new CoverageResultEntry(CLASS, LINE,
+					classData.getName(), classData.getLineCoverageRate(),
+					coverageRate.getLineCoverageRate()));
+		}
+
+		coverageResultEntries.addAll(checkPackageCoverageLevels(
+				packageBranchCoverageRate, packageLineCoverageRate));
+
+		// Check the rates for the overall project
+		coverageResultEntries.add(new CoverageResultEntry(PROJECT, BRANCH,
+				"project", totalBranchesCovered / totalBranches,
+				totalBranchCoverageRate));
+
+		coverageResultEntries.add(new CoverageResultEntry(PROJECT, LINE,
+				"project", totalLinesCovered / totalLines,
+				totalLineCoverageRate));
+
+		return new CoverageThresholdsReport(Collections
+				.unmodifiableList(coverageResultEntries));
+	}
+
+	private PackageCoverage getPackageCoverage(String packageName) {
+		PackageCoverage packageCoverage = packageCoverageMap.get(packageName);
+		if (packageCoverage == null) {
+			packageCoverage = new PackageCoverage();
+			packageCoverageMap.put(packageName, packageCoverage);
+		}
+		return packageCoverage;
+	}
+
+	private List<CoverageResultEntry> checkPackageCoverageLevels(
+			double packageBranchCoverageRate, double packageLineCoverageRate) {
+		for (Map.Entry<String, PackageCoverage> entry : packageCoverageMap
+				.entrySet()) {
+			String packageName = entry.getKey();
+			PackageCoverage packageCoverage = entry.getValue();
+
+			return checkPackageCoverage(packageBranchCoverageRate,
+					packageLineCoverageRate, packageName, packageCoverage);
+		}
+		return new ArrayList<CoverageResultEntry>();
+	}
+
+	private List<CoverageResultEntry> checkPackageCoverage(
+			double packageBranchCoverageRate, double packageLineCoverageRate,
+			String packageName, PackageCoverage packageCoverage) {
+		List<CoverageResultEntry> coverageResultEntries = new ArrayList<CoverageResultEntry>();
+
+		coverageResultEntries.add(new CoverageResultEntry(PACKAGE, BRANCH,
+				packageName, packageCoverage.getBranchCoverage()
+						/ packageCoverage.getBranchCount(),
+				packageBranchCoverageRate));
+
+		coverageResultEntries.add(new CoverageResultEntry(PACKAGE, LINE,
+				packageName, packageCoverage.getLineCoverage()
+						/ packageCoverage.getLineCount(),
+				packageLineCoverageRate));
+
+		return coverageResultEntries;
+	}
+
+	private String percentage(double coverateRate) {
+		BigDecimal decimal = new BigDecimal(coverateRate * 100);
+		return decimal.setScale(1, BigDecimal.ROUND_DOWN).toString();
+	}
+}
diff --git a/src/net/sourceforge/cobertura/check/CoverageRate.java b/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageRate.java
similarity index 87%
rename from src/net/sourceforge/cobertura/check/CoverageRate.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageRate.java
index 01033c7..2877aa7 100644
--- a/src/net/sourceforge/cobertura/check/CoverageRate.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageRate.java
@@ -1,46 +1,42 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.check;
-
-public class CoverageRate
-{
-
-	private final double lineCoverageRate;
-	private final double branchCoverageRate;
-
-	public CoverageRate(double lineCoverageRate, double branchCoverageRate)
-	{
-		this.lineCoverageRate = lineCoverageRate;
-		this.branchCoverageRate = branchCoverageRate;
-	}
-
-	public double getLineCoverageRate()
-	{
-		return lineCoverageRate;
-	}
-
-	public double getBranchCoverageRate()
-	{
-		return branchCoverageRate;
-	}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.check;
+
+public class CoverageRate {
+
+	private final double lineCoverageRate;
+	private final double branchCoverageRate;
+
+	public CoverageRate(double lineCoverageRate, double branchCoverageRate) {
+		this.lineCoverageRate = lineCoverageRate;
+		this.branchCoverageRate = branchCoverageRate;
+	}
+
+	public double getLineCoverageRate() {
+		return lineCoverageRate;
+	}
+
+	public double getBranchCoverageRate() {
+		return branchCoverageRate;
+	}
 }
\ No newline at end of file
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageResultEntry.java b/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageResultEntry.java
new file mode 100644
index 0000000..648f029
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageResultEntry.java
@@ -0,0 +1,55 @@
+package net.sourceforge.cobertura.check;
+
+/**
+ * Contains coverage information.
+ */
+public class CoverageResultEntry {
+
+	private CoverageLevel coverageLevel;
+	private CoverageType coverageType;
+	private String name;
+	private double currentCoverage;
+	private double expectedCoverage;
+
+	public CoverageResultEntry(CoverageLevel coverageLevel,
+			CoverageType coverageType, String name, double currentCoverage,
+			double expectedCoverage) {
+		this.coverageLevel = coverageLevel;
+		this.coverageType = coverageType;
+		this.name = name;
+		this.currentCoverage = currentCoverage;
+		this.expectedCoverage = expectedCoverage;
+	}
+
+	public CoverageLevel getCoverageLevel() {
+		return coverageLevel;
+	}
+
+	public CoverageType getCoverageType() {
+		return coverageType;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public double getCurrentCoverage() {
+		return currentCoverage;
+	}
+
+	public double getExpectedCoverage() {
+		return expectedCoverage;
+	}
+
+	public boolean isBelowExpectedCoverage() {
+		return getCurrentCoverage() < getExpectedCoverage();
+	}
+
+	enum CoverageLevel {
+		CLASS, PACKAGE, PROJECT;
+	}
+
+	enum CoverageType {
+		BRANCH, LINE;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageThreshold.java b/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageThreshold.java
new file mode 100644
index 0000000..c79de81
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/check/CoverageThreshold.java
@@ -0,0 +1,35 @@
+package net.sourceforge.cobertura.check;
+
+/**
+ * Holds data about coverage thresholds for given regexes
+ */
+public class CoverageThreshold {
+	private String regex;
+	private double minBranchPercentage;
+	private double minLinePercentage;
+
+	/**
+	 * Costructor
+	 * @param regex - a regex expression
+	 * @param minBranchPercentage -minimum expected branch coverage percentage
+	 * @param minLinePercentage -minimum expected line coverage percentage
+	 */
+	public CoverageThreshold(String regex, double minBranchPercentage,
+			double minLinePercentage) {
+		this.regex = regex;
+		this.minBranchPercentage = minBranchPercentage;
+		this.minLinePercentage = minLinePercentage;
+	}
+
+	public String getRegex() {
+		return regex;
+	}
+
+	public double getMinBranchPercentage() {
+		return minBranchPercentage;
+	}
+
+	public double getMinLinePercentage() {
+		return minLinePercentage;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/check/Main.java b/cobertura/src/main/java/net/sourceforge/cobertura/check/Main.java
new file mode 100644
index 0000000..886226e
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/check/Main.java
@@ -0,0 +1,57 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Nathan Wilson
+ * Copyright (C) 2009 Charlie Squires
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.check;
+
+import org.apache.oro.text.regex.MalformedPatternException;
+
+/**
+ * Deprecated wrapper class for the new CheckCoverageMain class.  It is only
+ * here to facilitate an orderly transition to the new class and will go
+ * away in a few releases
+ *
+ * @author Steven C. Saliman
+ */
+ at Deprecated
+public class Main {
+	public Main(String[] args) throws MalformedPatternException {
+		System.err.println("net.sourceforge.cobertura.check.Main is a deprecated class.");
+		System.err.println("Please use net.sourceforge.cobertura.check.CheckCoverageMain instead");
+		new CheckCoverageMain(args);
+	}
+
+	public static int checkCoverage(String[] args)
+			throws MalformedPatternException {
+		System.err.println("net.sourceforge.cobertura.check.Main is a deprecated class.");
+		System.err.println("Please use net.sourceforge.cobertura.check.CheckCoverageMain instead");
+		return CheckCoverageMain.checkCoverage(args);
+	}
+
+	public static void main(String[] args) throws MalformedPatternException {
+		System.err.println("net.sourceforge.cobertura.check.Main is a deprecated class.");
+		System.err.println("Please use net.sourceforge.cobertura.check.CheckCoverageMain instead");
+		int exitStatus = CheckCoverageMain.checkCoverage(args);
+		System.exit(exitStatus);
+	}
+}
diff --git a/src/net/sourceforge/cobertura/check/PackageCoverage.java b/cobertura/src/main/java/net/sourceforge/cobertura/check/PackageCoverage.java
similarity index 73%
rename from src/net/sourceforge/cobertura/check/PackageCoverage.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/check/PackageCoverage.java
index 525b351..59a87be 100644
--- a/src/net/sourceforge/cobertura/check/PackageCoverage.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/check/PackageCoverage.java
@@ -1,72 +1,63 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.check;
-
-public class PackageCoverage
-{
-
-	private double branchCount;
-	private double lineCount;
-	private double branchCoverage;
-	private double lineCoverage;
-
-	public double getBranchCount()
-	{
-		return branchCount;
-	}
-
-	public void addBranchCount(double branchCount)
-	{
-		this.branchCount += branchCount;
-	}
-
-	public double getLineCount()
-	{
-		return lineCount;
-	}
-
-	public void addLineCount(double lineCount)
-	{
-		this.lineCount += lineCount;
-	}
-
-	public double getBranchCoverage()
-	{
-		return branchCoverage;
-	}
-
-	public void addBranchCoverage(double branchCoverage)
-	{
-		this.branchCoverage += branchCoverage;
-	}
-
-	public double getLineCoverage()
-	{
-		return lineCoverage;
-	}
-
-	public void addLineCoverage(double lineCoverage)
-	{
-		this.lineCoverage += lineCoverage;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.check;
+
+public class PackageCoverage {
+
+	private double branchCount;
+	private double lineCount;
+	private double branchCoverage;
+	private double lineCoverage;
+
+	public double getBranchCount() {
+		return branchCount;
+	}
+
+	public void addBranchCount(double branchCount) {
+		this.branchCount += branchCount;
+	}
+
+	public double getLineCount() {
+		return lineCount;
+	}
+
+	public void addLineCount(double lineCount) {
+		this.lineCount += lineCount;
+	}
+
+	public double getBranchCoverage() {
+		return branchCoverage;
+	}
+
+	public void addBranchCoverage(double branchCoverage) {
+		this.branchCoverage += branchCoverage;
+	}
+
+	public double getLineCoverage() {
+		return lineCoverage;
+	}
+
+	public void addLineCoverage(double lineCoverage) {
+		this.lineCoverage += lineCoverage;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/BranchCoverageData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/BranchCoverageData.java
similarity index 94%
rename from src/net/sourceforge/cobertura/coveragedata/BranchCoverageData.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/BranchCoverageData.java
index 8d72bfa..a6a3406 100644
--- a/src/net/sourceforge/cobertura/coveragedata/BranchCoverageData.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/BranchCoverageData.java
@@ -1,42 +1,41 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-public interface BranchCoverageData
-{
-
-	double getBranchCoverageRate();
-
-	int getNumberOfCoveredBranches();
-
-	int getNumberOfValidBranches();
-
-	/**
-	 * Warning: This is generally implemented as a
-	 * "shallow" merge.  For our current use, this
-	 * should be fine, but in the future it may make
-	 * sense to modify the merge methods of the
-	 * various classes to do a deep copy of the
-	 * appropriate objects.
-	 */
-	void merge(BranchCoverageData coverageData);
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+public interface BranchCoverageData {
+
+	double getBranchCoverageRate();
+
+	int getNumberOfCoveredBranches();
+
+	int getNumberOfValidBranches();
+
+	/**
+	 * Warning: This is generally implemented as a
+	 * "shallow" merge.  For our current use, this
+	 * should be fine, but in the future it may make
+	 * sense to modify the merge methods of the
+	 * various classes to do a deep copy of the
+	 * appropriate objects.
+	 */
+	void merge(BranchCoverageData coverageData);
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/ClassData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/ClassData.java
similarity index 62%
rename from src/net/sourceforge/cobertura/coveragedata/ClassData.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/ClassData.java
index efe89ef..776143f 100644
--- a/src/net/sourceforge/cobertura/coveragedata/ClassData.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/ClassData.java
@@ -1,681 +1,543 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * <p>
- * ProjectData information is typically serialized to a file. An
- * instance of this class records coverage information for a single
- * class that has been instrumented.
- * </p>
- *
- * <p>
- * This class implements HasBeenInstrumented so that when cobertura
- * instruments itself, it will omit this class.  It does this to
- * avoid an infinite recursion problem because instrumented classes
- * make use of this class.
- * </p>
- */
-
-public class ClassData extends CoverageDataContainer
-	implements Comparable<ClassData>, HasBeenInstrumented 
-{
-
-	private static final long serialVersionUID = 5;
-
-	/**
-	 * Each key is a line number in this class, stored as an Integer object.
-	 * Each value is information about the line, stored as a LineData object.
-	 */
-	private Map<Integer,LineData> branches = new HashMap<Integer,LineData>();
-
-	private boolean containsInstrumentationInfo = false;
-
-	private Set<String> methodNamesAndDescriptors = new HashSet<String>();
-
-	private String name = null;
-
-	private String sourceFileName = null;
-
-	/**
-	 * @param name In the format "net.sourceforge.cobertura.coveragedata.ClassData"
-	 */
-	public ClassData(String name)
-	{
-		if (name == null)
-			throw new IllegalArgumentException(
-				"Class name must be specified.");
-		this.name = name;
-	}
-
-	public LineData addLine(int lineNumber, String methodName,
-			String methodDescriptor)
-	{
-		lock.lock();
-		try
-		{
-			LineData lineData = getLineData(lineNumber);
-			if (lineData == null)
-			{
-				lineData = new LineData(lineNumber);
-				// Each key is a line number in this class, stored as an Integer object.
-				// Each value is information about the line, stored as a LineData object.
-				children.put(new Integer(lineNumber), lineData);
-			}
-			lineData.setMethodNameAndDescriptor(methodName, methodDescriptor);
-	      
-			// methodName and methodDescriptor can be null when cobertura.ser with 
-			// no line information was loaded (or was not loaded at all).
-			if( methodName!=null && methodDescriptor!=null)
-				methodNamesAndDescriptors.add(methodName + methodDescriptor);
-			return lineData;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * This is required because we implement Comparable.
-	 */
-	public int compareTo(ClassData o)
-	{
-		return this.name.compareTo(o.name);
-	}
-
-	public boolean containsInstrumentationInfo()
-	{
-		lock.lock();
-		try
-		{
-			return this.containsInstrumentationInfo;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Returns true if the given object is an instance of the
-	 * ClassData class, and it contains the same data as this
-	 * class.
-	 */
-	public boolean equals(Object obj)
-	{
-		if (this == obj)
-			return true;
-		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
-			return false;
-
-		ClassData classData = (ClassData)obj;
-		getBothLocks(classData);
-		try
-		{
-			return super.equals(obj)
-				&& this.branches.equals(classData.branches)
-				&& this.methodNamesAndDescriptors
-					.equals(classData.methodNamesAndDescriptors)
-				&& this.name.equals(classData.name)
-				&& this.sourceFileName.equals(classData.sourceFileName);
-		}
-		finally
-		{
-			lock.unlock();
-			classData.lock.unlock();
-		}
-	}
-
-	public String getBaseName()
-	{
-		int lastDot = this.name.lastIndexOf('.');
-		if (lastDot == -1)
-		{
-			return this.name;
-		}
-		return this.name.substring(lastDot + 1);
-	}
-
-	/**
-	 * @return The branch coverage rate for a particular method.
-	 */
-	public double getBranchCoverageRate(String methodNameAndDescriptor)
-	{
-		int total = 0;
-		int covered = 0;
-
-		lock.lock();
-		try
-		{
-			for (Iterator<LineData> iter = branches.values().iterator(); iter.hasNext();) {
-				LineData next = (LineData) iter.next();
-				if (methodNameAndDescriptor.equals(next.getMethodName() + next.getMethodDescriptor()))
-				{
-					total += next.getNumberOfValidBranches();
-					covered += next.getNumberOfCoveredBranches();
-				}
-			}
-			if (total == 0) return 1.0;
-			return (double) covered / total;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public Collection<Integer> getBranches() 
-	{
-		lock.lock();
-		try
-		{
-			return Collections.unmodifiableCollection(branches.keySet());
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * @param lineNumber The source code line number.
-	 * @return The coverage of the line
-	 */
-	public LineData getLineCoverage(int lineNumber) 
-	{
-		Integer lineObject = new Integer(lineNumber);
-		lock.lock();
-		try
-		{
-			if (!children.containsKey(lineObject)) 
-			{
-				return null;
-			}
-	
-			return (LineData) children.get(lineObject);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * @return The line coverage rate for particular method
-	 */
-	public double getLineCoverageRate(String methodNameAndDescriptor) 
-	{
-		int total = 0;
-		int hits = 0;
-
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = children.values().iterator();
-			while (iter.hasNext()) 
-			{
-				LineData next = (LineData) iter.next();
-				if (methodNameAndDescriptor.equals(next.getMethodName() + next.getMethodDescriptor())) 
-				{
-					total++;
-					if (next.getHits() > 0) {
-						hits++;
-					}
-				}
-			}
-			if (total == 0) return 1d;
-			return (double) hits / total;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	private LineData getLineData(int lineNumber)
-	{
-		lock.lock();
-		try
-		{
-			return (LineData)children.get(Integer.valueOf(lineNumber));
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public SortedSet<CoverageData> getLines()
-	{
-		lock.lock();
-		try
-		{
-			return new TreeSet<CoverageData>(this.children.values());
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public Collection<CoverageData> getLines(String methodNameAndDescriptor)
-	{
-		Collection<CoverageData> lines = new HashSet<CoverageData>();
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = children.values().iterator();
-			while (iter.hasNext())
-			{
-				LineData next = (LineData)iter.next();
-				if (methodNameAndDescriptor.equals(next.getMethodName()
-						+ next.getMethodDescriptor()))
-				{
-					lines.add(next);
-				}
-			}
-			return lines;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * @return The method name and descriptor of each method found in the
-	 *         class represented by this instrumentation.
-	 */
-	public Set<String> getMethodNamesAndDescriptors() 
-	{
-		lock.lock();
-		try
-		{
-			return methodNamesAndDescriptors;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public String getName() 
-	{
-		return name;
-	}
-
-	/**
-	 * @return The number of branches in this class.
-	 */
-	public int getNumberOfValidBranches() 
-	{
-		int number = 0;
-		lock.lock();
-		try
-		{
-			for (Iterator<LineData> i = branches.values().iterator(); 
-				i.hasNext(); 
-				number += (i.next()).getNumberOfValidBranches())
-				;
-			return number;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * @see net.sourceforge.cobertura.coveragedata.CoverageData#getNumberOfCoveredBranches()
-	 */
-	public int getNumberOfCoveredBranches() 
-	{
-		int number = 0;
-		lock.lock();
-		try
-		{
-			for (Iterator<LineData> i = branches.values().iterator(); 
-				i.hasNext(); 
-				number += (i.next()).getNumberOfCoveredBranches())
-				;
-			return number;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public String getPackageName()
-	{
-		int lastDot = this.name.lastIndexOf('.');
-		if (lastDot == -1)
-		{
-			return "";
-		}
-		return this.name.substring(0, lastDot);
-	}
-
-	 /**
-	 * Return the name of the file containing this class.  If this
-	 * class' sourceFileName has not been set (for whatever reason)
-	 * then this method will attempt to infer the name of the source
-	 * file using the class name.
-	 *
-	 * @return The name of the source file, for example
-	 *         net/sourceforge/cobertura/coveragedata/ClassData.java
-	 */
-	public String getSourceFileName()
-	{
-		String baseName;
-		lock.lock();
-		try
-		{
-			if (sourceFileName != null)
-				baseName = sourceFileName;
-			else
-			{
-				baseName = getBaseName();
-				int firstDollarSign = baseName.indexOf('$');
-				if (firstDollarSign == -1 || firstDollarSign == 0)
-					baseName += ".java";
-				else
-					baseName = baseName.substring(0, firstDollarSign)
-						+ ".java";
-			}
-	
-			String packageName = getPackageName();
-			if (packageName.equals(""))
-				return baseName;
-			return packageName.replace('.', '/') + '/' + baseName;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int hashCode()
-	{
-		return this.name.hashCode();
-	}
-
-	/**
-	 * @return True if the line contains at least one condition jump (branch)
-	 */
-	public boolean hasBranch(int lineNumber) 
-	{
-		lock.lock();
-		try
-		{
-			return branches.containsKey(Integer.valueOf(lineNumber));
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Determine if a given line number is a valid line of code.
-	 *
-	 * @return True if the line contains executable code.  False
-	 *         if the line is empty, or a comment, etc.
-	 */
-	public boolean isValidSourceLineNumber(int lineNumber) 
-	{
-		lock.lock();
-		try
-		{
-			return children.containsKey(Integer.valueOf(lineNumber));
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public void addLineJump(int lineNumber, int branchNumber) 
-	{
-		lock.lock();
-		try
-		{
-			LineData lineData = getLineData(lineNumber);
-			if (lineData != null) 
-			{
-				lineData.addJump(branchNumber);
-				this.branches.put(Integer.valueOf(lineNumber), lineData);
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public void addLineSwitch(int lineNumber, int switchNumber, int[] keys) 
-	{
-		lock.lock();
-		try
-		{
-			LineData lineData = getLineData(lineNumber);
-			if (lineData != null) 
-			{
-				lineData.addSwitch(switchNumber, keys);
-				this.branches.put(Integer.valueOf(lineNumber), lineData);
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public void addLineSwitch(int lineNumber, int switchNumber, int min, int max) 
-	{
-		lock.lock();
-		try
-		{
-			LineData lineData = getLineData(lineNumber);
-			if (lineData != null) 
-			{
-				lineData.addSwitch(switchNumber, min, max);
-				this.branches.put(Integer.valueOf(lineNumber), lineData);
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Merge some existing instrumentation with this instrumentation.
-	 *
-	 * @param coverageData Some existing coverage data.
-	 */
-	public void merge(CoverageData coverageData)
-	{
-		ClassData classData = (ClassData)coverageData;
-
-		// If objects contain data for different classes then don't merge
-		if (!this.getName().equals(classData.getName()))
-			return;
-
-		getBothLocks(classData);
-		try
-		{
-			super.merge(coverageData);
-	
-			// We can't just call this.branches.putAll(classData.branches);
-			// Why not?  If we did a putAll, then the LineData objects from
-			// the coverageData class would overwrite the LineData objects
-			// that are already in "this.branches"  And we don't need to
-			// update the LineData objects that are already in this.branches
-			// because they are shared between this.branches and this.children,
-			// so the object hit counts will be moved when we called
-			// super.merge() above.
-			for (Iterator<Integer> iter = classData.branches.keySet().iterator(); iter.hasNext();)
-			{
-				Integer key = iter.next();
-				if (!this.branches.containsKey(key))
-				{
-					this.branches.put(key, classData.branches.get(key));
-				}
-			}
-	
-			this.containsInstrumentationInfo |= classData.containsInstrumentationInfo;
-			this.methodNamesAndDescriptors.addAll(classData
-					.getMethodNamesAndDescriptors());
-			if (classData.sourceFileName != null)
-				this.sourceFileName = classData.sourceFileName;
-		}
-		finally
-		{
-			lock.unlock();
-			classData.lock.unlock();
-		}
-	}
-
-	public void removeLine(int lineNumber)
-	{
-		Integer lineObject = Integer.valueOf(lineNumber);
-		lock.lock();
-		try
-		{
-			children.remove(lineObject);
-			branches.remove(lineObject);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public void setContainsInstrumentationInfo()
-	{
-		lock.lock();
-		try
-		{
-			this.containsInstrumentationInfo = true;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public void setSourceFileName(String sourceFileName)
-	{
-		lock.lock();
-		try
-		{
-			this.sourceFileName = sourceFileName;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Increment the number of hits for a particular line of code.
-	 *
-	 * @param lineNumber the line of code to increment the number of hits.
-	 * @param hits how many times the piece was called
-	 */
-	public void touch(int lineNumber,int hits)
-	{
-		lock.lock();
-		try
-		{
-			LineData lineData = getLineData(lineNumber);
-			if (lineData == null)
-				lineData = addLine(lineNumber, null, null);
-			lineData.touch(hits);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Increments the number of hits for particular hit counter of particular branch on particular line number.
-	 * 
-	 * @param lineNumber The line of code where the branch is
-	 * @param branchNumber  The branch on the line to change the hit counter
-	 * @param branch The hit counter (true or false)
-	 * @param hits how many times the piece was called
-	 */
-	public void touchJump(int lineNumber, int branchNumber, boolean branch,int hits) {
-		lock.lock();
-		try
-		{
-			LineData lineData = getLineData(lineNumber);
-			if (lineData == null)
-				lineData = addLine(lineNumber, null, null);
-			lineData.touchJump(branchNumber, branch,hits);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Increments the number of hits for particular hit counter of particular switch branch on particular line number.
-	 * 
-	 * @param lineNumber The line of code where the branch is
-	 * @param switchNumber  The switch on the line to change the hit counter
-	 * @param branch The hit counter 
-	 * @param hits how many times the piece was called  
-	 */
-	public void touchSwitch(int lineNumber, int switchNumber, int branch,int hits) {
-		lock.lock();
-		try
-		{
-			LineData lineData = getLineData(lineNumber);
-			if (lineData == null)
-				lineData = addLine(lineNumber, null, null);
-			lineData.touchSwitch(switchNumber, branch,hits);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+
+import java.util.*;
+
+/**
+ * <p>
+ * ProjectData information is typically serialized to a file. An
+ * instance of this class records coverage information for a single
+ * class that has been instrumented.
+ * </p>
+ */
+
+ at CoverageIgnore
+public class ClassData extends CoverageDataContainer
+		implements
+			Comparable<ClassData> {
+	private static final long serialVersionUID = 5;
+
+	/**
+	 * Each key is a line number in this class, stored as an Integer object.
+	 * Each value is information about the line, stored as a LineData object.
+	 */
+	private Map<Integer, LineData> branches = new HashMap<Integer, LineData>();
+
+	private boolean containsInstrumentationInfo = false;
+
+	private Set<String> methodNamesAndDescriptors = new HashSet<String>();
+
+	private String name = null;
+
+	private String sourceFileName = null;
+
+	public ClassData() {
+	}
+
+	/**
+	 * @param name In the format "net.sourceforge.cobertura.coveragedata.ClassData"
+	 */
+	public ClassData(String name) {
+		if (name == null)
+			throw new IllegalArgumentException("Class name must be specified.");
+		this.name = name;
+	}
+
+	public LineData addLine(int lineNumber, String methodName,
+			String methodDescriptor) {
+		lock.lock();
+		try {
+			LineData lineData = getLineData(lineNumber);
+			if (lineData == null) {
+				lineData = new LineData(lineNumber);
+				// Each key is a line number in this class, stored as an Integer object.
+				// Each value is information about the line, stored as a LineData object.
+				children.put(new Integer(lineNumber), lineData);
+			}
+			lineData.setMethodNameAndDescriptor(methodName, methodDescriptor);
+
+			// methodName and methodDescriptor can be null when cobertura.ser with
+			// no line information was loaded (or was not loaded at all).
+			if (methodName != null && methodDescriptor != null)
+				methodNamesAndDescriptors.add(methodName + methodDescriptor);
+			return lineData;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * This is required because we implement Comparable.
+	 */
+	public int compareTo(ClassData o) {
+		if (!o.getClass().equals(ClassData.class))
+			return Integer.MAX_VALUE;
+		return this.name.compareTo(((ClassData) o).name);
+	}
+
+	public boolean containsInstrumentationInfo() {
+		lock.lock();
+		try {
+			return this.containsInstrumentationInfo;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Returns true if the given object is an instance of the
+	 * ClassData class, and it contains the same data as this
+	 * class.
+	 */
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
+			return false;
+
+		ClassData classData = (ClassData) obj;
+		getBothLocks(classData);
+		try {
+			return super.equals(obj)
+					&& this.branches.equals(classData.branches)
+					&& this.methodNamesAndDescriptors
+							.equals(classData.methodNamesAndDescriptors)
+					&& this.name.equals(classData.name)
+					&& this.sourceFileName.equals(classData.sourceFileName);
+		} finally {
+			lock.unlock();
+			classData.lock.unlock();
+		}
+	}
+
+	public String getBaseName() {
+		int lastDot = this.name.lastIndexOf('.');
+		if (lastDot == -1) {
+			return this.name;
+		}
+		return this.name.substring(lastDot + 1);
+	}
+
+	/**
+	 * @return The branch coverage rate for a particular method.
+	 */
+	public double getBranchCoverageRate(String methodNameAndDescriptor) {
+		int total = 0;
+		int covered = 0;
+
+		lock.lock();
+		try {
+			for (Iterator<LineData> iter = branches.values().iterator(); iter
+					.hasNext();) {
+				LineData next = (LineData) iter.next();
+				if (methodNameAndDescriptor.equals(next.getMethodName()
+						+ next.getMethodDescriptor())) {
+					total += next.getNumberOfValidBranches();
+					covered += next.getNumberOfCoveredBranches();
+				}
+			}
+			if (total == 0)
+				return 1.0;
+			return (double) covered / total;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public Collection<Integer> getBranches() {
+		lock.lock();
+		try {
+			return Collections.unmodifiableCollection(branches.keySet());
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * @param lineNumber The source code line number.
+	 *
+	 * @return The coverage of the line
+	 */
+	public LineData getLineCoverage(int lineNumber) {
+		Integer lineObject = new Integer(lineNumber);
+		lock.lock();
+		try {
+			if (!children.containsKey(lineObject)) {
+				return null;
+			}
+
+			return (LineData) children.get(lineObject);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * @return The line coverage rate for particular method
+	 */
+	public double getLineCoverageRate(String methodNameAndDescriptor) {
+		int total = 0;
+		int hits = 0;
+
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = children.values().iterator();
+			while (iter.hasNext()) {
+				LineData next = (LineData) iter.next();
+				if (methodNameAndDescriptor.equals(next.getMethodName()
+						+ next.getMethodDescriptor())) {
+					total++;
+					if (next.getHits() > 0) {
+						hits++;
+					}
+				}
+			}
+			if (total == 0)
+				return 1d;
+			return (double) hits / total;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public LineData getLineData(int lineNumber) {
+		lock.lock();
+		try {
+			return (LineData) children.get(Integer.valueOf(lineNumber));
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public SortedSet<CoverageData> getLines() {
+		lock.lock();
+		try {
+			return new TreeSet<CoverageData>(this.children.values());
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public Collection<CoverageData> getLines(String methodNameAndDescriptor) {
+		Collection<CoverageData> lines = new HashSet<CoverageData>();
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = children.values().iterator();
+			while (iter.hasNext()) {
+				LineData next = (LineData) iter.next();
+				if (methodNameAndDescriptor.equals(next.getMethodName()
+						+ next.getMethodDescriptor())) {
+					lines.add(next);
+				}
+			}
+			return lines;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * @return The method name and descriptor of each method found in the
+	 *         class represented by this instrumentation.
+	 */
+	public Set<String> getMethodNamesAndDescriptors() {
+		lock.lock();
+		try {
+			return methodNamesAndDescriptors;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @return The number of branches in this class.
+	 */
+	public int getNumberOfValidBranches() {
+		int number = 0;
+		lock.lock();
+		try {
+			for (Iterator<LineData> i = branches.values().iterator(); i
+					.hasNext(); number += ((LineData) i.next())
+					.getNumberOfValidBranches());
+			return number;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * @see net.sourceforge.cobertura.coveragedata.CoverageData#getNumberOfCoveredBranches()
+	 */
+	public int getNumberOfCoveredBranches() {
+		int number = 0;
+		lock.lock();
+		try {
+			for (Iterator<LineData> i = branches.values().iterator(); i
+					.hasNext(); number += ((LineData) i.next())
+					.getNumberOfCoveredBranches());
+			return number;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public String getPackageName() {
+		int lastDot = this.name.lastIndexOf('.');
+		if (lastDot == -1) {
+			return "";
+		}
+		return this.name.substring(0, lastDot);
+	}
+
+	/**
+	 * Return the name of the file containing this class.  If this
+	 * class' sourceFileName has not been set (for whatever reason)
+	 * then this method will attempt to infer the name of the source
+	 * file using the class name.
+	 *
+	 * @return The name of the source file, for example
+	 *         net/sourceforge/cobertura/coveragedata/ClassData.java
+	 */
+	public String getSourceFileName() {
+		String baseName;
+		lock.lock();
+		try {
+			if (sourceFileName != null)
+				baseName = sourceFileName;
+			else {
+				baseName = getBaseName();
+				int firstDollarSign = baseName.indexOf('$');
+				if (firstDollarSign == -1 || firstDollarSign == 0)
+					baseName += ".java";
+				else
+					baseName = baseName.substring(0, firstDollarSign) + ".java";
+			}
+
+			String packageName = getPackageName();
+			if (packageName.equals(""))
+				return baseName;
+			return packageName.replace('.', '/') + '/' + baseName;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public int hashCode() {
+		return this.name.hashCode();
+	}
+
+	/**
+	 * @return True if the line contains at least one condition jump (branch)
+	 */
+	public boolean hasBranch(int lineNumber) {
+		lock.lock();
+		try {
+			return branches.containsKey(Integer.valueOf(lineNumber));
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Determine if a given line number is a valid line of code.
+	 *
+	 * @return True if the line contains executable code.  False
+	 *         if the line is empty, or a comment, etc.
+	 */
+	public boolean isValidSourceLineNumber(int lineNumber) {
+		lock.lock();
+		try {
+			return children.containsKey(Integer.valueOf(lineNumber));
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public void addLineJump(int lineNumber, int branchNumber) {
+		lock.lock();
+		try {
+			LineData lineData = getLineData(lineNumber);
+			if (lineData != null) {
+				lineData.addJump(branchNumber);
+				this.branches.put(Integer.valueOf(lineNumber), lineData);
+			}
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public void addLineSwitch(int lineNumber, int switchNumber, int min,
+			int max, int maxBranches) {
+		lock.lock();
+		try {
+			LineData lineData = getLineData(lineNumber);
+			if (lineData != null) {
+				lineData.addSwitch(switchNumber, min, max, maxBranches);
+				this.branches.put(Integer.valueOf(lineNumber), lineData);
+			}
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Merge some existing instrumentation with this instrumentation.
+	 *
+	 * @param coverageData Some existing coverage data.
+	 */
+	public void merge(CoverageData coverageData) {
+		ClassData classData = (ClassData) coverageData;
+
+		// If objects contain data for different classes then don't merge
+		if (!this.getName().equals(classData.getName()))
+			return;
+
+		getBothLocks(classData);
+		try {
+			super.merge(coverageData);
+
+			// We can't just call this.branches.putAll(classData.branches);
+			// Why not?  If we did a putAll, then the LineData objects from
+			// the coverageData class would overwrite the LineData objects
+			// that are already in "this.branches"  And we don't need to
+			// update the LineData objects that are already in this.branches
+			// because they are shared between this.branches and this.children,
+			// so the object hit counts will be moved when we called
+			// super.merge() above.
+			for (Iterator<Integer> iter = classData.branches.keySet()
+					.iterator(); iter.hasNext();) {
+				Integer key = iter.next();
+				if (!this.branches.containsKey(key)) {
+					this.branches.put(key, classData.branches.get(key));
+				}
+			}
+
+			this.containsInstrumentationInfo |= classData.containsInstrumentationInfo;
+			this.methodNamesAndDescriptors.addAll(classData
+					.getMethodNamesAndDescriptors());
+			if (classData.sourceFileName != null)
+				this.sourceFileName = classData.sourceFileName;
+		} finally {
+			lock.unlock();
+			classData.lock.unlock();
+		}
+	}
+
+	public void removeLine(int lineNumber) {
+		Integer lineObject = Integer.valueOf(lineNumber);
+		lock.lock();
+		try {
+			children.remove(lineObject);
+			branches.remove(lineObject);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public void setContainsInstrumentationInfo() {
+		lock.lock();
+		try {
+			this.containsInstrumentationInfo = true;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public void setSourceFileName(String sourceFileName) {
+		lock.lock();
+		try {
+			this.sourceFileName = sourceFileName;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Increment the number of hits for a particular line of code.
+	 *
+	 * @param lineNumber the line of code to increment the number of hits.
+	 * @param hits       how many times the piece was called
+	 */
+	public void touch(int lineNumber, int hits) {
+		lock.lock();
+		try {
+			LineData lineData = getLineData(lineNumber);
+			if (lineData == null)
+				lineData = addLine(lineNumber, null, null);
+			lineData.touch(hits);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Increments the number of hits for particular hit counter of particular branch on particular line number.
+	 *
+	 * @param lineNumber   The line of code where the branch is
+	 * @param branchNumber The branch on the line to change the hit counter
+	 * @param branch       The hit counter (true or false)
+	 * @param hits         how many times the piece was called
+	 */
+	public void touchJump(int lineNumber, int branchNumber, boolean branch,
+			int hits) {
+		lock.lock();
+		try {
+			LineData lineData = getLineData(lineNumber);
+			if (lineData == null)
+				lineData = addLine(lineNumber, null, null);
+			lineData.touchJump(branchNumber, branch, hits);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Increments the number of hits for particular hit counter of particular switch branch on particular line number.
+	 *
+	 * @param lineNumber   The line of code where the branch is
+	 * @param switchNumber The switch on the line to change the hit counter
+	 * @param branch       The hit counter
+	 * @param hits         how many times the piece was called
+	 */
+	public void touchSwitch(int lineNumber, int switchNumber, int branch,
+			int hits) {
+		lock.lock();
+		try {
+			LineData lineData = getLineData(lineNumber);
+			if (lineData == null)
+				lineData = addLine(lineNumber, null, null);
+			lineData.touchSwitch(switchNumber, branch, hits);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/CoverageData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageData.java
similarity index 94%
rename from src/net/sourceforge/cobertura/coveragedata/CoverageData.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageData.java
index 354c16d..13f833c 100644
--- a/src/net/sourceforge/cobertura/coveragedata/CoverageData.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageData.java
@@ -1,48 +1,47 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-public interface CoverageData
-{
-
-	double getBranchCoverageRate();
-
-	double getLineCoverageRate();
-
-	int getNumberOfCoveredBranches();
-
-	int getNumberOfCoveredLines();
-
-	int getNumberOfValidBranches();
-
-	int getNumberOfValidLines();
-
-	/**
-	 * Warning: This is generally implemented as a
-	 * "shallow" merge.  For our current use, this
-	 * should be fine, but in the future it may make
-	 * sense to modify the merge methods of the
-	 * various classes to do a deep copy of the
-	 * appropriate objects.
-	 */
-	void merge(CoverageData coverageData);
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+public interface CoverageData {
+
+	double getBranchCoverageRate();
+
+	double getLineCoverageRate();
+
+	int getNumberOfCoveredBranches();
+
+	int getNumberOfCoveredLines();
+
+	int getNumberOfValidBranches();
+
+	int getNumberOfValidLines();
+
+	/**
+	 * Warning: This is generally implemented as a
+	 * "shallow" merge.  For our current use, this
+	 * should be fine, but in the future it may make
+	 * sense to modify the merge methods of the
+	 * various classes to do a deep copy of the
+	 * appropriate objects.
+	 */
+	void merge(CoverageData coverageData);
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/CoverageDataContainer.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageDataContainer.java
similarity index 68%
rename from src/net/sourceforge/cobertura/coveragedata/CoverageDataContainer.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageDataContainer.java
index 66ad885..a10fa50 100644
--- a/src/net/sourceforge/cobertura/coveragedata/CoverageDataContainer.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageDataContainer.java
@@ -1,375 +1,328 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2005 Mark Sinke
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * <p>
- * Coverage data information is typically serialized to a file.
- * </p>
- *
- * <p>
- * This class implements HasBeenInstrumented so that when cobertura
- * instruments itself, it will omit this class.  It does this to
- * avoid an infinite recursion problem because instrumented classes
- * make use of this class.
- * </p>
- */
-public abstract class CoverageDataContainer
-		implements CoverageData, HasBeenInstrumented, Serializable
-{
-
-	private static final long serialVersionUID = 2;
-
-	protected transient Lock lock;
-
-	/**
-	 * Each key is the name of a child, usually stored as a String or
-	 * an Integer object.  Each value is information about the child,
-	 * stored as an object that implements the CoverageData interface.
-	 */
-	Map<Object,CoverageData> children = new HashMap<Object,CoverageData>();
-
-	public CoverageDataContainer()
-	{
-		initLock();
-	}
-	
-	private void initLock()
-	{
-		lock = new ReentrantLock();
-	}
-	
-	/**
-	 * Determine if this CoverageDataContainer is equal to
-	 * another one.  Subclasses should override this and
-	 * make sure they implement the hashCode method.
-	 *
-	 * @param obj An object to test for equality.
-	 * @return True if the objects are equal.
-	 */
-	public boolean equals(Object obj)
-	{
-		if (this == obj)
-			return true;
-		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
-			return false;
-
-		CoverageDataContainer coverageDataContainer = (CoverageDataContainer)obj;
-		lock.lock();
-		try
-		{
-			return this.children.equals(coverageDataContainer.children);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * @return The average branch coverage rate for all children
-	 *         in this container.
-	 */
-	public double getBranchCoverageRate()
-	{
-		int number = 0;
-		int numberCovered = 0;
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				CoverageData coverageContainer = iter.next();
-				number += coverageContainer.getNumberOfValidBranches();
-				numberCovered += coverageContainer.getNumberOfCoveredBranches();
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		if (number == 0)
-		{
-			// no branches, therefore 100% branch coverage.
-			return 1d;
-		}
-		return (double)numberCovered / number;
-	}
-
-	/**
-	 * Get a child from this container with the specified
-	 * key.
-	 * @param name The key used to lookup the child in the
-	 *        map.
-	 * @return The child object, if found, or null if not found.
-	 */
-	public CoverageData getChild(String name)
-	{
-		lock.lock();
-		try
-		{
-			return (CoverageData)this.children.get(name);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * @return The average line coverage rate for all children
-	 *         in this container.  This number will be a decimal
-	 *         between 0 and 1, inclusive.
-	 */
-	public double getLineCoverageRate()
-	{
-		int number = 0;
-		int numberCovered = 0;
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				CoverageData coverageContainer = iter.next();
-				number += coverageContainer.getNumberOfValidLines();
-				numberCovered += coverageContainer.getNumberOfCoveredLines();
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		if (number == 0)
-		{
-			// no lines, therefore 100% line coverage.
-			return 1d;
-		}
-		return (double)numberCovered / number;
-	}
-
-	/**
-	 * @return The number of children in this container.
-	 */
-	public int getNumberOfChildren()
-	{
-		lock.lock();
-		try
-		{
-			return this.children.size();
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int getNumberOfCoveredBranches()
-	{
-		int number = 0;
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				CoverageData coverageContainer = iter.next();
-				number += coverageContainer.getNumberOfCoveredBranches();
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return number;
-	}
-
-	public int getNumberOfCoveredLines()
-	{
-		int number = 0;
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				CoverageData coverageContainer = iter.next();
-				number += coverageContainer.getNumberOfCoveredLines();
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return number;
-	}
-
-	public int getNumberOfValidBranches()
-	{
-		int number = 0;
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				CoverageData coverageContainer = iter.next();
-				number += coverageContainer.getNumberOfValidBranches();
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return number;
-	}
-
-	public int getNumberOfValidLines()
-	{
-		int number = 0;
-		lock.lock();
-		try
-		{
-			Iterator<CoverageData> iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				CoverageData coverageContainer = iter.next();
-				number += coverageContainer.getNumberOfValidLines();
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return number;
-	}
-
-	/**
-	 * It is highly recommended that classes extending this
-	 * class override this hashCode method and generate a more
-	 * effective hash code.
-	 */
-	public int hashCode()
-	{
-		lock.lock();
-		try
-		{
-			return this.children.size();
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Merge two <code>CoverageDataContainer</code>s.
-	 *
-	 * @param coverageData The container to merge into this one.
-	 */
-	public void merge(CoverageData coverageData)
-	{
-		CoverageDataContainer container = (CoverageDataContainer)coverageData;
-		getBothLocks(container);
-		try
-		{
-			Iterator<Object> iter = container.children.keySet().iterator();
-			while (iter.hasNext())
-			{
-				Object key = iter.next();
-				CoverageData newChild = (CoverageData)container.children.get(key);
-				CoverageData existingChild = (CoverageData)this.children.get(key);
-				if (existingChild != null)
-				{
-					existingChild.merge(newChild);
-				}
-				else
-				{
-					// TODO: Shouldn't we be cloning newChild here?  I think so that
-					//       would be better... but we would need to override the
-					//       clone() method all over the place?
-					this.children.put(key, newChild);
-				}
-			}
-		}
-		finally
-		{
-			lock.unlock();
-			container.lock.unlock();
-		}
-	}
-
-	protected void getBothLocks(CoverageDataContainer other) {
-		/*
-		 * To prevent deadlock, we need to get both locks or none at all.
-		 * 
-		 * When this method returns, the thread will have both locks.
-		 * Make sure you unlock them!
-		 */
-		boolean myLock = false;
-		boolean otherLock = false;
-		while ((!myLock) || (!otherLock))
-		{
-			try
-			{
-				myLock = lock.tryLock();
-				otherLock = other.lock.tryLock();
-			}
-			finally
-			{
-				if ((!myLock) || (!otherLock))
-				{
-					//could not obtain both locks - so unlock the one we got.
-					if (myLock)
-					{
-						lock.unlock();
-					}
-					if (otherLock)
-					{
-						other.lock.unlock();
-					}
-					//do a yield so the other threads will get to work.
-					Thread.yield();
-				}
-			}
-		}
-	}
-
-	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
-	{
-		in.defaultReadObject();
-		initLock();
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2005 Mark Sinke
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * <p>
+ * Coverage data information is typically serialized to a file.
+ * </p>
+ */
+ at CoverageIgnore
+public abstract class CoverageDataContainer
+		implements
+			CoverageData,
+			Serializable {
+
+	private static final long serialVersionUID = 2;
+
+	protected transient Lock lock;
+
+	/**
+	 * Each key is the name of a child, usually stored as a String or
+	 * an Integer object.  Each value is information about the child,
+	 * stored as an object that implements the CoverageData interface.
+	 */
+	Map<Object, CoverageData> children = new HashMap<Object, CoverageData>();
+
+	public CoverageDataContainer() {
+		initLock();
+	}
+
+	private void initLock() {
+		lock = new ReentrantLock();
+	}
+
+	/**
+	 * Determine if this CoverageDataContainer is equal to
+	 * another one.  Subclasses should override this and
+	 * make sure they implement the hashCode method.
+	 *
+	 * @param obj An object to test for equality.
+	 *
+	 * @return True if the objects are equal.
+	 */
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
+			return false;
+
+		synchronizeState();
+		CoverageDataContainer coverageDataContainer = (CoverageDataContainer) obj;
+		coverageDataContainer.synchronizeState();
+		lock.lock();
+		try {
+			return this.children.equals(coverageDataContainer.children);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * @return The average branch coverage rate for all children
+	 *         in this container.
+	 */
+	public double getBranchCoverageRate() {
+		synchronizeState();
+		int number = 0;
+		int numberCovered = 0;
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				CoverageData coverageContainer = (CoverageData) iter.next();
+				number += coverageContainer.getNumberOfValidBranches();
+				numberCovered += coverageContainer.getNumberOfCoveredBranches();
+			}
+		} finally {
+			lock.unlock();
+		}
+		if (number == 0) {
+			// no branches, therefore 100% branch coverage.
+			return 1d;
+		}
+		return (double) numberCovered / number;
+	}
+
+	/**
+	 * Get a child from this container with the specified
+	 * key.
+	 *
+	 * @param name The key used to lookup the child in the
+	 *             map.
+	 *
+	 * @return The child object, if found, or null if not found.
+	 */
+	public CoverageData getChild(String name) {
+		lock.lock();
+		try {
+			return (CoverageData) this.children.get(name);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * @return The average line coverage rate for all children
+	 *         in this container.  This number will be a decimal
+	 *         between 0 and 1, inclusive.
+	 */
+	public double getLineCoverageRate() {
+		synchronizeState();
+		int number = 0;
+		int numberCovered = 0;
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				CoverageData coverageContainer = (CoverageData) iter.next();
+				number += coverageContainer.getNumberOfValidLines();
+				numberCovered += coverageContainer.getNumberOfCoveredLines();
+			}
+		} finally {
+			lock.unlock();
+		}
+		if (number == 0) {
+			// no lines, therefore 100% line coverage.
+			return 1d;
+		}
+		return (double) numberCovered / number;
+	}
+
+	/**
+	 * @return The number of children in this container.
+	 */
+	public int getNumberOfChildren() {
+		synchronizeState();
+		lock.lock();
+		try {
+			return this.children.size();
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public int getNumberOfCoveredBranches() {
+		synchronizeState();
+		int number = 0;
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				CoverageData coverageContainer = (CoverageData) iter.next();
+				number += coverageContainer.getNumberOfCoveredBranches();
+			}
+		} finally {
+			lock.unlock();
+		}
+		return number;
+	}
+
+	public int getNumberOfCoveredLines() {
+		synchronizeState();
+		int number = 0;
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				CoverageData coverageContainer = (CoverageData) iter.next();
+				number += coverageContainer.getNumberOfCoveredLines();
+			}
+		} finally {
+			lock.unlock();
+		}
+		return number;
+	}
+
+	public int getNumberOfValidBranches() {
+		synchronizeState();
+		int number = 0;
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				CoverageData coverageContainer = (CoverageData) iter.next();
+				number += coverageContainer.getNumberOfValidBranches();
+			}
+		} finally {
+			lock.unlock();
+		}
+		return number;
+	}
+
+	public int getNumberOfValidLines() {
+		synchronizeState();
+		int number = 0;
+		lock.lock();
+		try {
+			Iterator<CoverageData> iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				CoverageData coverageContainer = (CoverageData) iter.next();
+				number += coverageContainer.getNumberOfValidLines();
+			}
+		} finally {
+			lock.unlock();
+		}
+		return number;
+	}
+
+	/**
+	 * It is highly recommended that classes extending this
+	 * class override this hashCode method and generate a more
+	 * effective hash code.
+	 */
+	public int hashCode() {
+		synchronizeState();
+		lock.lock();
+		try {
+			return this.children.size();
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Merge two <code>CoverageDataContainer</code>s.
+	 *
+	 * @param coverageData The container to merge into this one.
+	 */
+	public void merge(CoverageData coverageData) {
+		synchronizeState();
+		CoverageDataContainer container = (CoverageDataContainer) coverageData;
+		container.synchronizeState();
+		getBothLocks(container);
+		try {
+			Iterator<Object> iter = container.children.keySet().iterator();
+			while (iter.hasNext()) {
+				Object key = iter.next();
+				CoverageData newChild = (CoverageData) container.children
+						.get(key);
+				CoverageData existingChild = (CoverageData) this.children
+						.get(key);
+				if (existingChild != null) {
+					existingChild.merge(newChild);
+				} else {
+					// TODO: Shouldn't we be cloning newChild here?  I think so that
+					//       would be better... but we would need to override the
+					//       clone() method all over the place?
+					this.children.put(key, newChild);
+				}
+			}
+		} finally {
+			lock.unlock();
+			container.lock.unlock();
+		}
+	}
+
+	protected void getBothLocks(CoverageDataContainer other) {
+		/*
+		 * To prevent deadlock, we need to get both locks or none at all.
+		 * 
+		 * When this method returns, the thread will have both locks.
+		 * Make sure you unlock them!
+		 */
+		boolean myLock = false;
+		boolean otherLock = false;
+		while ((!myLock) || (!otherLock)) {
+			try {
+				myLock = lock.tryLock();
+				otherLock = other.lock.tryLock();
+			} finally {
+				if ((!myLock) || (!otherLock)) {
+					//could not obtain both locks - so unlock the one we got.
+					if (myLock) {
+						lock.unlock();
+					}
+					if (otherLock) {
+						other.lock.unlock();
+					}
+					//do a yield so the other threads will get to work.
+					Thread.yield();
+				}
+			}
+		}
+	}
+
+	private void readObject(ObjectInputStream in) throws IOException,
+			ClassNotFoundException {
+		in.defaultReadObject();
+		initLock();
+	}
+
+	public void synchronizeState() {
+
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandler.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandler.java
new file mode 100644
index 0000000..77494d9
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandler.java
@@ -0,0 +1,152 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2007 Joakim Erdfelt
+ * Copyright (C) 2007 Ignat Zapolsky
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.util.ConfigurationUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.util.Arrays;
+
+/**
+ * This contains methods used for reading and writing the
+ * "cobertura.ser" file.
+ */
+ at CoverageIgnore
+public abstract class CoverageDataFileHandler {
+	private static final Logger logger = LoggerFactory
+			.getLogger(CoverageDataFileHandler.class);
+	private static File defaultFile = null;
+
+	public static File getDefaultDataFile() {
+		// return cached defaultFile
+		if (defaultFile != null) {
+			return defaultFile;
+		}
+
+		// load and cache datafile configuration
+		ConfigurationUtil config = new ConfigurationUtil();
+		defaultFile = new File(config.getDatafile());
+
+		return defaultFile;
+	}
+
+	public static ProjectData loadCoverageData(File dataFile) {
+		InputStream is = null;
+		try {
+			is = new BufferedInputStream(new FileInputStream(dataFile), 16384);
+			return loadCoverageData(is);
+		} catch (IOException e) {
+			logger.error("Cobertura: Error reading file "
+					+ dataFile.getAbsolutePath() + ": "
+					+ e.getLocalizedMessage(), e);
+			return null;
+		} finally {
+			if (is != null)
+				try {
+					is.close();
+				} catch (IOException e) {
+					logger.error("Cobertura: Error closing file "
+							+ dataFile.getAbsolutePath() + ": "
+							+ e.getLocalizedMessage(), e);
+				}
+		}
+	}
+	private static ProjectData loadCoverageData(InputStream dataFile)
+			throws IOException {
+		ObjectInputStream objects = null;
+
+		try {
+			objects = new ObjectInputStream(dataFile);
+			ProjectData projectData = (ProjectData) objects.readObject();
+			logger.info("Cobertura: Loaded information on "
+					+ projectData.getNumberOfClasses() + " classes.");
+
+			return projectData;
+		} catch (IOException e) {
+			throw e;
+		} catch (Exception e) {
+			logger.error("Cobertura: Error reading from object stream.", e);
+			return null;
+		} finally {
+			if (objects != null) {
+				try {
+					objects.close();
+				} catch (IOException e) {
+					logger.error("Cobertura: Error closing object stream.");
+				}
+			}
+		}
+	}
+
+	public static void saveCoverageData(ProjectData projectData, File dataFile) {
+		FileOutputStream os = null;
+
+		try {
+			File dataDir = dataFile.getParentFile();
+			if ((dataDir != null) && !dataDir.exists()) {
+				dataDir.mkdirs();
+			}
+			os = new FileOutputStream(dataFile);
+			saveCoverageData(projectData, os);
+		} catch (IOException e) {
+			logger.error("Cobertura: Error writing file "
+					+ dataFile.getAbsolutePath(), e);
+		} finally {
+			if (os != null) {
+				try {
+					os.close();
+				} catch (IOException e) {
+					logger.error("Cobertura: Error closing file "
+							+ dataFile.getAbsolutePath(), e);
+				}
+			}
+		}
+	}
+
+	private static void saveCoverageData(ProjectData projectData,
+			OutputStream dataFile) {
+		ObjectOutputStream objects = null;
+
+		try {
+			objects = new ObjectOutputStream(dataFile);
+			objects.writeObject(projectData);
+			logger.info("Cobertura: Saved information on "
+					+ projectData.getNumberOfClasses() + " classes.");
+		} catch (IOException e) {
+			logger.error("Cobertura: Error writing to object stream.", e);
+		} finally {
+			if (objects != null) {
+				try {
+					objects.close();
+				} catch (IOException e) {
+					logger.error("Cobertura: Error closing object stream.", e);
+				}
+			}
+		}
+	}
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/JumpData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/JumpData.java
similarity index 64%
rename from src/net/sourceforge/cobertura/coveragedata/JumpData.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/JumpData.java
index e127b35..609427f 100644
--- a/src/net/sourceforge/cobertura/coveragedata/JumpData.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/JumpData.java
@@ -1,238 +1,195 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * <p>
- * This class implements HasBeenInstrumented so that when cobertura instruments
- * itself, it will omit this class. It does this to avoid an infinite recursion
- * problem because instrumented classes make use of this class.
- * </p>
- */
-public class JumpData implements BranchCoverageData, Comparable, Serializable,
-		HasBeenInstrumented
-{
-	private static final long serialVersionUID = 8;
-
-	protected transient Lock lock;
-
-	private int conditionNumber;
-
-	private long trueHits;
-
-	private long falseHits;
-
-	JumpData(int conditionNumber)
-	{
-		super();
-		this.conditionNumber = conditionNumber;
-		this.trueHits = 0L;
-		this.falseHits = 0L;
-		initLock();
-	}
-	
-	private void initLock()
-	{
-		lock = new ReentrantLock();
-	}
-
-	public int compareTo(Object o)
-	{
-		if (!o.getClass().equals(JumpData.class))
-			return Integer.MAX_VALUE;
-		return this.conditionNumber - ((JumpData) o).conditionNumber;
-	}
-
-	void touchBranch(boolean branch,int new_hits)
-	{
-		lock.lock();
-		try
-		{
-			if (branch)
-			{
-				this.trueHits+=new_hits;
-			}
-			else
-			{
-				this.falseHits+=new_hits;
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int getConditionNumber()
-	{
-		return this.conditionNumber;
-	}
-
-	public long getTrueHits()
-	{
-		lock.lock();
-		try
-		{
-			return this.trueHits;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public long getFalseHits()
-	{
-		lock.lock();
-		try
-		{
-			return this.falseHits;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public double getBranchCoverageRate()
-	{
-		lock.lock();
-		try
-		{
-			return ((double) getNumberOfCoveredBranches()) / getNumberOfValidBranches();
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public boolean equals(Object obj)
-	{
-		if (this == obj)
-			return true;
-		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
-			return false;
-
-		JumpData branchData = (JumpData) obj;
-		getBothLocks(branchData);
-		try
-		{
-			return (this.trueHits == branchData.trueHits)
-					&& (this.falseHits == branchData.falseHits)
-					&& (this.conditionNumber == branchData.conditionNumber);
-		}
-		finally
-		{
-			lock.unlock();
-			branchData.lock.unlock();
-		}
-	}
-
-	public int hashCode()
-	{
-		return this.conditionNumber;
-	}
-
-	public int getNumberOfCoveredBranches()
-	{
-		lock.lock();
-		try
-		{
-			return ((trueHits > 0) ? 1 : 0) + ((falseHits > 0) ? 1: 0);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int getNumberOfValidBranches()
-	{
-		return 2;
-	}
-
-	public void merge(BranchCoverageData coverageData)
-	{
-		JumpData jumpData = (JumpData) coverageData;
-		getBothLocks(jumpData);
-		try
-		{
-			this.trueHits += jumpData.trueHits;
-			this.falseHits += jumpData.falseHits;
-		}
-		finally
-		{
-			lock.unlock();
-			jumpData.lock.unlock();
-		}
-	}
-
-	private void getBothLocks(JumpData other) {
-		/*
-		 * To prevent deadlock, we need to get both locks or none at all.
-		 * 
-		 * When this method returns, the thread will have both locks.
-		 * Make sure you unlock them!
-		 */
-		boolean myLock = false;
-		boolean otherLock = false;
-		while ((!myLock) || (!otherLock))
-		{
-			try
-			{
-				myLock = lock.tryLock();
-				otherLock = other.lock.tryLock();
-			}
-			finally
-			{
-				if ((!myLock) || (!otherLock))
-				{
-					//could not obtain both locks - so unlock the one we got.
-					if (myLock)
-					{
-						lock.unlock();
-					}
-					if (otherLock)
-					{
-						other.lock.unlock();
-					}
-					//do a yield so the other threads will get to work.
-					Thread.yield();
-				}
-			}
-		}
-	}
-	
-	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
-	{
-		in.defaultReadObject();
-		initLock();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ */
+ at CoverageIgnore
+public class JumpData
+		implements
+			BranchCoverageData,
+			Comparable<Object>,
+			Serializable {
+	private static final long serialVersionUID = 8;
+
+	protected transient Lock lock;
+
+	private int conditionNumber;
+
+	private long trueHits;
+
+	private long falseHits;
+
+	JumpData(int conditionNumber) {
+		super();
+		this.conditionNumber = conditionNumber;
+		this.trueHits = 0L;
+		this.falseHits = 0L;
+		initLock();
+	}
+
+	private void initLock() {
+		lock = new ReentrantLock();
+	}
+
+	public int compareTo(Object o) {
+		if (!o.getClass().equals(JumpData.class))
+			return Integer.MAX_VALUE;
+		return this.conditionNumber - ((JumpData) o).conditionNumber;
+	}
+
+	void touchBranch(boolean branch, int new_hits) {
+		lock.lock();
+		try {
+			if (branch) {
+				this.trueHits += new_hits;
+			} else {
+				this.falseHits += new_hits;
+			}
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public int getConditionNumber() {
+		return this.conditionNumber;
+	}
+
+	public long getTrueHits() {
+		lock.lock();
+		try {
+			return this.trueHits;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public long getFalseHits() {
+		lock.lock();
+		try {
+			return this.falseHits;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public double getBranchCoverageRate() {
+		lock.lock();
+		try {
+			return ((double) getNumberOfCoveredBranches())
+					/ getNumberOfValidBranches();
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
+			return false;
+
+		JumpData branchData = (JumpData) obj;
+		getBothLocks(branchData);
+		try {
+			return (this.trueHits == branchData.trueHits)
+					&& (this.falseHits == branchData.falseHits)
+					&& (this.conditionNumber == branchData.conditionNumber);
+		} finally {
+			lock.unlock();
+			branchData.lock.unlock();
+		}
+	}
+
+	public int hashCode() {
+		return this.conditionNumber;
+	}
+
+	public int getNumberOfCoveredBranches() {
+		lock.lock();
+		try {
+			return ((trueHits > 0) ? 1 : 0) + ((falseHits > 0) ? 1 : 0);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public int getNumberOfValidBranches() {
+		return 2;
+	}
+
+	public void merge(BranchCoverageData coverageData) {
+		JumpData jumpData = (JumpData) coverageData;
+		getBothLocks(jumpData);
+		try {
+			this.trueHits += jumpData.trueHits;
+			this.falseHits += jumpData.falseHits;
+		} finally {
+			lock.unlock();
+			jumpData.lock.unlock();
+		}
+	}
+
+	private void getBothLocks(JumpData other) {
+		/*
+		 * To prevent deadlock, we need to get both locks or none at all.
+		 * 
+		 * When this method returns, the thread will have both locks.
+		 * Make sure you unlock them!
+		 */
+		boolean myLock = false;
+		boolean otherLock = false;
+		while ((!myLock) || (!otherLock)) {
+			try {
+				myLock = lock.tryLock();
+				otherLock = other.lock.tryLock();
+			} finally {
+				if ((!myLock) || (!otherLock)) {
+					//could not obtain both locks - so unlock the one we got.
+					if (myLock) {
+						lock.unlock();
+					}
+					if (otherLock) {
+						other.lock.unlock();
+					}
+					//do a yield so the other threads will get to work.
+					Thread.yield();
+				}
+			}
+		}
+	}
+
+	private void readObject(ObjectInputStream in) throws IOException,
+			ClassNotFoundException {
+		in.defaultReadObject();
+		initLock();
+	}
+
+}
diff --git a/examples/functionaltest1/src/test/second/A.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/LightClassmapListener.java
similarity index 64%
copy from examples/functionaltest1/src/test/second/A.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/LightClassmapListener.java
index 346d7a6..24c9751 100644
--- a/examples/functionaltest1/src/test/second/A.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/LightClassmapListener.java
@@ -1,55 +1,43 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.second;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-public class A
-{
-
-	public void call()
-	{
-		someMethod();
-	}
-
-	public void dontCall()
-	{
-		someMethod();
-	}
-
-	public static void someMethod()
-	{
-		String a = null;
-		String b = null;
-
-		a = b;
-		b = a;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+public interface LightClassmapListener {
+	public void setClazz(Class<?> clazz);
+
+	public void setClazz(String clazz);
+
+	public void setSource(String source);
+
+	public void putLineTouchPoint(int classLine, int counterId,
+			String methodName, String methodDescription);
+
+	public void putJumpTouchPoint(int classLine, int trueCounterId,
+			int falseCounterId);
+
+	public void putSwitchTouchPoint(int classLine, int maxBranches,
+			int... counterIds);
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/LineData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/LineData.java
new file mode 100644
index 0000000..022dfc5
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/LineData.java
@@ -0,0 +1,289 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Mark Sinke
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.util.StringUtil;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+ at CoverageIgnore
+public class LineData implements Comparable<Object>, CoverageData, Serializable {
+	private static final long serialVersionUID = 4;
+
+	private long hits;
+	private List<JumpData> jumps;
+	private List<SwitchData> switches;
+	private final int lineNumber;
+	private String methodDescriptor;
+	private String methodName;
+
+	LineData(int lineNumber) {
+		this(lineNumber, null, null);
+	}
+
+	LineData(int lineNumber, String methodName, String methodDescriptor) {
+		this.hits = 0;
+		this.jumps = null;
+		this.lineNumber = lineNumber;
+		this.methodName = methodName;
+		this.methodDescriptor = methodDescriptor;
+	}
+
+	/**
+	 * This is required because we implement Comparable.
+	 */
+	public int compareTo(Object o) {
+		if (!o.getClass().equals(LineData.class))
+			return Integer.MAX_VALUE;
+		return this.lineNumber - ((LineData) o).lineNumber;
+	}
+
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
+			return false;
+
+		LineData lineData = (LineData) obj;
+		return (this.hits == lineData.hits)
+				&& ((this.jumps == lineData.jumps) || ((this.jumps != null) && (this.jumps
+						.equals(lineData.jumps))))
+				&& ((this.switches == lineData.switches) || ((this.switches != null) && (this.switches
+						.equals(lineData.switches))))
+				&& (this.lineNumber == lineData.lineNumber)
+				&& (this.methodDescriptor.equals(lineData.methodDescriptor))
+				&& (this.methodName.equals(lineData.methodName));
+	}
+
+	public double getBranchCoverageRate() {
+		if (getNumberOfValidBranches() == 0)
+			return 1d;
+		return ((double) getNumberOfCoveredBranches())
+				/ getNumberOfValidBranches();
+	}
+
+	public String getConditionCoverage() {
+		StringBuffer ret = new StringBuffer();
+		if (getNumberOfValidBranches() == 0) {
+			ret.append(StringUtil.getPercentValue(1.0));
+		} else {
+			ret.append(StringUtil.getPercentValue(getBranchCoverageRate()));
+			ret.append(" (").append(getNumberOfCoveredBranches()).append("/")
+					.append(getNumberOfValidBranches()).append(")");
+		}
+		return ret.toString();
+	}
+
+	public long getHits() {
+		return hits;
+	}
+
+	synchronized public boolean isCovered() {
+		return (getHits() > 0)
+				&& ((getNumberOfValidBranches() == 0) || ((1.0 - getBranchCoverageRate()) < 0.0001));
+	}
+
+	public double getLineCoverageRate() {
+		return (getHits() > 0) ? 1 : 0;
+	}
+
+	public int getLineNumber() {
+		return lineNumber;
+	}
+
+	public String getMethodDescriptor() {
+		return methodDescriptor;
+	}
+
+	public String getMethodName() {
+		return methodName;
+	}
+
+	public int getNumberOfCoveredLines() {
+		return (getHits() > 0) ? 1 : 0;
+	}
+
+	public int getNumberOfValidBranches() {
+		int ret = 0;
+		if (jumps != null)
+			for (int i = jumps.size() - 1; i >= 0; i--)
+				ret += ((JumpData) jumps.get(i)).getNumberOfValidBranches();
+		if (switches != null)
+			for (int i = switches.size() - 1; i >= 0; i--)
+				ret += ((SwitchData) switches.get(i))
+						.getNumberOfValidBranches();
+		return ret;
+	}
+
+	public int getNumberOfCoveredBranches() {
+		int ret = 0;
+		if (jumps != null)
+			for (int i = jumps.size() - 1; i >= 0; i--)
+				ret += ((JumpData) jumps.get(i)).getNumberOfCoveredBranches();
+		if (switches != null)
+			for (int i = switches.size() - 1; i >= 0; i--)
+				ret += ((SwitchData) switches.get(i))
+						.getNumberOfCoveredBranches();
+		return ret;
+	}
+
+	public int getNumberOfValidLines() {
+		return 1;
+	}
+
+	public int hashCode() {
+		return this.lineNumber;
+	}
+
+	public boolean hasBranch() {
+		return (jumps != null) || (switches != null);
+	}
+
+	synchronized public void merge(CoverageData coverageData) {
+		LineData lineData = (LineData) coverageData;
+		this.hits += lineData.hits;
+		if (lineData.jumps != null)
+			if (this.jumps == null)
+				this.jumps = lineData.jumps;
+			else {
+				for (int i = Math.min(this.jumps.size(), lineData.jumps.size()) - 1; i >= 0; i--)
+					((JumpData) this.jumps.get(i))
+							.merge((JumpData) lineData.jumps.get(i));
+				for (int i = Math.min(this.jumps.size(), lineData.jumps.size()); i < lineData.jumps
+						.size(); i++)
+					this.jumps.add(lineData.jumps.get(i));
+			}
+		if (lineData.switches != null)
+			if (this.switches == null)
+				this.switches = lineData.switches;
+			else {
+				for (int i = Math.min(this.switches.size(), lineData.switches
+						.size()) - 1; i >= 0; i--)
+					((SwitchData) this.switches.get(i))
+							.merge((SwitchData) lineData.switches.get(i));
+				for (int i = Math.min(this.switches.size(), lineData.switches
+						.size()); i < lineData.switches.size(); i++)
+					this.switches.add(lineData.switches.get(i));
+			}
+		if (lineData.methodName != null)
+			this.methodName = lineData.methodName;
+		if (lineData.methodDescriptor != null)
+			this.methodDescriptor = lineData.methodDescriptor;
+	}
+
+	void addJump(int jumpNumber) {
+		getJumpData(jumpNumber);
+	}
+
+	void addSwitch(int switchNumber, int min, int max, int maxBranches) {
+		SwitchData sd = getSwitchData(switchNumber, new SwitchData(
+				switchNumber, min, max, maxBranches));
+		if (sd.getMaxBranches() > maxBranches) {
+			sd.setMaxBranches(maxBranches);
+		}
+	}
+
+	void setMethodNameAndDescriptor(String name, String descriptor) {
+		this.methodName = name;
+		this.methodDescriptor = descriptor;
+	}
+
+	void touch(int new_hits) {
+		this.hits += new_hits;
+	}
+
+	void touchJump(int jumpNumber, boolean branch, int hits) {
+		getJumpData(jumpNumber).touchBranch(branch, hits);
+	}
+
+	void touchSwitch(int switchNumber, int branch, int hits) {
+		getSwitchData(switchNumber, null).touchBranch(branch, hits);
+	}
+
+	public int getConditionSize() {
+		return ((jumps == null) ? 0 : jumps.size())
+				+ ((switches == null) ? 0 : switches.size());
+	}
+
+	public Object getConditionData(int index) {
+		Object branchData = null;
+		int jumpsSize = (jumps == null) ? 0 : jumps.size();
+		int switchesSize = (switches == null) ? 0 : switches.size();
+		if (index < jumpsSize) {
+			branchData = jumps.get(index);
+		} else if (index < jumpsSize + switchesSize) {
+			branchData = switches.get(index - jumpsSize);
+		}
+		return branchData;
+	}
+
+	public String getConditionCoverage(int index) {
+		Object branchData = getConditionData(index);
+		if (branchData == null) {
+			return StringUtil.getPercentValue(1.0);
+		} else if (branchData instanceof JumpData) {
+			JumpData jumpData = (JumpData) branchData;
+			return StringUtil.getPercentValue(jumpData.getBranchCoverageRate());
+		} else {
+			SwitchData switchData = (SwitchData) branchData;
+			return StringUtil.getPercentValue(switchData
+					.getBranchCoverageRate());
+
+		}
+	}
+
+	synchronized JumpData getJumpData(int jumpNumber) {
+		if (jumps == null) {
+			jumps = new ArrayList<JumpData>();
+		}
+		if (jumps.size() <= jumpNumber) {
+			for (int i = jumps.size(); i <= jumpNumber; jumps.add(new JumpData(
+					i++)));
+		}
+		return jumps.get(jumpNumber);
+	}
+
+	synchronized SwitchData getSwitchData(int switchNumber, SwitchData data) {
+		if (switches == null) {
+			switches = new ArrayList<SwitchData>();
+		}
+		if (switches.size() < switchNumber) {
+			for (int i = switches.size(); i < switchNumber; switches
+					.add(new SwitchData(i++, Integer.MAX_VALUE)));
+		}
+		if (switches.size() == switchNumber) {
+			if (data != null) {
+				switches.add(data);
+			} else {
+				switches.add(new SwitchData(switchNumber, Integer.MAX_VALUE));
+			}
+		}
+		return (SwitchData) switches.get(switchNumber);
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/PackageData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/PackageData.java
similarity index 71%
rename from src/net/sourceforge/cobertura/coveragedata/PackageData.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/PackageData.java
index 4e4b20c..e07aff1 100644
--- a/src/net/sourceforge/cobertura/coveragedata/PackageData.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/PackageData.java
@@ -1,172 +1,145 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Jeremy Thomerson
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-public class PackageData extends CoverageDataContainer
-		implements Comparable, HasBeenInstrumented
-{
-
-	private static final long serialVersionUID = 7;
-
-	private String name;
-
-	public PackageData(String name)
-	{
-		if (name == null)
-			throw new IllegalArgumentException(
-					"Package name must be specified.");
-		this.name = name;
-	}
-    
-	public void addClassData(ClassData classData)
-	{
-		lock.lock();
-		try
-		{
-			if (children.containsKey(classData.getBaseName()))
-				throw new IllegalArgumentException("Package " + this.name
-						+ " already contains a class with the name "
-						+ classData.getBaseName());
-	
-			// Each key is a class basename, stored as an String object.
-			// Each value is information about the class, stored as a ClassData object.
-			children.put(classData.getBaseName(), classData);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * This is required because we implement Comparable.
-	 */
-	public int compareTo(Object o)
-	{
-		if (!o.getClass().equals(PackageData.class))
-			return Integer.MAX_VALUE;
-		return this.name.compareTo(((PackageData)o).name);
-	}
-
-	public boolean contains(String name)
-	{
-		lock.lock();
-		try
-		{
-			return this.children.containsKey(name);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * Returns true if the given object is an instance of the
-	 * PackageData class, and it contains the same data as this
-	 * class.
-	 */
-	public boolean equals(Object obj)
-	{
-		if (this == obj)
-			return true;
-		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
-			return false;
-
-		PackageData packageData = (PackageData)obj;
-		getBothLocks(packageData);
-		try
-		{
-			return super.equals(obj) && this.name.equals(packageData.name);
-		}
-		finally
-		{
-			lock.unlock();
-			packageData.lock.unlock();
-		}
-	}
-
-	public SortedSet getClasses()
-	{
-		lock.lock();
-		try
-		{
-			return new TreeSet(this.children.values());
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public String getName()
-	{
-		return this.name;
-	}
-
-	public String getSourceFileName()
-	{
-		return this.name.replace('.', '/');
-	}
-
-	public Collection getSourceFiles()
-	{
-		SortedMap sourceFileDatas = new TreeMap();
-		
-		lock.lock();
-		try
-		{
-			Iterator iter = this.children.values().iterator();
-			while (iter.hasNext()) {
-				ClassData classData = (ClassData)iter.next();
-				String sourceFileName = classData.getSourceFileName();
-				SourceFileData sourceFileData = (SourceFileData)sourceFileDatas.get(sourceFileName);
-				if (sourceFileData == null)
-				{
-					sourceFileData = new SourceFileData(sourceFileName);
-					sourceFileDatas.put(sourceFileName, sourceFileData);
-				}
-				sourceFileData.addClassData(classData);
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return sourceFileDatas.values();
-	}
-
-	public int hashCode()
-	{
-		return this.name.hashCode();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+
+import java.util.*;
+
+ at CoverageIgnore
+public class PackageData extends CoverageDataContainer
+		implements
+			Comparable<Object> {
+
+	private static final long serialVersionUID = 7;
+
+	private String name;
+
+	public PackageData(String name) {
+		if (name == null)
+			throw new IllegalArgumentException(
+					"Package name must be specified.");
+		this.name = name;
+	}
+
+	public void addClassData(ClassData classData) {
+		lock.lock();
+		try {
+			if (children.containsKey(classData.getBaseName()))
+				throw new IllegalArgumentException("Package " + this.name
+						+ " already contains a class with the name "
+						+ classData.getBaseName());
+
+			// Each key is a class basename, stored as an String object.
+			// Each value is information about the class, stored as a ClassData object.
+			children.put(classData.getBaseName(), classData);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * This is required because we implement Comparable.
+	 */
+	public int compareTo(Object o) {
+		if (!o.getClass().equals(PackageData.class))
+			return Integer.MAX_VALUE;
+		return this.name.compareTo(((PackageData) o).name);
+	}
+
+	public boolean contains(String name) {
+		lock.lock();
+		try {
+			return this.children.containsKey(name);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Returns true if the given object is an instance of the
+	 * PackageData class, and it contains the same data as this
+	 * class.
+	 */
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
+			return false;
+
+		PackageData packageData = (PackageData) obj;
+		getBothLocks(packageData);
+		try {
+			return super.equals(obj) && this.name.equals(packageData.name);
+		} finally {
+			lock.unlock();
+			packageData.lock.unlock();
+		}
+	}
+
+	public SortedSet getClasses() {
+		lock.lock();
+		try {
+			return new TreeSet(this.children.values());
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public String getSourceFileName() {
+		return this.name.replace('.', '/');
+	}
+
+	public Collection getSourceFiles() {
+		SortedMap sourceFileDatas = new TreeMap();
+
+		lock.lock();
+		try {
+			Iterator iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				ClassData classData = (ClassData) iter.next();
+				String sourceFileName = classData.getSourceFileName();
+				SourceFileData sourceFileData = (SourceFileData) sourceFileDatas
+						.get(sourceFileName);
+				if (sourceFileData == null) {
+					sourceFileData = new SourceFileData(sourceFileName);
+					sourceFileDatas.put(sourceFileName, sourceFileData);
+				}
+				sourceFileData.addClassData(classData);
+			}
+		} finally {
+			lock.unlock();
+		}
+		return sourceFileDatas.values();
+	}
+
+	public int hashCode() {
+		return this.name.hashCode();
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/ProjectData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/ProjectData.java
similarity index 60%
rename from src/net/sourceforge/cobertura/coveragedata/ProjectData.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/ProjectData.java
index 32b193c..318c2b2 100644
--- a/src/net/sourceforge/cobertura/coveragedata/ProjectData.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/ProjectData.java
@@ -1,340 +1,342 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2005 Björn Beskow
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2009 Chris van Es
- * Copyright (C) 2009 Ed Randall
- * Copyright (C) 2010 Charlie Squires
- * Copyright (C) 2010 Piotr Tabor
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import net.sourceforge.cobertura.util.FileLocker;
-
-public class ProjectData extends CoverageDataContainer implements HasBeenInstrumented
-{
-
-	private static final long serialVersionUID = 6;
-
-	/** This collection is used for quicker access to the list of classes. */
-	private Map classes = new HashMap();
-
-	public void addClassData(ClassData classData)
-	{
-		lock.lock();
-		try
-		{
-			String packageName = classData.getPackageName();
-			PackageData packageData = (PackageData)children.get(packageName);
-			if (packageData == null)
-			{
-				packageData = new PackageData(packageName);
-				// Each key is a package name, stored as an String object.
-				// Each value is information about the package, stored as a PackageData object.
-				this.children.put(packageName, packageData);
-			}
-			packageData.addClassData(classData);
-			this.classes.put(classData.getName(), classData);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public ClassData getClassData(String name)
-	{
-		lock.lock();
-		try
-		{
-			return (ClassData)this.classes.get(name);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * This is called by instrumented bytecode.
-	 */
-	public ClassData getOrCreateClassData(String name)
-	{
-		lock.lock();
-		try
-		{
-			ClassData classData = (ClassData)this.classes.get(name);
-			if (classData == null)
-			{
-				classData = new ClassData(name);
-				addClassData(classData);
-			}
-			return classData;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public Collection getClasses()
-	{
-		lock.lock();
-		try
-		{
-			return this.classes.values();
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int getNumberOfClasses()
-	{
-		lock.lock();
-		try
-		{
-			return this.classes.size();
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int getNumberOfSourceFiles()
-	{
-		return getSourceFiles().size();
-	}
-
-	public SortedSet getPackages()
-	{
-		lock.lock();
-		try
-		{
-			return new TreeSet(this.children.values());
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public Collection getSourceFiles()
-	{
-		SortedSet sourceFileDatas = new TreeSet();
-		lock.lock();
-		try
-		{
-			Iterator iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				PackageData packageData = (PackageData)iter.next();
-				sourceFileDatas.addAll(packageData.getSourceFiles());
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return sourceFileDatas;
-	}
-
-	/**
-	 * Get all subpackages of the given package. Includes also specified package if
-	 * it exists.
-	 *
-	 * @param packageName The package name to find subpackages for.
-	 *        For example, "com.example"
-	 * @return A collection containing PackageData objects.  Each one
-	 *         has a name beginning with the given packageName.  For
-	 *         example: "com.example.io", "com.example.io.internal"
-	 */
-	public SortedSet getSubPackages(String packageName)
-	{
-		SortedSet subPackages = new TreeSet();
-		lock.lock();
-		try
-		{
-			Iterator iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				PackageData packageData = (PackageData)iter.next();
-				if (packageData.getName().startsWith(packageName + ".") || packageData.getName().equals(packageName) || packageName.equals(""))
-					subPackages.add(packageData);
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return subPackages;
-	}
-
-	public void merge(CoverageData coverageData)
-	{
-		if (coverageData == null) {
-			return;
-		}
-		ProjectData projectData = (ProjectData)coverageData;
-		getBothLocks(projectData);
-		try
-		{
-			super.merge(coverageData);
-	
-			for (Iterator iter = projectData.classes.keySet().iterator(); iter.hasNext();)
-			{
-				Object key = iter.next();
-				if (!this.classes.containsKey(key))
-				{
-					this.classes.put(key, projectData.classes.get(key));
-				}
-			}
-		}
-		finally
-		{
-			lock.unlock();
-			projectData.lock.unlock();
-		}
-	}
-
-	// TODO: Is it possible to do this as a static initializer?
-	public static void initialize()
-	{
-		// Hack for Tomcat - by saving project data right now we force loading
-		// of classes involved in this process (like ObjectOutputStream)
-		// so that it won't be necessary to load them on JVM shutdown
-		if (System.getProperty("catalina.home") != null)
-		{
-			saveGlobalProjectData();
-
-			// Force the class loader to load some classes that are
-			// required by our JVM shutdown hook.
-			// TODO: Use ClassLoader.loadClass("whatever"); instead
-			ClassData.class.toString();
-			CoverageData.class.toString();
-			CoverageDataContainer.class.toString();
-			FileLocker.class.toString();
-			HasBeenInstrumented.class.toString();
-			LineData.class.toString();
-			PackageData.class.toString();
-			SourceFileData.class.toString();
-		}
-
-		// Add a hook to save the data when the JVM exits
-		Runtime.getRuntime().addShutdownHook(new Thread(new SaveTimer()));
-
-		// Possibly also save the coverage data every x seconds?
-		//Timer timer = new Timer(true);
-		//timer.schedule(saveTimer, 100);
-	}
-
-	public static void saveGlobalProjectData()
-	{
-		ProjectData projectDataToSave = new ProjectData();
-		
-		TouchCollector.applyTouchesOnProjectData(projectDataToSave);
-
-
-		// Get a file lock
-		File dataFile = CoverageDataFileHandler.getDefaultDataFile();
-		
-		/*
-		 * A note about the next synchronized block:  Cobertura uses static fields to
-		 * hold the data.   When there are multiple classloaders, each classloader
-		 * will keep track of the line counts for the classes that it loads.  
-		 * 
-		 * The static initializers for the Cobertura classes are also called for
-		 * each classloader.   So, there is one shutdown hook for each classloader.
-		 * So, when the JVM exits, each shutdown hook will try to write the
-		 * data it has kept to the datafile.   They will do this at the same
-		 * time.   Before Java 6, this seemed to work fine, but with Java 6, there
-		 * seems to have been a change with how file locks are implemented.   So,
-		 * care has to be taken to make sure only one thread locks a file at a time.
-		 * 
-		 * So, we will synchronize on the string that represents the path to the
-		 * dataFile.  Apparently, there will be only one of these in the JVM
-		 * even if there are multiple classloaders.  I assume that is because
-		 * the String class is loaded by the JVM's root classloader. 
-		 */
-		synchronized (dataFile.getPath().intern() ) {
-			FileLocker fileLocker = new FileLocker(dataFile);
-			
-			try
-			{
-				// Read the old data, merge our current data into it, then
-				// write a new ser file.
-				if (fileLocker.lock())
-				{
-					ProjectData datafileProjectData = loadCoverageDataFromDatafile(dataFile);
-					if (datafileProjectData == null)
-					{
-						datafileProjectData = projectDataToSave;
-					}
-					else
-					{
-						datafileProjectData.merge(projectDataToSave);
-					}
-					CoverageDataFileHandler.saveCoverageData(datafileProjectData, dataFile);
-				}
-			}
-			finally
-			{
-				// Release the file lock
-				fileLocker.release();
-			}
-		}
-	}
-
-	private static ProjectData loadCoverageDataFromDatafile(File dataFile)
-	{
-		ProjectData projectData = null;
-
-		// Read projectData from the serialized file.
-		if (dataFile.isFile())
-		{
-			projectData = CoverageDataFileHandler.loadCoverageData(dataFile);
-		}
-
-		if (projectData == null)
-		{
-			// We could not read from the serialized file, so use a new object.
-			System.out.println("Cobertura: Coverage data file " + dataFile.getAbsolutePath()
-					+ " either does not exist or is not readable.  Creating a new data file.");
-		}
-
-		return projectData;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2005 Björn Beskow
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2009 Chris van Es
+ * Copyright (C) 2009 Ed Randall
+ * Copyright (C) 2010 Charlie Squires
+ * Copyright (C) 2010 Piotr Tabor
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.util.FileLocker;
+import net.sourceforge.cobertura.util.ShutdownHooks;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+ at CoverageIgnore
+public class ProjectData extends CoverageDataContainer {
+	private static final Logger logger = LoggerFactory.getLogger(ProjectData.class);
+	private static final long serialVersionUID = 6;
+
+	private static ProjectData globalProjectData = null;
+
+	private static Thread shutdownHook;
+	private static final transient Lock globalProjectDataLock = new ReentrantLock();
+
+	/**
+	 * This collection is used for quicker access to the list of classes.
+	 */
+	private Map classes = new HashMap();
+
+	public void addClassData(ClassData classData) {
+		lock.lock();
+		try {
+			String packageName = classData.getPackageName();
+			PackageData packageData = (PackageData) children.get(packageName);
+			if (packageData == null) {
+				packageData = new PackageData(packageName);
+				// Each key is a package name, stored as an String object.
+				// Each value is information about the package, stored as a PackageData object.
+				this.children.put(packageName, packageData);
+			}
+			packageData.addClassData(classData);
+			this.classes.put(classData.getName(), classData);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public ClassData getClassData(String name) {
+		return (ClassData) this.classes.get(name);
+	}
+
+	/**
+	 * This is called by instrumented bytecode.
+	 */
+	public ClassData getOrCreateClassData(String name) {
+		lock.lock();
+		try {
+			ClassData classData = (ClassData) this.classes.get(name);
+			if (classData == null) {
+				classData = new ClassData(name);
+				addClassData(classData);
+			}
+			return classData;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public Collection getClasses() {
+		lock.lock();
+		try {
+			return this.classes.values();
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public int getNumberOfClasses() {
+		lock.lock();
+		try {
+			return this.classes.size();
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public int getNumberOfSourceFiles() {
+		return getSourceFiles().size();
+	}
+
+	public SortedSet getPackages() {
+		lock.lock();
+		try {
+			return new TreeSet(this.children.values());
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public Collection getSourceFiles() {
+		SortedSet sourceFileDatas = new TreeSet();
+		lock.lock();
+		try {
+			Iterator iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				PackageData packageData = (PackageData) iter.next();
+				sourceFileDatas.addAll(packageData.getSourceFiles());
+			}
+		} finally {
+			lock.unlock();
+		}
+		return sourceFileDatas;
+	}
+
+	/**
+	 * Get all subpackages of the given package. Includes also specified package if
+	 * it exists.
+	 *
+	 * @param packageName The package name to find subpackages for.
+	 *                    For example, "com.example"
+	 *
+	 * @return A collection containing PackageData objects.  Each one
+	 *         has a name beginning with the given packageName.  For
+	 *         example: "com.example.io", "com.example.io.internal"
+	 */
+	public SortedSet getSubPackages(String packageName) {
+		SortedSet subPackages = new TreeSet();
+		lock.lock();
+		try {
+			Iterator iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				PackageData packageData = (PackageData) iter.next();
+				if (packageData.getName().startsWith(packageName + ".")
+						|| packageData.getName().equals(packageName)
+						|| (packageName.length() == 0)) {
+					subPackages.add(packageData);
+				}
+			}
+		} finally {
+			lock.unlock();
+		}
+		return subPackages;
+	}
+
+	public void merge(CoverageData coverageData) {
+		if (coverageData == null) {
+			return;
+		}
+		ProjectData projectData = (ProjectData) coverageData;
+		getBothLocks(projectData);
+		try {
+			super.merge(coverageData);
+
+			for (Iterator iter = projectData.classes.keySet().iterator(); iter
+					.hasNext();) {
+				Object key = iter.next();
+				if (!this.classes.containsKey(key)) {
+					this.classes.put(key, projectData.classes.get(key));
+				}
+			}
+		} finally {
+			lock.unlock();
+			projectData.lock.unlock();
+		}
+	}
+
+	/**
+	 * Get a reference to a ProjectData object in order to increase the
+	 * coverage count for a specific line.
+	 * <p/>
+	 * This method is only called by code that has been instrumented.  It
+	 * is not called by any of the Cobertura code or ant tasks.
+	 */
+	public static ProjectData getGlobalProjectData() {
+		globalProjectDataLock.lock();
+		try {
+			if (globalProjectData != null)
+				return globalProjectData;
+
+			globalProjectData = new ProjectData();
+			initialize();
+
+			return globalProjectData;
+		} finally {
+			globalProjectDataLock.unlock();
+		}
+	}
+
+	// TODO: Is it possible to do this as a static initializer?
+	private static void initialize() {
+		// Hack for Tomcat - by saving project data right now we force loading
+		// of classes involved in this process (like ObjectOutputStream)
+		// so that it won't be necessary to load them on JVM shutdown
+		if (System.getProperty("catalina.home") != null) {
+			saveGlobalProjectData();
+
+			// Force the class loader to load some classes that are
+			// required by our JVM shutdown hook.
+			// TODO: Use ClassLoader.loadClass("whatever"); instead
+			ClassData.class.toString();
+			CoverageData.class.toString();
+			CoverageDataContainer.class.toString();
+			FileLocker.class.toString();
+			LineData.class.toString();
+			PackageData.class.toString();
+			SourceFileData.class.toString();
+		}
+
+		// Add a hook to save the data when the JVM exits
+		shutdownHook = new Thread(new SaveTimer());
+		Runtime.getRuntime().addShutdownHook(shutdownHook);
+		// Possibly also save the coverage data every x seconds?
+		//Timer timer = new Timer(true);
+		//timer.schedule(saveTimer, 100);
+	}
+
+	public static void saveGlobalProjectData() {
+		ProjectData projectDataToSave = null;
+
+		globalProjectDataLock.lock();
+		try {
+			projectDataToSave = getGlobalProjectData();
+
+			/*
+			 * The next statement is not necessary at the moment, because this method is only called
+			 * either at the very beginning or at the very end of a test.  If the code is changed
+			 * to save more frequently, then this will become important.
+			 */
+			globalProjectData = new ProjectData();
+		} finally {
+			globalProjectDataLock.unlock();
+		}
+
+		/*
+		 * Now sleep a bit in case there is a thread still holding a reference to the "old"
+		 * globalProjectData (now referenced with projectDataToSave).  
+		 * We want it to finish its updates.  I assume 1 second is plenty of time.
+		 */
+		try {
+			Thread.sleep(1000);
+		} catch (InterruptedException e) {
+		}
+
+		TouchCollector.applyTouchesOnProjectData(projectDataToSave);
+
+		// Get a file lock
+		File dataFile = CoverageDataFileHandler.getDefaultDataFile();
+		/*
+		 * A note about the next synchronized block:  Cobertura uses static fields to
+		 * hold the data.   When there are multiple classloaders, each classloader
+		 * will keep track of the line counts for the classes that it loads.  
+		 * 
+		 * The static initializers for the Cobertura classes are also called for
+		 * each classloader.   So, there is one shutdown hook for each classloader.
+		 * So, when the JVM exits, each shutdown hook will try to write the
+		 * data it has kept to the datafile.   They will do this at the same
+		 * time.   Before Java 6, this seemed to work fine, but with Java 6, there
+		 * seems to have been a change with how file locks are implemented.   So,
+		 * care has to be taken to make sure only one thread locks a file at a time.
+		 * 
+		 * So, we will synchronize on the string that represents the path to the
+		 * dataFile.  Apparently, there will be only one of these in the JVM
+		 * even if there are multiple classloaders.  I assume that is because
+		 * the String class is loaded by the JVM's root classloader. 
+		 */
+		synchronized (dataFile.getPath().intern()) {
+			FileLocker fileLocker = new FileLocker(dataFile);
+
+			try {
+				// Read the old data, merge our current data into it, then
+				// write a new ser file.
+				if (fileLocker.lock()) {
+					ProjectData datafileProjectData = loadCoverageDataFromDatafile(dataFile);
+					if (datafileProjectData == null) {
+						datafileProjectData = projectDataToSave;
+					} else {
+						datafileProjectData.merge(projectDataToSave);
+					}
+					CoverageDataFileHandler.saveCoverageData(
+							datafileProjectData, dataFile);
+				}
+			} finally {
+				// Release the file lock
+				fileLocker.release();
+			}
+		}
+	}
+
+	public static void turnOffAutoSave() {
+		if (shutdownHook != null) {
+			Runtime.getRuntime().removeShutdownHook(shutdownHook);
+		}
+	}
+
+	private static ProjectData loadCoverageDataFromDatafile(File dataFile) {
+		ProjectData projectData = null;
+
+		// Read projectData from the serialized file.
+		if (dataFile.isFile()) {
+			projectData = CoverageDataFileHandler.loadCoverageData(dataFile);
+		}
+
+		if (projectData == null) {
+			// We could not read from the serialized file, so use a new object.
+			logger
+					.info("Cobertura: Coverage data file "
+							+ dataFile.getAbsolutePath()
+							+ " either does not exist or is not readable.  Creating a new data file.");
+		}
+
+		return projectData;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/SaveTimer.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SaveTimer.java
similarity index 83%
rename from src/net/sourceforge/cobertura/coveragedata/SaveTimer.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SaveTimer.java
index e65cece..a66826b 100644
--- a/src/net/sourceforge/cobertura/coveragedata/SaveTimer.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SaveTimer.java
@@ -1,34 +1,35 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.TimerTask;
-
-public class SaveTimer extends TimerTask implements HasBeenInstrumented
-{
-
-	public void run()
-	{
-		ProjectData.saveGlobalProjectData();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.util.ArchiveUtil;
+
+import java.util.TimerTask;
+
+ at CoverageIgnore
+public class SaveTimer extends TimerTask {
+
+	public void run() {
+		ProjectData.saveGlobalProjectData();
+	}
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/SourceFileData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SourceFileData.java
similarity index 70%
rename from src/net/sourceforge/cobertura/coveragedata/SourceFileData.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SourceFileData.java
index 7d9ca16..e518b0b 100644
--- a/src/net/sourceforge/cobertura/coveragedata/SourceFileData.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SourceFileData.java
@@ -1,263 +1,218 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.Iterator;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-import net.sourceforge.cobertura.util.StringUtil;
-
-public class SourceFileData extends CoverageDataContainer
-		implements Comparable, HasBeenInstrumented
-{
-
-	private static final long serialVersionUID = 3;
-
-	private String name;
-
-   /**
-    * @param name In the format, "net/sourceforge/cobertura/coveragedata/SourceFileData.java"
-    */
-	public SourceFileData(String name)
-	{
-		if (name == null)
-			throw new IllegalArgumentException(
-				"Source file name must be specified.");
-		this.name = name;
-	}
-
-	public void addClassData(ClassData classData)
-	{
-		lock.lock();
-		try
-		{
-			if (children.containsKey(classData.getBaseName()))
-				throw new IllegalArgumentException("Source file " + this.name
-						+ " already contains a class with the name "
-						+ classData.getBaseName());
-	
-			// Each key is a class basename, stored as an String object.
-			// Each value is information about the class, stored as a ClassData object.
-			children.put(classData.getBaseName(), classData);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * This is required because we implement Comparable.
-	 */
-	public int compareTo(Object o)
-	{
-		if (!o.getClass().equals(SourceFileData.class))
-			return Integer.MAX_VALUE;
-		return this.name.compareTo(((SourceFileData)o).name);
-	}
-
-	public boolean contains(String name)
-	{
-		lock.lock();
-		try
-		{
-			return this.children.containsKey(name);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public boolean containsInstrumentationInfo()
-	{
-		lock.lock();
-		try
-		{
-			// Return false if any of our child ClassData's does not
-			// contain instrumentation info
-			Iterator iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				ClassData classData = (ClassData)iter.next();
-				if (!classData.containsInstrumentationInfo())
-					return false;
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return true;
-	}
-
-	/**
-	 * Returns true if the given object is an instance of the
-	 * SourceFileData class, and it contains the same data as this
-	 * class.
-	 */
-	public boolean equals(Object obj)
-	{
-		if (this == obj)
-			return true;
-		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
-			return false;
-
-		SourceFileData sourceFileData = (SourceFileData)obj;
-		getBothLocks(sourceFileData);
-		try
-		{
-			return super.equals(obj)
-					&& this.name.equals(sourceFileData.name);
-		}
-		finally
-		{
-			lock.unlock();
-			sourceFileData.lock.unlock();
-		}
-	}
-
-	public String getBaseName()
-	{
-		String fullNameWithoutExtension;
-		int lastDot = this.name.lastIndexOf('.');
-		if (lastDot == -1)
-		{
-			fullNameWithoutExtension = this.name;
-		}
-		else
-		{
-			fullNameWithoutExtension = this.name.substring(0, lastDot);
-		}
-
-		int lastSlash = fullNameWithoutExtension.lastIndexOf('/');
-		if (lastSlash == -1)
-		{
-			return fullNameWithoutExtension;
-		}
-		return fullNameWithoutExtension.substring(lastSlash + 1);
-	}
-
-	public SortedSet getClasses()
-	{
-		lock.lock();
-		try
-		{
-			return new TreeSet(this.children.values());
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public LineData getLineCoverage(int lineNumber)
-	{
-		lock.lock();
-		try
-		{
-			Iterator iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				ClassData classData = (ClassData)iter.next();
-				if (classData.isValidSourceLineNumber(lineNumber))
-					return classData.getLineCoverage(lineNumber);
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return null;
-	}
-
-	public String getName()
-	{
-		return this.name;
-	}
-
-	/**
-	 * @return The name of this source file without the file extension
-	 *         in the format
-	 *         "net.sourceforge.cobertura.coveragedata.SourceFileData"
-	 */
-	public String getNormalizedName()
-	{
-		String fullNameWithoutExtension;
-		int lastDot = this.name.lastIndexOf('.');
-		if (lastDot == -1)
-		{
-			fullNameWithoutExtension = this.name;
-		}
-		else
-		{
-			fullNameWithoutExtension = this.name.substring(0, lastDot);
-		}
-
-		return StringUtil.replaceAll(fullNameWithoutExtension, "/", ".");
-	}
-
-	/**
-	 * @return The name of the package that this source file is in.
-	 *         In the format "net.sourceforge.cobertura.coveragedata"
-	 */
-	public String getPackageName()
-	{
-		int lastSlash = this.name.lastIndexOf('/');
-		if (lastSlash == -1)
-		{
-			return null;
-		}
-		return StringUtil.replaceAll(this.name.substring(0, lastSlash), "/",
-				".");
-	}
-
-	public int hashCode()
-	{
-		return this.name.hashCode();
-	}
-
-	public boolean isValidSourceLineNumber(int lineNumber)
-	{
-		lock.lock();
-		try
-		{
-			Iterator iter = this.children.values().iterator();
-			while (iter.hasNext())
-			{
-				ClassData classData = (ClassData)iter.next();
-				if (classData.isValidSourceLineNumber(lineNumber))
-					return true;
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-		return false;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.util.StringUtil;
+
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+ at CoverageIgnore
+public class SourceFileData extends CoverageDataContainer
+		implements
+			Comparable<Object> {
+
+	private static final long serialVersionUID = 3;
+
+	private String name;
+
+	/**
+	 * @param name In the format, "net/sourceforge/cobertura/coveragedata/SourceFileData.java"
+	 */
+	public SourceFileData(String name) {
+		if (name == null)
+			throw new IllegalArgumentException(
+					"Source file name must be specified.");
+		this.name = name;
+	}
+
+	public void addClassData(ClassData classData) {
+		lock.lock();
+		try {
+			if (children.containsKey(classData.getBaseName()))
+				throw new IllegalArgumentException("Source file " + this.name
+						+ " already contains a class with the name "
+						+ classData.getBaseName());
+
+			// Each key is a class basename, stored as an String object.
+			// Each value is information about the class, stored as a ClassData object.
+			children.put(classData.getBaseName(), classData);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * This is required because we implement Comparable.
+	 */
+	public int compareTo(Object o) {
+		if (!o.getClass().equals(SourceFileData.class))
+			return Integer.MAX_VALUE;
+		return this.name.compareTo(((SourceFileData) o).name);
+	}
+
+	public boolean contains(String name) {
+		lock.lock();
+		try {
+			return this.children.containsKey(name);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public boolean containsInstrumentationInfo() {
+		lock.lock();
+		try {
+			// Return false if any of our child ClassData's does not
+			// contain instrumentation info
+			Iterator iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				ClassData classData = (ClassData) iter.next();
+				if (!classData.containsInstrumentationInfo())
+					return false;
+			}
+		} finally {
+			lock.unlock();
+		}
+		return true;
+	}
+
+	/**
+	 * Returns true if the given object is an instance of the
+	 * SourceFileData class, and it contains the same data as this
+	 * class.
+	 */
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
+			return false;
+
+		SourceFileData sourceFileData = (SourceFileData) obj;
+		getBothLocks(sourceFileData);
+		try {
+			return super.equals(obj) && this.name.equals(sourceFileData.name);
+		} finally {
+			lock.unlock();
+			sourceFileData.lock.unlock();
+		}
+	}
+
+	public String getBaseName() {
+		String fullNameWithoutExtension;
+		int lastDot = this.name.lastIndexOf('.');
+		if (lastDot == -1) {
+			fullNameWithoutExtension = this.name;
+		} else {
+			fullNameWithoutExtension = this.name.substring(0, lastDot);
+		}
+
+		int lastSlash = fullNameWithoutExtension.lastIndexOf('/');
+		if (lastSlash == -1) {
+			return fullNameWithoutExtension;
+		}
+		return fullNameWithoutExtension.substring(lastSlash + 1);
+	}
+
+	public SortedSet getClasses() {
+		lock.lock();
+		try {
+			return new TreeSet(this.children.values());
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public LineData getLineCoverage(int lineNumber) {
+		lock.lock();
+		try {
+			Iterator iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				ClassData classData = (ClassData) iter.next();
+				if (classData.isValidSourceLineNumber(lineNumber))
+					return classData.getLineCoverage(lineNumber);
+			}
+		} finally {
+			lock.unlock();
+		}
+		return null;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	/**
+	 * @return The name of this source file without the file extension
+	 *         in the format
+	 *         "net.sourceforge.cobertura.coveragedata.SourceFileData"
+	 */
+	public String getNormalizedName() {
+		String fullNameWithoutExtension;
+		int lastDot = this.name.lastIndexOf('.');
+		if (lastDot == -1) {
+			fullNameWithoutExtension = this.name;
+		} else {
+			fullNameWithoutExtension = this.name.substring(0, lastDot);
+		}
+
+		return StringUtil.replaceAll(fullNameWithoutExtension, "/", ".");
+	}
+
+	/**
+	 * @return The name of the package that this source file is in.
+	 *         In the format "net.sourceforge.cobertura.coveragedata"
+	 */
+	public String getPackageName() {
+		int lastSlash = this.name.lastIndexOf('/');
+		if (lastSlash == -1) {
+			return null;
+		}
+		return StringUtil.replaceAll(this.name.substring(0, lastSlash), "/",
+				".");
+	}
+
+	public int hashCode() {
+		return this.name.hashCode();
+	}
+
+	public boolean isValidSourceLineNumber(int lineNumber) {
+		lock.lock();
+		try {
+			Iterator iter = this.children.values().iterator();
+			while (iter.hasNext()) {
+				ClassData classData = (ClassData) iter.next();
+				if (classData.isValidSourceLineNumber(lineNumber))
+					return true;
+			}
+		} finally {
+			lock.unlock();
+		}
+		return false;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SwitchData.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SwitchData.java
new file mode 100644
index 0000000..6a21ea8
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/SwitchData.java
@@ -0,0 +1,163 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+ at CoverageIgnore
+public class SwitchData
+		implements
+			BranchCoverageData,
+			Comparable<Object>,
+			Serializable {
+	private static final long serialVersionUID = 9;
+
+	private int switchNumber;
+
+	private long defaultHits;
+
+	private long[] hits;
+
+	private int[] keys;
+
+	private int maxBranches;
+
+	public SwitchData(int switchNumber, int[] keys, int maxBranches) {
+		this.switchNumber = switchNumber;
+		defaultHits = 0;
+		hits = new long[keys.length];
+		Arrays.fill(hits, 0);
+		this.keys = new int[keys.length];
+		System.arraycopy(keys, 0, this.keys, 0, keys.length);
+		this.maxBranches = maxBranches;
+	}
+
+	public SwitchData(int switchNumber, int min, int max, int maxBranches) {
+		this.switchNumber = switchNumber;
+		defaultHits = 0;
+		hits = new long[max - min + 1];
+		Arrays.fill(hits, 0);
+		this.keys = new int[max - min + 1];
+		for (int i = 0; min <= max; keys[i++] = min++);
+		this.maxBranches = maxBranches;
+	}
+
+	public SwitchData(int switchNumber, int maxBranches) {
+		this(switchNumber, new int[0], maxBranches);
+	}
+
+	public int compareTo(Object o) {
+		if (!o.getClass().equals(SwitchData.class))
+			return Integer.MAX_VALUE;
+		return this.switchNumber - ((SwitchData) o).switchNumber;
+	}
+
+	void touchBranch(int branch, int new_hits) {
+		if (branch == -1) {
+			defaultHits += new_hits;
+		} else {
+			if (hits.length <= branch) {
+				long[] old = hits;
+				hits = new long[branch + 1];
+				System.arraycopy(old, 0, hits, 0, old.length);
+				Arrays.fill(hits, old.length, hits.length - 1, 0);
+			}
+			hits[branch] += new_hits;
+		}
+	}
+
+	public int getSwitchNumber() {
+		return this.switchNumber;
+	}
+
+	public long getHits(int branch) {
+		return (hits.length > branch) ? hits[branch] : -1;
+	}
+
+	public long getDefaultHits() {
+		return defaultHits;
+	}
+
+	public double getBranchCoverageRate() {
+		int branches = getNumberOfValidBranches();
+		int hit = (defaultHits > 0) ? 1 : 0;
+		for (int i = hits.length - 1; i >= 0; hit += ((hits[i--] > 0) ? 1 : 0));
+		return ((double) hit) / branches;
+	}
+
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
+			return false;
+
+		SwitchData switchData = (SwitchData) obj;
+		return (this.defaultHits == switchData.defaultHits)
+				&& (Arrays.equals(this.hits, switchData.hits))
+				&& (this.switchNumber == switchData.switchNumber);
+	}
+
+	public int hashCode() {
+		return this.switchNumber;
+	}
+
+	public int getNumberOfCoveredBranches() {
+		int ret = (defaultHits > 0) ? 1 : 0;
+		for (int i = hits.length - 1; i >= 0; i--) {
+			if (hits[i] > 0)
+				ret++;
+		}
+		return ret;
+	}
+
+	public int getNumberOfValidBranches() {
+		return Math.min(hits.length + 1, maxBranches);
+	}
+
+	public void merge(BranchCoverageData coverageData) {
+		SwitchData switchData = (SwitchData) coverageData;
+		defaultHits += switchData.defaultHits;
+		for (int i = Math.min(hits.length, switchData.hits.length) - 1; i >= 0; i--)
+			hits[i] += switchData.hits[i];
+		if (switchData.hits.length > hits.length) {
+			long[] old = hits;
+			hits = new long[switchData.hits.length];
+			System.arraycopy(old, 0, hits, 0, old.length);
+			System.arraycopy(switchData.hits, old.length, hits, old.length,
+					hits.length - old.length);
+		}
+		if ((this.keys.length == 0) && (switchData.keys.length > 0))
+			this.keys = switchData.keys;
+		maxBranches = Math.min(maxBranches, switchData.getMaxBranches());
+	}
+
+	public int getMaxBranches() {
+		return maxBranches;
+	}
+
+	public void setMaxBranches(int maxBranches) {
+		this.maxBranches = maxBranches;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/TouchCollector.java b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/TouchCollector.java
new file mode 100644
index 0000000..689cc93
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/TouchCollector.java
@@ -0,0 +1,232 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2010 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+ at CoverageIgnore
+public class TouchCollector {
+	private static final Logger logger = LoggerFactory.getLogger(TouchCollector.class);
+	/*In fact - concurrentHashset*/
+	private static Map<Class<?>, Integer> registeredClasses = new ConcurrentHashMap<Class<?>, Integer>();
+
+	static {
+		ProjectData.getGlobalProjectData(); // To call ProjectData.initialize();
+	}
+
+	public static synchronized void registerClass(Class<?> classa) {
+		registeredClasses.put(classa, 0);
+	}
+
+	/**
+	 * This method is only for backward compatibility
+	 * 
+	 * Information:
+	 * ASM version 4.1 does not allow for the data type java.lang.Class to be a parameter
+	 * to the method visitLdcInsn which causes issues for anything below .class versions
+	 * 49 and lower. Changing the registered class to use instead a String parameter and
+	 * search for the class in the classpath helped resolve the issue.
+	 * Also as a side note: The replace parameters might enter as "java/lang/String" and
+	 * need to be translated to "java.lang.String" so the forName method can understand it.
+	 * 
+	 * @param classa Class that needs to be registered.
+	 * @throws ClassNotFoundException 
+	 */
+	public static synchronized void registerClass(String classa)
+			throws ClassNotFoundException {
+		try {
+			// If it's not in the system jvm, then search the current thread for the class.
+			// This is a dirty hack to guarantee that multiple classloaders can invoke cobertura code.
+
+			// We try 2 methods to register the classes
+			// First method we try to call the invoker classloader. If the invoker causes an exception (NoClassDefFound) it
+			// will then call Thread.currentThread.getContextClassLoader() which gets the current threads classloader and
+			// checks to see if cobertura code is in there. This is here because there are situations where multiple
+			// classloaders might be invoked and it requires the check of multiple classloaders.
+
+			boolean found = false;
+			Class<?> clazz;
+            try {
+                clazz = Class.forName(classa.replace("/", "."), false,
+                        Thread.currentThread().getContextClassLoader());
+                for (Method meth : clazz.getMethods()) {
+                    if (meth.toString().contains("net.sourceforge.cobertura")) {
+                        registerClass(clazz);
+                        found = true;
+                    }
+                }
+            } catch (NoClassDefFoundError ncdfe) {
+                // "Expected", try described fallback
+            }
+
+			if (!found) {
+				clazz = Class.forName(classa.replace("/", "."));
+				registerClass(clazz);
+			}
+		} catch (ClassNotFoundException e) {
+			logger.error("Exception when registering class: "
+					+ classa, e);
+			throw e;
+		}
+	}
+
+	public static synchronized void applyTouchesOnProjectData(
+			ProjectData projectData) {
+		logger.debug("=================== START OF REPORT ======================== ");
+		for (Class<?> c : registeredClasses.keySet()) {
+			logger.debug("Report: " + c.getName());
+			ClassData cd = projectData.getOrCreateClassData(c.getName());
+			applyTouchesToSingleClassOnProjectData(cd, c);
+		}
+		logger.debug("===================  END OF REPORT  ======================== ");
+	}
+
+	private static void applyTouchesToSingleClassOnProjectData(
+			final ClassData classData, final Class<?> c) {
+		logger.trace("----------- " + maybeCanonicalName(c)
+				+ " ---------------- ");
+		try {
+			Method m0 = c
+					.getDeclaredMethod(AbstractCodeProvider.COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME);
+			m0.setAccessible(true);
+			final int[] res = (int[]) m0.invoke(null, new Object[]{});
+
+			LightClassmapListener lightClassmap = new ApplyToClassDataLightClassmapListener(
+					classData, res);
+			Method m = c.getDeclaredMethod(
+					AbstractCodeProvider.COBERTURA_CLASSMAP_METHOD_NAME,
+					LightClassmapListener.class);
+			m.setAccessible(true);
+			m.invoke(null, lightClassmap);
+		} catch (Exception e) {
+			logger.error("Cannot apply touches", e);
+		}
+	}
+
+    private static String maybeCanonicalName(final Class<?> c) {
+
+        /* observed getCanonicalName throwing a
+
+           java.lang.InternalError: Malformed class name
+
+           on the scala generated class name
+
+           com.twitter.dataproducts.authcache.storage.GnipStream$Visibility$IsExternal$
+
+           Conclusion: getCanonicalName is flaky
+        */
+
+        try {
+            return c.getCanonicalName();
+        } catch (Throwable t) {
+            return c.getName();
+        }
+    }
+
+	@CoverageIgnore
+	private static class ApplyToClassDataLightClassmapListener
+			implements
+				LightClassmapListener {
+		//private AtomicInteger idProvider=new AtomicInteger(0);
+		private final ClassData classData;
+		private final int[] res;
+
+		private int currentLine = 0;
+		private int jumpsInLine = 0;
+		private int switchesInLine = 0;
+
+		private void updateLine(int new_line) {
+			if (new_line != currentLine) {
+				currentLine = new_line;
+				jumpsInLine = 0;
+				switchesInLine = 0;
+			}
+		}
+
+		public ApplyToClassDataLightClassmapListener(ClassData cd, int[] res) {
+			classData = cd;
+			this.res = res;
+		}
+
+		public void setSource(String source) {
+			logger.debug("source: " + source);
+			classData.setSourceFileName(source);
+
+		}
+
+		public void setClazz(Class<?> clazz) {
+		}
+
+		public void setClazz(String clazz) {
+		}
+
+		public void putLineTouchPoint(int classLine, int counterId,
+				String methodName, String methodDescription) {
+			updateLine(classLine);
+			LineData ld = classData.addLine(classLine, methodName,
+					methodDescription);
+			ld.touch(res[counterId]);
+		}
+
+		public void putSwitchTouchPoint(int classLine, int maxBranches,
+				int... counterIds) {
+			updateLine(classLine);
+			LineData ld = getOrCreateLine(classLine);
+			int switchId = switchesInLine++;
+			classData.addLineSwitch(classLine, switchId, 0,
+					counterIds.length - 2, maxBranches);
+			for (int i = 0; i < counterIds.length; i++) {
+				ld.touchSwitch(switchId, i - 1, res[counterIds[i]]);
+			}
+		}
+
+		public void putJumpTouchPoint(int classLine, int trueCounterId,
+				int falseCounterId) {
+			updateLine(classLine);
+			LineData ld = getOrCreateLine(classLine);
+			int branchId = jumpsInLine++;
+			classData.addLineJump(classLine, branchId);
+			ld.touchJump(branchId, true, res[trueCounterId]);
+			ld.touchJump(branchId, false, res[falseCounterId]);
+		}
+
+		private LineData getOrCreateLine(int classLine) {
+			LineData ld = classData.getLineData(classLine);
+			if (ld == null) {
+				ld = classData.addLine(classLine, null, null);
+			}
+			return ld;
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/package.html b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/package.html
new file mode 100644
index 0000000..7b7ec77
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/coveragedata/package.html
@@ -0,0 +1,23 @@
+<body>
+
+<p>
+    A hierarchy of classes used for storing metadata about each of your
+    classes. A ProjectData object contains PackageData objects which
+    contain ClassData objects
+    which contain LineData objects. Or, in bad ASCII art:
+</p>
+
+<p>
+    ProjectData <--> PackageData <--> ClassData <--> LineData
+</p>
+
+<p>
+    The SourceFileData class is not used during instrumention or
+    testing. It is a only used when generating the reports. Basically
+    it's used to lump a set of classes together when those classes come
+    from the same file. This is needed because the HTML reporting
+    displays an entire file at a time, instead of displaying a single
+    class at a time.
+</p>
+
+</body>
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/dsl/Arguments.java b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/Arguments.java
new file mode 100644
index 0000000..9ff669f
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/Arguments.java
@@ -0,0 +1,213 @@
+package net.sourceforge.cobertura.dsl;
+
+import net.sourceforge.cobertura.check.CoverageThreshold;
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.instrument.CoberturaFile;
+
+import java.io.File;
+import java.util.*;
+
+import org.apache.oro.text.regex.Pattern;
+
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/**
+ * Encapsulates arguments;
+ */
+public class Arguments {
+
+	private String baseDirectory;
+	private File dataFile;
+	private File destinationDirectory;
+	private File commandsFile;
+	private FileFinder sources;
+
+	private Collection ignoreRegexes;
+	private Collection<Pattern> ignoreBranchesRegexes;
+	private Collection<Pattern> classPatternIncludeClassesRegexes;
+	private Collection<Pattern> classPatternExcludeClassesRegexes;
+	private boolean calculateMethodComplexity;
+	private boolean failOnError;
+	private boolean ignoreTrivial;
+	private boolean threadsafeRigorous;
+
+	private String encoding;
+
+	private Set<CoverageThreshold> minimumCoverageThresholds;
+	private double classLineThreshold;
+	private double classBranchThreshold;
+	private double packageLineThreshold;
+	private double packageBranchThreshold;
+	private double totalLineThreshold;
+	private double totalBranchThreshold;
+
+	private Set<CoberturaFile> filesToInstrument;
+	private Set<File> filesToMerge;
+	private Set<String> ignoreMethodAnnotations;
+	private Set<String> ignoreClassAnnotations;
+
+	Arguments(String baseDirectory, File dataFile, File destinationDirectory,
+			File commandsFile, Collection ignoreRegexes,
+			Collection<Pattern> ignoreBranchesRegexes,
+			Collection<Pattern> classPatternIncludeClassesRegexes,
+			Collection<Pattern> classPatternExcludeClassesRegexes,
+			boolean calculateMethodComplexity,
+			boolean failOnError, boolean ignoreTrivial,
+			boolean threadsafeRigorous, String encoding,
+			Set<CoverageThreshold> minimumCoverageThresholds,
+			double classLineThreshold, double classBranchThreshold,
+			double packageLineThreshold, double packageBranchThreshold,
+			double totalLineThreshold, double totalBranchThreshold,
+			Set<CoberturaFile> filesToInstrument, Set<File> filesToMerge,
+			Set<String> ignoreMethodAnnotations,
+			Set<String> ignoreClassAnnotations, FileFinder sources) {
+		this.baseDirectory = baseDirectory;
+		this.dataFile = dataFile;
+		this.destinationDirectory = destinationDirectory;
+		this.commandsFile = commandsFile;
+		this.ignoreRegexes = ignoreRegexes;
+		this.sources = sources;
+		this.ignoreBranchesRegexes = Collections
+				.unmodifiableCollection(ignoreBranchesRegexes);
+		this.classPatternIncludeClassesRegexes = Collections
+				.unmodifiableCollection(classPatternIncludeClassesRegexes);
+		this.classPatternExcludeClassesRegexes = Collections
+				.unmodifiableCollection(classPatternExcludeClassesRegexes);
+		this.calculateMethodComplexity = calculateMethodComplexity;
+		this.failOnError = failOnError;
+		this.ignoreTrivial = ignoreTrivial;
+		this.threadsafeRigorous = threadsafeRigorous;
+		this.encoding = encoding;
+		this.minimumCoverageThresholds = Collections
+				.unmodifiableSet(minimumCoverageThresholds);
+		this.classLineThreshold = classLineThreshold;
+		this.classBranchThreshold = classBranchThreshold;
+		this.packageLineThreshold = packageLineThreshold;
+		this.packageBranchThreshold = packageBranchThreshold;
+		this.totalLineThreshold = totalLineThreshold;
+		this.totalBranchThreshold = totalBranchThreshold;
+		this.filesToInstrument = Collections.unmodifiableSet(filesToInstrument);
+		this.filesToMerge = Collections.unmodifiableSet(filesToMerge);
+		this.ignoreMethodAnnotations = Collections
+				.unmodifiableSet(ignoreMethodAnnotations);
+		this.ignoreClassAnnotations = Collections
+				.unmodifiableSet(ignoreClassAnnotations);
+	}
+
+	public String getBaseDirectory() {
+		return baseDirectory;
+	}
+
+	public File getDataFile() {
+		return dataFile;
+	}
+
+	public File getDestinationDirectory() {
+		return destinationDirectory;
+	}
+
+	public File getCommandsFile() {
+		return commandsFile;
+	}
+
+	public Collection getIgnoreRegexes() {
+		return ignoreRegexes;
+	}
+
+	public Collection<Pattern> getIgnoreBranchesRegexes() {
+		return ignoreBranchesRegexes;
+	}
+
+	public Collection<Pattern> getClassPatternIncludeClassesRegexes() {
+		return classPatternIncludeClassesRegexes;
+	}
+
+	public Collection<Pattern> getClassPatternExcludeClassesRegexes() {
+		return classPatternExcludeClassesRegexes;
+	}
+
+	public boolean isCalculateMethodComplexity() {
+		return calculateMethodComplexity;
+	}
+
+	public boolean isFailOnError() {
+		return failOnError;
+	}
+
+	public boolean isIgnoreTrivial() {
+		return ignoreTrivial;
+	}
+
+	public boolean isThreadsafeRigorous() {
+		return threadsafeRigorous;
+	}
+
+	public String getEncoding() {
+		return encoding;
+	}
+
+	public Set<CoverageThreshold> getMinimumCoverageThresholds() {
+		return minimumCoverageThresholds;
+	}
+
+	public double getClassLineThreshold() {
+		return classLineThreshold;
+	}
+
+	public double getClassBranchThreshold() {
+		return classBranchThreshold;
+	}
+
+	public double getPackageLineThreshold() {
+		return packageLineThreshold;
+	}
+
+	public double getPackageBranchThreshold() {
+		return packageBranchThreshold;
+	}
+
+	public double getTotalLineThreshold() {
+		return totalLineThreshold;
+	}
+
+	public double getTotalBranchThreshold() {
+		return totalBranchThreshold;
+	}
+
+	public Set<CoberturaFile> getFilesToInstrument() {
+		return filesToInstrument;
+	}
+
+	public Set<File> getFilesToMerge() {
+		return filesToMerge;
+	}
+
+	public Set<String> getIgnoreMethodAnnotations() {
+		return ignoreMethodAnnotations;
+	}
+
+	public FileFinder getSources() {
+		return sources;
+	}
+
+	public Set<String> getIgnoreClassAnnotations() {
+		return ignoreClassAnnotations;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/dsl/ArgumentsBuilder.java b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/ArgumentsBuilder.java
new file mode 100644
index 0000000..4f60e88
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/ArgumentsBuilder.java
@@ -0,0 +1,330 @@
+package net.sourceforge.cobertura.dsl;
+
+import net.sourceforge.cobertura.check.CoverageThreshold;
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.instrument.CoberturaFile;
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.util.RegexUtil;
+import org.apache.oro.text.regex.Pattern;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.*;
+
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/**
+ * Arguments builder - provides a DSL to build cobertura Arguments
+ */
+public class ArgumentsBuilder {
+	// Visible for testing
+	static final String DEFAULT_ENCODING = "UTF-8";
+	static final double DEFAULT_THRESHOLD = 0.;
+	static final boolean DEFAULT_CALCULATE_METHOD_COMPLEXITY = false;
+	static final boolean DEFAULT_FAIL_ON_ERROR = false;
+	static final boolean DEFAULT_IGNORE_TRIVIAL = false;
+	static final boolean DEFAULT_THREADSAFE_RIGOROUS = false;
+
+	private Arguments arguments;
+
+	private String baseDirectory;
+	private File dataFile;
+	private File destinationDirectory;
+	private File commandsFile;
+	private List<CodeSource> sources;
+
+	private Collection ignoreRegexes;
+	private Collection<Pattern> ignoreBranchesRegexes;
+	private Collection<Pattern> classPatternIncludeClassesRegexes;
+	private Collection<Pattern> classPatternExcludeClassesRegexes;
+	private boolean calculateMethodComplexity;
+	private boolean failOnError;
+	private boolean ignoreTrivial;
+	private boolean threadsafeRigorous;
+
+	private String encoding;
+
+	private Set<CoverageThreshold> minimumCoverageThresholds;
+	private double classLineThreshold;
+	private double classBranchThreshold;
+	private double packageLineThreshold;
+	private double packageBranchThreshold;
+	private double totalLineThreshold;
+	private double totalBranchThreshold;
+
+	private Set<CoberturaFile> filesToInstrument;
+	private Set<File> filesToMerge;
+	private Set<String> ignoreMethodAnnotations;
+	private Set<String> ignoreClassAnnotations;
+
+	public ArgumentsBuilder() {
+		initVariables();
+	}
+
+	public ArgumentsBuilder setBaseDirectory(String baseDir) {
+		baseDirectory = baseDir;
+		return this;
+	}
+
+	public ArgumentsBuilder setDataFile(String dataFile) {
+		this.dataFile = new File(dataFile);
+		return this;
+	}
+
+	public ArgumentsBuilder setDestinationDirectory(String destinationDir) {
+		this.destinationDirectory = new File(destinationDir);
+		return this;
+	}
+
+	public ArgumentsBuilder setCommandsFile(String commandsFile) {
+		this.commandsFile = new File(commandsFile);
+		return this;
+	}
+
+	public ArgumentsBuilder addIgnoreRegex(String regex) {
+		RegexUtil.addRegex(ignoreRegexes, regex);;
+		return this;
+	}
+
+	public ArgumentsBuilder addIgnoreBranchRegex(String regex) {
+		RegexUtil.addRegex(ignoreBranchesRegexes, regex);
+		return this;
+	}
+
+	public ArgumentsBuilder addIgnoreMethodAnnotation(
+			String ignoreMethodAnnotation) {
+		ignoreMethodAnnotations.add(ignoreMethodAnnotation);
+		return this;
+	}
+
+	public ArgumentsBuilder addIgnoreClassAnnotation(
+			String ignoreClassAnnotation) {
+		ignoreClassAnnotations.add(ignoreClassAnnotation);
+		return this;
+	}
+
+	public ArgumentsBuilder addExcludeClassesRegex(String regex) {
+		RegexUtil.addRegex(classPatternExcludeClassesRegexes, regex);
+		return this;
+	}
+
+	public ArgumentsBuilder addIncludeClassesRegex(String regex) {
+		RegexUtil.addRegex(classPatternIncludeClassesRegexes, regex);
+		return this;
+	}
+
+	public ArgumentsBuilder calculateMethodComplexity(boolean calculateMethodComplexity) {
+		this.calculateMethodComplexity = calculateMethodComplexity;
+		return this;
+	}
+
+	public ArgumentsBuilder failOnError(boolean failOnError) {
+		this.failOnError = failOnError;
+		return this;
+	}
+
+	public ArgumentsBuilder ignoreTrivial(boolean ignoreTrivial) {
+		this.ignoreTrivial = ignoreTrivial;
+		return this;
+	}
+
+	public ArgumentsBuilder threadsafeRigorous(boolean threadsafeRigorous) {
+		this.threadsafeRigorous = threadsafeRigorous;
+		return this;
+	}
+
+	public ArgumentsBuilder listOfFilesToInstrument(String listFileName) {
+		String baseDir = getBaseDirectory();
+		try {
+			File file = new File(listFileName);
+			FileReader fileReader = new FileReader(file);
+			BufferedReader bufferedReader = new BufferedReader(fileReader);
+			StringBuffer stringBuffer = new StringBuffer();
+			String line;
+			while ((line = bufferedReader.readLine()) != null) {
+				line = line.replace(baseDir, "");
+				filesToInstrument.add(new CoberturaFile(baseDir, line));
+			}
+			fileReader.close();
+		} catch (IOException e) {
+		  e.printStackTrace();
+		}
+		return this;
+	}
+
+	public ArgumentsBuilder setEncoding(String encoding) {
+		this.encoding = encoding;
+		return this;
+	}
+
+	public ArgumentsBuilder addMinimumCoverageRates(String regex,
+			double branchPercentage, double linePercentage) {
+		minimumCoverageThresholds.add(new CoverageThreshold(regex,
+				branchPercentage, linePercentage));
+		return this;
+	}
+
+	public ArgumentsBuilder setClassBranchCoverageThreshold(
+			double coverageThreshold) {
+		classBranchThreshold = inRange(coverageThreshold);
+		return this;
+	}
+
+	public ArgumentsBuilder setClassLineCoverageThreshold(
+			double coverageThreshold) {
+		classLineThreshold = inRange(coverageThreshold);
+		return this;
+	}
+
+	public ArgumentsBuilder setPackageBranchCoverageThreshold(
+			double coverageThreshold) {
+		packageBranchThreshold = inRange(coverageThreshold);
+		return this;
+	}
+
+	public ArgumentsBuilder setPackageLineCoverageThreshold(
+			double coverageThreshold) {
+		packageLineThreshold = inRange(coverageThreshold);
+		return this;
+	}
+
+	public ArgumentsBuilder setTotalBranchCoverageThreshold(
+			double coverageThreshold) {
+		totalBranchThreshold = inRange(coverageThreshold);
+		return this;
+	}
+
+	public ArgumentsBuilder setTotalLineCoverageThreshold(
+			double coverageThreshold) {
+		totalLineThreshold = inRange(coverageThreshold);
+		return this;
+	}
+
+	public ArgumentsBuilder addFileToInstrument(String file) {
+		String baseDir = getBaseDirectory();
+		if ( baseDir != null ) {
+			file = file.replace(baseDir, "");
+		}
+
+		filesToInstrument.add(new CoberturaFile(baseDir, file));
+		return this;
+	}
+
+	public ArgumentsBuilder addFileToMerge(String file) {
+		filesToMerge.add(new File(file));
+		return this;
+	}
+
+	public ArgumentsBuilder addSources(String sourcePath, boolean isDirectory) {
+		if (this.sources == null) {
+			this.sources = new ArrayList<CodeSource>();
+		}
+		this.sources.add(new CodeSource(isDirectory, sourcePath));
+		return this;
+	}
+
+	public Arguments build() {
+		FileFinder sources = new FileFinder();
+
+		if (this.sources != null) {
+			for (CodeSource codeSource : this.sources) {
+				if (codeSource.isDirectory()) {
+					sources.addSourceDirectory(codeSource.getPath());
+				} else {
+					sources.addSourceFile(getBaseDirectory(),
+							codeSource.getPath());
+				}
+			}
+		}
+
+		return new Arguments(baseDirectory, dataFile, destinationDirectory,
+				commandsFile, ignoreRegexes, ignoreBranchesRegexes,
+				classPatternIncludeClassesRegexes,
+				classPatternExcludeClassesRegexes, calculateMethodComplexity,
+				failOnError, ignoreTrivial,
+				threadsafeRigorous, encoding, minimumCoverageThresholds,
+				classLineThreshold, classBranchThreshold, packageLineThreshold,
+				packageBranchThreshold, totalLineThreshold,
+				totalBranchThreshold, filesToInstrument, filesToMerge,
+				ignoreMethodAnnotations, ignoreClassAnnotations, sources);
+	}
+
+	private double inRange(double coverageRate) {
+		if ((coverageRate >= 0.) && (coverageRate <= 1.)) {
+			return coverageRate;
+		}
+		throw new IllegalArgumentException(String.format(
+				"The value %s is invalid.  Rates must be between 0.0 and 1.0",
+				coverageRate));
+	}
+
+	private void initVariables() {
+		dataFile = CoverageDataFileHandler.getDefaultDataFile();
+//		baseDirectory = new File(".");
+		ignoreRegexes = new Vector();
+		ignoreBranchesRegexes = new Vector<Pattern>();
+		ignoreMethodAnnotations = new HashSet<String>();
+		ignoreClassAnnotations = new HashSet<String>();
+		classPatternExcludeClassesRegexes = new HashSet<Pattern>();
+		classPatternIncludeClassesRegexes = new HashSet<Pattern>();
+		filesToInstrument = new HashSet<CoberturaFile>();
+		filesToMerge = new HashSet<File>();
+		minimumCoverageThresholds = new HashSet<CoverageThreshold>();
+
+		// previous rule was: default threshold is 0.5 for all
+		// if a threshold is specified, the others are defaulted to 0
+		classBranchThreshold = DEFAULT_THRESHOLD;
+		classLineThreshold = DEFAULT_THRESHOLD;
+		packageBranchThreshold = DEFAULT_THRESHOLD;
+		packageLineThreshold = DEFAULT_THRESHOLD;
+		totalBranchThreshold = DEFAULT_THRESHOLD;
+		totalLineThreshold = DEFAULT_THRESHOLD;
+
+		calculateMethodComplexity = DEFAULT_CALCULATE_METHOD_COMPLEXITY;
+		failOnError = DEFAULT_FAIL_ON_ERROR;
+		ignoreTrivial = DEFAULT_IGNORE_TRIVIAL;
+		threadsafeRigorous = DEFAULT_THREADSAFE_RIGOROUS;
+		encoding = DEFAULT_ENCODING;
+	}
+
+	private String getBaseDirectory() {
+		return baseDirectory;
+	}
+
+	private static class CodeSource {
+		private boolean directory;
+		private String path;
+
+		private CodeSource(boolean directory, String path) {
+			this.directory = directory;
+			this.path = path;
+		}
+
+		public boolean isDirectory() {
+			return directory;
+		}
+
+		public String getPath() {
+			return path;
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/dsl/Cobertura.java b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/Cobertura.java
new file mode 100644
index 0000000..67d0eed
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/Cobertura.java
@@ -0,0 +1,153 @@
+package net.sourceforge.cobertura.dsl;
+
+import net.sourceforge.cobertura.check.CheckCoverageTask;
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.instrument.CodeInstrumentationTask;
+import net.sourceforge.cobertura.merge.MergeProjectDataFilesTask;
+import net.sourceforge.cobertura.reporting.ComplexityCalculator;
+import net.sourceforge.cobertura.reporting.CompositeReport;
+import net.sourceforge.cobertura.reporting.NativeReport;
+import net.sourceforge.cobertura.reporting.Report;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnProjectData;
+
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+public class Cobertura {
+
+	private Arguments args;
+	private ProjectData projectData;
+	private CodeInstrumentationTask instrumentationTask;
+	private CheckCoverageTask checkCoverageTask;
+	private MergeProjectDataFilesTask mergeProjectDataFilesTask;
+
+	private AtomicBoolean didApplyInstrumentationResults;
+
+	private CompositeReport report;
+
+	/*
+	 * Private constructor so we get sure Cobertura
+	 * is always initialized with Arguments
+	 */
+	private Cobertura() {
+		report = new CompositeReport();
+	}
+
+	public Cobertura(Arguments arguments) {
+		report = new CompositeReport();
+		args = arguments;
+		instrumentationTask = new CodeInstrumentationTask();
+		checkCoverageTask = new CheckCoverageTask();
+		mergeProjectDataFilesTask = new MergeProjectDataFilesTask();
+
+		didApplyInstrumentationResults = new AtomicBoolean(false);
+	}
+
+	/**
+	 * Instruments the code. Should be invoked after compiling.
+	 * Classes to be instrumented are taken from constructor args
+	 * @return this Cobertura instance
+	 * @throws Throwable
+	 */
+	public Cobertura instrumentCode() throws Throwable {
+		instrumentationTask.instrument(args, getProjectDataInstance());
+		return this;
+	}
+
+	/**
+	 * This should be invoked after running tests.
+	 * @return this Cobertura instance
+	 */
+	public Cobertura calculateCoverage() {
+		applyTouchesOnProjectData(projectData);
+		didApplyInstrumentationResults.set(true);
+		return this;
+	}
+
+	/**
+	 * Checks metrics values against thresholds
+	 * @return this Cobertura instance
+	 */
+	public Cobertura checkThresholds() {
+		report.addReport(checkCoverageTask.checkCoverage(args,
+				getProjectDataInstance()));
+		return this;
+	}
+
+	/**
+	 * Merges specified project data files as specified on arguments;
+	 * @return this Cobertura instance
+	 */
+	public Cobertura merge() {
+		mergeProjectDataFilesTask.mergeProjectDataFiles(args,
+				getProjectDataInstance());
+		return this;
+	}
+
+	/**
+	 * Creates a report with coverage and metrics data
+	 * @return Report instance, never <code>null</code>
+	 */
+	public Report report() {
+		//		if (!didApplyInstrumentationResults.get()) {
+		//			calculateCoverage();
+		//		}
+
+		ComplexityCalculator complexityCalculator = new ComplexityCalculator(
+				args.getSources());
+		complexityCalculator.setEncoding(args.getEncoding());
+		complexityCalculator.setCalculateMethodComplexity(args.isCalculateMethodComplexity());
+
+		report.addReport(new NativeReport(getProjectDataInstance(), args
+				.getDestinationDirectory(), args.getSources(),
+				complexityCalculator, args.getEncoding()));
+
+		return report;
+	}
+
+	/**
+	 * Serializes project data to file specified in constructor args
+	 * @return this Cobertura instance
+	 */
+	public Cobertura saveProjectData() {
+		CoverageDataFileHandler.saveCoverageData(getProjectDataInstance(), args
+				.getDataFile());
+		return this;
+	}
+
+	/*  Aux methods  */
+	private ProjectData getProjectDataInstance() {
+		// Load project data; see notes at the beginning of CodeInstrumentationTask class
+		if (projectData != null) {
+			return projectData;
+		}
+		if (args.getDataFile().isFile())
+			projectData = CoverageDataFileHandler.loadCoverageData(args
+					.getDataFile());
+		if (projectData == null)
+			projectData = new ProjectData();
+
+		return projectData;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/dsl/ReportFormat.java b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/ReportFormat.java
new file mode 100644
index 0000000..70cc5e6
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/dsl/ReportFormat.java
@@ -0,0 +1,23 @@
+package net.sourceforge.cobertura.dsl;
+
+public enum ReportFormat {
+	XML("xml"), HTML("html"), SUMMARY_XML("summaryXml"), UNKNOWN("unknown");
+
+	private ReportFormat(String format) {
+		this.format = format;
+	}
+	private String format;
+	@Override
+	public String toString() {
+		return format;
+	}
+
+	public static ReportFormat getFromString(String format) {
+		for (ReportFormat reportFormat : values()) {
+			if (reportFormat.toString().equalsIgnoreCase(format)) {
+				return reportFormat;
+			}
+		}
+		return UNKNOWN;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/AbstractFindTouchPointsClassInstrumenter.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/AbstractFindTouchPointsClassInstrumenter.java
new file mode 100644
index 0000000..6d5cf72
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/AbstractFindTouchPointsClassInstrumenter.java
@@ -0,0 +1,113 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import net.sourceforge.cobertura.instrument.pass1.DetectDuplicatedCodeClassVisitor;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.util.CheckClassAdapter;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
+
+/**
+ * Class extending {@link ClassVisitor} that provides features used by all three passes of instrumentation.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class AbstractFindTouchPointsClassInstrumenter extends ClassVisitor {
+	/**
+	 * List of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	private Collection<Pattern> ignoreRegexp;
+
+	/**
+	 * We assign 'unique event identifiers' to every asm instruction or directive found in the file. Using the identifiers
+	 * we are able to distinguish if the instruction is the same as found in the other pass of instrumentation.
+	 * <p/>
+	 * We will use this 'generator' to provide this identifiers. Remember to acquire identifiers using {@link AtomicInteger#incrementAndGet()} (not {@link AtomicInteger#getAndIncrement()}!!!)
+	 */
+	protected AtomicInteger eventIdGenerator = new AtomicInteger(0);
+
+	/**
+	 * We need to assign a unique lineId to every found 'LINENUMBER' directive in the asm code.
+	 * <p/>
+	 * <p>Remember that there can exist such a scenario:
+	 * <pre>
+	 * LINENUMBER 15 L1  //assigned lineId=33
+	 * ...
+	 * LINENUMBER 16 L2  //assigned lineId=34
+	 * ...
+	 * LINENUMBER 15 L3  //assigned lineId=35
+	 * </pre>
+	 * This is a reason, why we are going to use this lineIds instead of just 'line number'
+	 * </p>
+	 * <p/>
+	 * <p>We will use this 'generator' to provide this identifiers. Remember to acquire identifiers using {@link AtomicInteger#incrementAndGet()} (not {@link AtomicInteger#getAndIncrement()}!!!)</p>
+	 * <p/>
+	 * <p>The {@link #lineIdGenerator} that generates the same identifiers is used by: {@link DetectDuplicatedCodeClassVisitor#lineIdGenerator}</p>
+	 */
+	protected final AtomicInteger lineIdGenerator = new AtomicInteger(0);
+
+	/**
+	 * <p>This is a map of found duplicates of line blocks. It's   (lineNumber -> (duplicate LineId -> orygin lineId))</p>
+	 * <p/>
+	 * <p>The duplicatedLinesMap can be created by a single pass of {@link DetectDuplicatedCodeClassVisitor} (read there for reasons of duplicated detection).</p>
+	 * <p/>
+	 * <p>The {@link #duplicatedLinesMap} is used to generate the same events Id  for events that occurs in ASM code as distinc instructions, but are reason of compilation of the same source-code (finally blocks problem).
+	 */
+	protected final Map<Integer, Map<Integer, Integer>> duplicatedLinesMap;
+
+	/**
+	 * @param cv                 - a listener for code-instrumentation events
+	 * @param ignoreRegexp       - list of patters of method calls that should be ignored from line-coverage-measurement
+	 * @param duplicatedLinesMap - map of found duplicates in the class. You should use {@link DetectDuplicatedCodeClassVisitor} to find the duplicated lines.
+	 */
+	public AbstractFindTouchPointsClassInstrumenter(ClassVisitor cv,
+			Collection<Pattern> ignoreRegexp,
+			Map<Integer, Map<Integer, Integer>> duplicatedLinesMap) {
+		super(Opcodes.ASM4, new CheckClassAdapter(cv, false));
+		this.ignoreRegexp = ignoreRegexp;
+		this.duplicatedLinesMap = duplicatedLinesMap;
+	}
+
+	/**
+	 * Gets list of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	public Collection<Pattern> getIgnoreRegexp() {
+		return ignoreRegexp;
+	}
+
+	/**
+	 * Sets list of pattern to know that we don't want trace lines that are calls to some methods
+	 */
+	public void setIgnoreRegexp(Collection<Pattern> ignoreRegexp) {
+		this.ignoreRegexp = ignoreRegexp;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/instrument/Archive.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/Archive.java
similarity index 83%
rename from src/net/sourceforge/cobertura/instrument/Archive.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/instrument/Archive.java
index c9396fa..65bfff4 100644
--- a/src/net/sourceforge/cobertura/instrument/Archive.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/Archive.java
@@ -1,106 +1,99 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2006 Mark Doliner
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-/**
- * This class represents an archive within an archive.
- * 
- * @author John Lewis
- */
-class Archive
-{
-
-	private byte[] bytes;
-	private boolean modified;
-	private CoberturaFile file;
-
-	/**
-	 * Create an object that holds a buffer to an archive that is within a parent archive.
-	 * 
-	 * @param file The parent archive on the hard drive that holds the child archive.
-	 * @param bytes The contents of the child archive.
-	 */
-	Archive(CoberturaFile file, byte[] bytes)
-	{
-		this.bytes = bytes;
-		this.file = file;
-	}
-
-	/**
-	 * Return an input stream for the contents of this archive (the child).
-	 * 
-	 * @return An InputStream for the contents.
-	 */
-	InputStream getInputStream()
-	{
-		return new ByteArrayInputStream(this.bytes);
-	}
-
-	/**
-	 * Set this archive's bytes after they have been modified via instrumentation.
-	 * 
-	 * @param bytes The new contents of the archive (instrumented).
-	 */
-	void setModifiedBytes(byte[] bytes)
-	{
-		this.bytes = bytes;
-		this.modified = true;
-	}
-
-	/**
-	 * Return true if this archive has been modified (instrumented).
-	 * 
-	 * @return true if modified.
-	 */
-	boolean isModified()
-	{
-		return modified;
-	}
-
-	/**
-	 * Return the contents of this archive.
-	 * 
-	 * @return A byte array with the contents of this archive.
-	 */
-	byte[] getBytes()
-	{
-		return this.bytes;
-	}
-
-	/**
-	 * Returns the parent archive that contains this archive.
-	 * 
-	 * @return A CoberturaFile representing the parent archive.
-	 */
-	CoberturaFile getCoberturaFile()
-	{
-		return this.file;
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Mark Doliner
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+/**
+ * This class represents an archive within an archive.
+ *
+ * @author John Lewis
+ */
+class Archive {
+
+	private byte[] bytes;
+	private boolean modified;
+	private CoberturaFile file;
+
+	/**
+	 * Create an object that holds a buffer to an archive that is within a parent archive.
+	 *
+	 * @param file  The parent archive on the hard drive that holds the child archive.
+	 * @param bytes The contents of the child archive.
+	 */
+	Archive(CoberturaFile file, byte[] bytes) {
+		this.bytes = bytes;
+		this.file = file;
+	}
+
+	/**
+	 * Return an input stream for the contents of this archive (the child).
+	 *
+	 * @return An InputStream for the contents.
+	 */
+	InputStream getInputStream() {
+		return new ByteArrayInputStream(this.bytes);
+	}
+
+	/**
+	 * Set this archive's bytes after they have been modified via instrumentation.
+	 *
+	 * @param bytes The new contents of the archive (instrumented).
+	 */
+	void setModifiedBytes(byte[] bytes) {
+		this.bytes = bytes;
+		this.modified = true;
+	}
+
+	/**
+	 * Return true if this archive has been modified (instrumented).
+	 *
+	 * @return true if modified.
+	 */
+	boolean isModified() {
+		return modified;
+	}
+
+	/**
+	 * Return the contents of this archive.
+	 *
+	 * @return A byte array with the contents of this archive.
+	 */
+	byte[] getBytes() {
+		return this.bytes;
+	}
+
+	/**
+	 * Returns the parent archive that contains this archive.
+	 *
+	 * @return A CoberturaFile representing the parent archive.
+	 */
+	CoberturaFile getCoberturaFile() {
+		return this.file;
+	}
+}
diff --git a/src/net/sourceforge/cobertura/instrument/ClassPattern.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/ClassPattern.java
similarity index 76%
rename from src/net/sourceforge/cobertura/instrument/ClassPattern.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/instrument/ClassPattern.java
index 0e4931a..e785d32 100644
--- a/src/net/sourceforge/cobertura/instrument/ClassPattern.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/ClassPattern.java
@@ -1,133 +1,132 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import net.sourceforge.cobertura.util.RegexUtil;
-
-/**
- * This class represents a collection of regular expressions that will be used to see
- * if a classname matches them.
- * 
- * Regular expressions are specified by calling add methods.  If no add methods are
- * called, this class will match any classname.
- * 
- * @author John Lewis
- *
- */
-public class ClassPattern
-{
-
-	private Collection includeClassesRegexes = new HashSet();
-
-	private Collection excludeClassesRegexes = new HashSet();
-
-	private static final String WEBINF_CLASSES = "WEB-INF/classes/";
-
-	/**
-	 * Returns true if any regular expressions have been specified by calling the
-	 * add methods.  If none are specified, this class matches anything.
-	 * 
-	 * @return true if any regular expressions have been specified
-	 */
-	boolean isSpecified()
-	{
-		return includeClassesRegexes.size() > 0;
-	}
-
-	/**
-	 * Check to see if a class matches this ClassPattern
-	 * 
-	 * If a pattern has not been specified, this matches anything.
-	 * 
-	 * This method also looks for "WEB-INF/classes" at the beginning of the
-	 * classname.  It is removed before checking for a match.
-	 * 
-	 * @param filename Either a full classname or a full class filename
-	 * @return true if the classname matches this ClassPattern or if this ClassPattern
-	 * has not been specified.
-	 */
-	boolean matches(String filename)
-	{
-		boolean matches = true;
-
-		if (isSpecified())
-		{
-			matches = false;
-			// Remove .class extension if it exists
-			if (filename.endsWith(".class"))
-			{
-				filename = filename.substring(0, filename.length() - 6);
-			}
-			filename = filename.replace('\\', '/');
-
-			filename = removeAnyWebInfClassesString(filename);
-
-			filename = filename.replace('/', '.');
-			if (RegexUtil.matches(includeClassesRegexes, filename))
-			{
-				matches = true;
-			}
-			if (matches && RegexUtil.matches(excludeClassesRegexes, filename))
-			{
-				matches = false;
-			}
-		}
-		return matches;
-	}
-
-	private String removeAnyWebInfClassesString(String filename)
-	{
-		if (filename.startsWith(WEBINF_CLASSES))
-		{
-			filename = filename.substring(WEBINF_CLASSES.length());
-		}
-		return filename;
-	}
-
-	/**
-	 * Add a regex to the list of class regexes to include.
-	 * 
-	 * @param regex A regular expression to add.
-	 */
-	void addIncludeClassesRegex(String regex)
-	{
-		RegexUtil.addRegex(includeClassesRegexes, regex);
-	}
-
-	/**
-	 * Add a regex to the list of class regexes to exclude.
-	 * 
-	 * @param regex
-	 */
-	void addExcludeClassesRegex(String regex)
-	{
-		RegexUtil.addRegex(excludeClassesRegexes, regex);
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import net.sourceforge.cobertura.util.RegexUtil;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.oro.text.regex.Pattern;
+
+/**
+ * This class represents a collection of regular expressions that will be used to see
+ * if a classname matches them.
+ * <p/>
+ * Regular expressions are specified by calling add methods.  If no add methods are
+ * called, this class will match any classname.
+ *
+ * @author John Lewis
+ */
+public class ClassPattern {
+
+	private Set<Pattern> includeClassesRegexes = new HashSet<Pattern>();
+
+	private Set<Pattern> excludeClassesRegexes = new HashSet<Pattern>();
+
+	private static final String WEBINF_CLASSES = "WEB-INF/classes/";
+
+	/**
+	 * Returns true if any regular expressions have been specified by calling the
+	 * add methods.  If none are specified, this class matches anything.
+	 *
+	 * @return true if any regular expressions have been specified
+	 */
+	boolean isSpecified() {
+		return includeClassesRegexes.size() > 0;
+	}
+
+	/**
+	 * Check to see if a class matches this ClassPattern
+	 * <p/>
+	 * If a pattern has not been specified, this matches anything.
+	 * <p/>
+	 * This method also looks for "WEB-INF/classes" at the beginning of the
+	 * classname.  It is removed before checking for a match.
+	 *
+	 * @param filename Either a full classname or a full class filename
+	 *
+	 * @return true if the classname matches this ClassPattern or if this ClassPattern
+	 *         has not been specified.
+	 */
+	boolean matches(String filename) {
+		boolean matches = true;
+
+		if (isSpecified()) {
+			matches = false;
+			// Remove .class extension if it exists
+			if (filename.endsWith(".class")) {
+				filename = filename.substring(0, filename.length() - 6);
+			}
+			filename = filename.replace('\\', '/');
+
+			filename = removeAnyWebInfClassesString(filename);
+
+			filename = filename.replace('/', '.');
+			if (RegexUtil.matches(includeClassesRegexes, filename)) {
+				matches = true;
+			}
+			if (matches && RegexUtil.matches(excludeClassesRegexes, filename)) {
+				matches = false;
+			}
+		}
+		return matches;
+	}
+
+	private String removeAnyWebInfClassesString(String filename) {
+		if (filename.startsWith(WEBINF_CLASSES)) {
+			filename = filename.substring(WEBINF_CLASSES.length());
+		}
+		return filename;
+	}
+
+	/**
+	 * Add a regex to the list of class regexes to include.
+	 *
+	 * @param regex A regular expression to add.
+	 */
+	void addIncludeClassesRegex(String regex) {
+		RegexUtil.addRegex(includeClassesRegexes, regex);
+	}
+
+	void addIncludeClassesRegex(Collection<Pattern> regexes) {
+		includeClassesRegexes.addAll(regexes);
+	}
+
+	/**
+	 * Add a regex to the list of class regexes to exclude.
+	 *
+	 * @param regex
+	 */
+	void addExcludeClassesRegex(String regex) {
+		RegexUtil.addRegex(excludeClassesRegexes, regex);
+	}
+
+	void addExcludeClassesRegex(Collection<Pattern> regexes) {
+		excludeClassesRegexes.addAll(regexes);
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaClassWriter.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaClassWriter.java
new file mode 100644
index 0000000..e88d1bc
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaClassWriter.java
@@ -0,0 +1,67 @@
+/**
+ * 
+ */
+package net.sourceforge.cobertura.instrument;
+
+import org.objectweb.asm.ClassWriter;
+
+/**
+ * @author schristou88
+ *
+ */
+public class CoberturaClassWriter extends ClassWriter {
+	public CoberturaClassWriter(final int flags) {
+		super(flags);
+	}
+
+	@Override
+	protected String getCommonSuperClass(final String type1, final String type2) {
+		try {
+			return super.getCommonSuperClass(type1, type2);
+		} catch (RuntimeException e) {
+			// Since the default super construction failed we need to dig further.
+		}
+
+		Class<?> c, d;
+		// If system class fails to load, then let's use the auxClasspath url instead.
+		try {
+			c = Class.forName(type1.replace('/', '.'), false, ClassLoader
+					.getSystemClassLoader());
+		} catch (Exception e) {
+			try {
+				c = Class.forName(type1.replace('/', '.'), false,
+						InstrumentMain.urlClassLoader);
+			} catch (Exception e1) {
+				throw new RuntimeException(e1);
+			}
+		}
+
+		// If system class fails to load, then let's use the auxClasspath url instead.
+		try {
+			d = Class.forName(type2.replace('/', '.'), false, ClassLoader
+					.getSystemClassLoader());
+		} catch (Exception e) {
+			try {
+				d = Class.forName(type2.replace('/', '.'), false,
+						InstrumentMain.urlClassLoader);
+			} catch (Exception e1) {
+				throw new RuntimeException(e1);
+			}
+		}
+
+		if (c.isAssignableFrom(d)) {
+			return type1;
+		}
+		if (d.isAssignableFrom(c)) {
+			return type2;
+		}
+		if (c.isInterface() || d.isInterface()) {
+			return "java/lang/Object";
+		} else {
+			do {
+				c = c.getSuperclass();
+			} while (!c.isAssignableFrom(d));
+			return c.getName().replace('.', '/');
+		}
+	}
+}
diff --git a/src/net/sourceforge/cobertura/instrument/CoberturaFile.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaFile.java
similarity index 84%
rename from src/net/sourceforge/cobertura/instrument/CoberturaFile.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaFile.java
index d22a1b8..6e54c43 100644
--- a/src/net/sourceforge/cobertura/instrument/CoberturaFile.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaFile.java
@@ -1,90 +1,82 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import java.io.File;
-
-import net.sourceforge.cobertura.util.ArchiveUtil;
-
-/**
- * This represents a regular File, but unlike java.io.File, the baseDir and 
- * relative pathname used to create it are saved for later use.
- * 
- * @author John Lewis
- */
-class CoberturaFile extends File
-{
-
-	private static final long serialVersionUID = 0L;
-
-	private String baseDir;
-	private String pathname;
-
-	CoberturaFile(String baseDir, String pathname)
-	{
-		super(baseDir, pathname);
-		this.baseDir = baseDir;
-		this.pathname = pathname;
-	}
-
-	public String getBaseDir()
-	{
-		return baseDir;
-	}
-
-	public String getPathname()
-	{
-		return pathname;
-	}
-
-	/**
-	 * @return True if file has an extension that matches one of the
-	 *         standard java archives, false otherwise.
-	 */
-	boolean isArchive()
-	{
-		if (!isFile())
-		{
-			return false;
-		}
-		return ArchiveUtil.isArchive(pathname);
-	}
-
-	/**
-	 * @return True if file has "class" as its extension,
-	 *         false otherwise.
-	 */
-	boolean isClass()
-	{
-		return isFile() && pathname.endsWith(".class");
-	}
-
-	public String toString()
-	{
-		return "pathname=" + pathname + " and baseDir=" + baseDir;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import net.sourceforge.cobertura.util.ArchiveUtil;
+
+import java.io.File;
+
+/**
+ * This represents a regular File, but unlike java.io.File, the baseDir and
+ * relative pathname used to create it are saved for later use.
+ *
+ * @author John Lewis
+ */
+public class CoberturaFile extends File {
+
+	private static final long serialVersionUID = 0L;
+
+	private String baseDir;
+	private String pathname;
+
+	public CoberturaFile(String baseDir, String pathname) {
+		super(baseDir, pathname);
+		this.baseDir = baseDir;
+		this.pathname = pathname;
+	}
+
+	public String getBaseDir() {
+		return baseDir;
+	}
+
+	public String getPathname() {
+		return pathname;
+	}
+
+	/**
+	 * @return True if file has an extension that matches one of the
+	 *         standard java archives, false otherwise.
+	 */
+	boolean isArchive() {
+		if (!isFile()) {
+			return false;
+		}
+		return ArchiveUtil.isArchive(pathname);
+	}
+
+	/**
+	 * @return True if file has "class" as its extension,
+	 *         false otherwise.
+	 */
+	boolean isClass() {
+		return isFile() && pathname.endsWith(".class");
+	}
+
+	public String toString() {
+		return "pathname=" + pathname + " and baseDir=" + baseDir;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaInstrumenter.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaInstrumenter.java
new file mode 100644
index 0000000..da4e986
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaInstrumenter.java
@@ -0,0 +1,358 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.instrument.pass1.DetectDuplicatedCodeClassVisitor;
+import net.sourceforge.cobertura.instrument.pass1.DetectIgnoredCodeClassVisitor;
+import net.sourceforge.cobertura.instrument.pass2.BuildClassMapClassVisitor;
+import net.sourceforge.cobertura.instrument.pass3.InjectCodeClassInstrumenter;
+import net.sourceforge.cobertura.util.IOUtil;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.util.CheckClassAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * Class that is responsible for the whole process of instrumentation of a single class.
+ * <p/>
+ * The class is instrumented in tree passes:
+ * <ol>
+ * <li>Read only: {@link DetectDuplicatedCodeClassVisitor} - we look for the same ASM code snippets
+ * rendered in different places of destination code</li>
+ * <li>Read only: {@link BuildClassMapClassVisitor} - finds all touch-points and other interesting
+ * information that are in the class and store it in {@link ClassMap}.
+ * <li>Real instrumentation: {@link InjectCodeClassInstrumenter}. Uses {#link ClassMap} to inject
+ * code into the class</li>
+ * </ol>
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class CoberturaInstrumenter {
+	private static final Logger logger = LoggerFactory
+			.getLogger(CoberturaInstrumenter.class);
+
+	/**
+	 * During the instrumentation process we are feeling {@link ProjectData}, to generate from
+	 * it the *.ser file.
+	 * <p/>
+	 * We now (1.10+) don't need to generate the file (it is not necessery for reporting), but we still
+	 * do it for backward compatibility (for example maven-cobertura-plugin expects it). We should avoid
+	 * this some day.
+	 */
+	private ProjectData projectData;
+
+	/**
+	 * The root directory for instrumented classes. If it is null, the instrumented classes are overwritten.
+	 */
+	private File destinationDirectory;
+
+	/**
+	 * List of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	private Collection<Pattern> ignoreRegexes = new Vector<Pattern>();
+
+	/**
+	 * Methods annotated by this annotations will be ignored during coverage measurement
+	 */
+	private Set<String> ignoreMethodAnnotations = new HashSet<String>();
+
+	/**
+	 * Classes annotated by this annotations will be ignored during
+	 * instrumentation
+	 */
+	private Set<String> ignoreClassAnnotations = new HashSet<String>();
+
+	/**
+	 * If true: Getters, Setters and simple initialization will be ignored by coverage measurement
+	 */
+	private boolean ignoreTrivial;
+
+	/**
+	 * If true: The process is interrupted when first error occured.
+	 */
+	private boolean failOnError;
+
+	/**
+	 * Setting to true causes cobertura to use more strict threadsafe model that is significantly
+	 * slower, but guarantees that number of hits counted for each line will be precise in multithread-environment.
+	 * <p/>
+	 * The option does not change measured coverage.
+	 * <p/>
+	 * In implementation it means that AtomicIntegerArray will be used instead of int[].
+	 */
+	private boolean threadsafeRigorous;
+
+	/**
+	 * Analyzes and instruments class given by path.
+	 * <p/>
+	 * <p>Also the {@link #projectData} structure is filled with information about the found touch-points</p>
+	 *
+	 * @param file - path to class that should be instrumented
+	 *
+	 * @return instrumentation result structure or null in case of problems
+	 */
+	public InstrumentationResult instrumentClass(File file) {
+		InputStream inputStream = null;
+		try {
+			logger.debug("Working on file:" + file.getAbsolutePath());
+			inputStream = new FileInputStream(file);
+			return instrumentClass(inputStream);
+		} catch (Throwable t) {
+			logger.warn("Unable to instrument file " + file.getAbsolutePath(),
+					t);
+			if (failOnError) {
+				throw new RuntimeException(
+						"Warning detected and failOnError is true", t);
+			} else {
+				return null;
+			}
+		} finally {
+			IOUtil.closeInputStream(inputStream);
+		}
+	}
+
+	/**
+	 * Analyzes and instruments class given by inputStream
+	 * <p/>
+	 * <p>Also the {@link #projectData} structure is filled with information about the found touch-points</p>
+	 *
+	 * @param inputStream - source of class to instrument	 *
+	 *
+	 * @return instrumentation result structure or null in case of problems
+	 */
+	public InstrumentationResult instrumentClass(InputStream inputStream)
+			throws IOException {
+		ClassReader cr0 = new ClassReader(inputStream);
+		ClassWriter cw0 = new ClassWriter(0);
+		DetectIgnoredCodeClassVisitor detectIgnoredCv = new DetectIgnoredCodeClassVisitor(
+				cw0, ignoreTrivial, ignoreMethodAnnotations);
+		DetectDuplicatedCodeClassVisitor cv0 = new DetectDuplicatedCodeClassVisitor(
+				detectIgnoredCv);
+		cr0.accept(cv0, 0);
+
+		ClassReader cr = new ClassReader(cw0.toByteArray());
+		ClassWriter cw = new ClassWriter(0);
+		BuildClassMapClassVisitor cv = new BuildClassMapClassVisitor(cw,
+				ignoreRegexes, ignoreClassAnnotations,
+				cv0.getDuplicatesLinesCollector(),
+				detectIgnoredCv.getIgnoredMethodNamesAndSignatures());
+
+		cr.accept(cv, ClassReader.EXPAND_FRAMES);
+
+		if (logger.isDebugEnabled()) {
+			logger
+					.debug("=============== Detected duplicated code =============");
+			Map<Integer, Map<Integer, Integer>> l = cv0
+					.getDuplicatesLinesCollector();
+			for (Map.Entry<Integer, Map<Integer, Integer>> m : l.entrySet()) {
+				if (m.getValue() != null) {
+					for (Map.Entry<Integer, Integer> pair : m.getValue()
+							.entrySet()) {
+						logger.debug(cv.getClassMap().getClassName() + ":"
+								+ m.getKey() + " " + pair.getKey() + "->"
+								+ pair.getValue());
+					}
+				}
+			}
+			logger
+					.debug("=============== End of detected duplicated code ======");
+		}
+
+		//TODO(ptab): Don't like the idea, but we have to be compatible (hope to remove the line in future release)
+		logger
+				.debug("Migrating classmap in projectData to store in *.ser file: "
+						+ cv.getClassMap().getClassName());
+
+		cv.getClassMap().applyOnProjectData(projectData,
+				cv.shouldBeInstrumented());
+
+		if (cv.shouldBeInstrumented()) {
+			/*
+			 *  BuildClassMapClassInstrumenter and DetectDuplicatedCodeClassVisitor has not modificated bytecode,
+			 *  so we can use any bytecode representation of that class.
+			 */
+			ClassReader cr2 = new ClassReader(cw0.toByteArray());
+			ClassWriter cw2 = new CoberturaClassWriter(
+					ClassWriter.COMPUTE_FRAMES);
+			cv.getClassMap().assignCounterIds();
+			logger.debug("Assigned " + cv.getClassMap().getMaxCounterId()
+					+ " counters for class:" + cv.getClassMap().getClassName());
+			InjectCodeClassInstrumenter cv2 = new InjectCodeClassInstrumenter(
+					cw2, ignoreRegexes, threadsafeRigorous, cv.getClassMap(),
+					cv0.getDuplicatesLinesCollector(), detectIgnoredCv
+							.getIgnoredMethodNamesAndSignatures());
+			cr2.accept(new CheckClassAdapter(cv2), ClassReader.SKIP_FRAMES);
+			StringWriter sw = new StringWriter();
+			PrintWriter pw = new PrintWriter(sw);
+			CheckClassAdapter.verify(new ClassReader(cw2.toByteArray()), false,
+					pw);
+			logger.debug(sw.toString());
+
+			return new InstrumentationResult(cv.getClassMap().getClassName(),
+					cw2.toByteArray());
+		} else {
+			logger.debug("Class shouldn't be instrumented: "
+					+ cv.getClassMap().getClassName());
+			return null;
+		}
+	}
+
+	/**
+	 * Analyzes and instruments class given by file.
+	 * <p/>
+	 * <p>If the {@link #destinationDirectory} is null, then the file is overwritten,
+	 * otherwise the class is stored into the {@link #destinationDirectory}</p>
+	 * <p/>
+	 * <p>Also the {@link #projectData} structure is filled with information about the found touch-points</p>
+	 *
+	 * @param file - source of class to instrument
+	 */
+	public void addInstrumentationToSingleClass(File file) {
+		logger.debug("Instrumenting class " + file.getAbsolutePath());
+
+		InstrumentationResult instrumentationResult = instrumentClass(file);
+		if (instrumentationResult != null) {
+			OutputStream outputStream = null;
+			try {
+				// If destinationDirectory is null, then overwrite
+				// the original, uninstrumented file.
+				File outputFile = (destinationDirectory == null)
+						? file
+						: new File(destinationDirectory,
+								instrumentationResult.className.replace('.',
+										File.separatorChar)
+										+ ".class");
+				logger.debug("Writing instrumented class into:"
+						+ outputFile.getAbsolutePath());
+
+				File parentFile = outputFile.getParentFile();
+				if (parentFile != null) {
+					parentFile.mkdirs();
+				}
+
+				outputStream = new FileOutputStream(outputFile);
+				outputStream.write(instrumentationResult.content);
+			} catch (Throwable t) {
+				logger.warn("Unable to write instrumented file "
+						+ file.getAbsolutePath(), t);
+				return;
+			} finally {
+				IOUtil.closeOutputStream(outputStream);
+			}
+		}
+	}
+
+	// ----------------- Getters and setters -------------------------------------
+
+	/**
+	 * Gets the root directory for instrumented classes. If it is null, the instrumented classes are overwritten.
+	 */
+	public File getDestinationDirectory() {
+		return destinationDirectory;
+	}
+
+	/**
+	 * Sets the root directory for instrumented classes. If it is null, the instrumented classes are overwritten.
+	 */
+	public void setDestinationDirectory(File destinationDirectory) {
+		this.destinationDirectory = destinationDirectory;
+	}
+
+	/**
+	 * Gets list of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	public Collection<Pattern> getIgnoreRegexes() {
+		return ignoreRegexes;
+	}
+
+	/**
+	 * Sets list of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	public void setIgnoreRegexes(Collection<Pattern> ignoreRegexes) {
+		this.ignoreRegexes = ignoreRegexes;
+	}
+
+	public void setIgnoreTrivial(boolean ignoreTrivial) {
+		this.ignoreTrivial = ignoreTrivial;
+	}
+
+	public void setIgnoreMethodAnnotations(Set<String> ignoreMethodAnnotations) {
+		this.ignoreMethodAnnotations = ignoreMethodAnnotations;
+	}
+
+	public void setIgnoreClassAnnotations(Set<String> ignoreClassAnnotations) {
+		this.ignoreClassAnnotations = ignoreClassAnnotations;
+	}
+
+	public void setThreadsafeRigorous(boolean threadsafeRigorous) {
+		this.threadsafeRigorous = threadsafeRigorous;
+	}
+
+	public void setFailOnError(boolean failOnError) {
+		this.failOnError = failOnError;
+	}
+
+	/**
+	 * Sets {@link ProjectData} that will be filled with information about touch points inside instrumented classes
+	 *
+	 * @param projectData
+	 */
+	public void setProjectData(ProjectData projectData) {
+		this.projectData = projectData;
+	}
+
+	/**
+	 * Result of instrumentation is a pair of two fields:
+	 * <ul>
+	 * <li> {@link #content} - bytecode of the instrumented class
+	 * <li> {@link #className} - className of class being instrumented
+	 * </ul>
+	 */
+	public static class InstrumentationResult {
+		private String className;
+		private byte[] content;
+
+		public InstrumentationResult(String className, byte[] content) {
+			this.className = className;
+			this.content = content;
+		}
+
+		public String getClassName() {
+			return className;
+		}
+
+		public byte[] getContent() {
+			return content;
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CodeInstrumentationTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CodeInstrumentationTask.java
new file mode 100644
index 0000000..6bb0554
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CodeInstrumentationTask.java
@@ -0,0 +1,353 @@
+package net.sourceforge.cobertura.instrument;
+
+import net.sourceforge.cobertura.dsl.Arguments;
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.util.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <p>
+ * Add coverage instrumentation to existing classes.
+ * </p>
+ * <p/>
+ * <h3>What does that mean, exactly?</h3>
+ * <p>
+ * It means Cobertura will look at each class you give it.  It
+ * loads the bytecode into memory.  For each line of source,
+ * Cobertura adds a few extra instructions.  These instructions
+ * do the following:
+ * </p>
+ * <p/>
+ * <ol>
+ * <li>Get an instance of the ProjectData class.</li>
+ * <li>Call a method in this ProjectData class that increments
+ * a counter for this line of code.
+ * </ol>
+ * <p/>
+ * <p>
+ * After every line in a class has been "instrumented," Cobertura
+ * edits the bytecode for the class one more time and adds
+ * "implements net.sourceforge.cobertura.coveragedata.HasBeenInstrumented"
+ * This is basically just a flag used internally by Cobertura to
+ * determine whether a class has been instrumented or not, so
+ * as not to instrument the same class twice.
+ * </p>
+ */
+public class CodeInstrumentationTask {
+	private static final LoggerWrapper logger = new LoggerWrapper();
+	private CoberturaInstrumenter coberturaInstrumenter;
+	private File destinationDirectory;
+	private ClassPattern classPattern;
+
+	public CodeInstrumentationTask instrument(Arguments arguments,
+			ProjectData projectData) throws Throwable {
+		destinationDirectory = arguments.getDestinationDirectory();
+		classPattern = new ClassPattern();
+		coberturaInstrumenter = new CoberturaInstrumenter();
+		coberturaInstrumenter.setIgnoreRegexes(arguments.getIgnoreRegexes());
+		// Parse our parameters
+		Set<CoberturaFile> filePaths = arguments.getFilesToInstrument();
+
+		File dataFile = arguments.getDataFile();
+		destinationDirectory = arguments.getDestinationDirectory();
+		coberturaInstrumenter.setDestinationDirectory(destinationDirectory);
+		arguments.getIgnoreRegexes();
+		classPattern.addExcludeClassesRegex(arguments
+				.getClassPatternExcludeClassesRegexes());
+		classPattern.addIncludeClassesRegex(arguments
+				.getClassPatternIncludeClassesRegexes());
+		coberturaInstrumenter.setIgnoreTrivial(arguments.isIgnoreTrivial());
+		coberturaInstrumenter.setIgnoreMethodAnnotations(arguments
+				.getIgnoreMethodAnnotations());
+		coberturaInstrumenter.setIgnoreClassAnnotations(arguments
+				.getIgnoreClassAnnotations());
+		coberturaInstrumenter.setThreadsafeRigorous(arguments
+				.isThreadsafeRigorous());
+		coberturaInstrumenter.setFailOnError(arguments.isFailOnError());
+		coberturaInstrumenter.setProjectData(projectData);
+
+		// Instrument classes
+		logger.info(String.format("Instrumenting %s %s %s", filePaths.size(),
+				(filePaths.size() == 1 ? "file" : "files"),
+				(destinationDirectory != null ? " to "
+						+ destinationDirectory.getAbsoluteFile() : "")));
+
+		Iterator<CoberturaFile> iter = filePaths.iterator();
+		while (iter.hasNext()) {
+			CoberturaFile coberturaFile = iter.next();
+			if (coberturaFile.isArchive()) {
+				addInstrumentationToArchive(coberturaFile);
+			} else {
+				addInstrumentation(coberturaFile);
+			}
+		}
+
+		// Save coverage data (ser file with list of touch points, but not hits registered).
+		CoverageDataFileHandler.saveCoverageData(projectData, dataFile);
+		return this;
+	}
+
+	/**
+	 * @param entry A zip entry.
+	 *
+	 * @return True if the specified entry has "class" as its extension,
+	 *         false otherwise.
+	 */
+	private static boolean isClass(ZipEntry entry) {
+		return entry.getName().endsWith(".class");
+	}
+
+	private boolean addInstrumentationToArchive(CoberturaFile file,
+			InputStream archive, OutputStream output) throws Exception {
+		ZipInputStream zis = null;
+		ZipOutputStream zos = null;
+
+		try {
+			zis = new ZipInputStream(archive);
+			zos = new ZipOutputStream(output);
+			return addInstrumentationToArchive(file, zis, zos);
+		} finally {
+			zis = (ZipInputStream) IOUtil.closeInputStream(zis);
+			zos = (ZipOutputStream) IOUtil.closeOutputStream(zos);
+		}
+	}
+
+	private boolean addInstrumentationToArchive(CoberturaFile file,
+			ZipInputStream archive, ZipOutputStream output) throws Exception {
+		/*
+		 * "modified" is returned and indicates that something was instrumented.
+		 * If nothing is instrumented, the original entry will be used by the
+		 * caller of this method.
+		 */
+		boolean modified = false;
+		ZipEntry entry;
+		while ((entry = archive.getNextEntry()) != null) {
+			try {
+				String entryName = entry.getName();
+
+				/*
+				 * If this is a signature file then don't copy it,
+				 * but don't set modified to true.  If the only
+				 * thing we do is strip the signature, just use
+				 * the original entry.
+				 */
+				if (ArchiveUtil.isSignatureFile(entry.getName())) {
+					continue;
+				}
+				ZipEntry outputEntry = new ZipEntry(entry.getName());
+				outputEntry.setComment(entry.getComment());
+				outputEntry.setExtra(entry.getExtra());
+				outputEntry.setTime(entry.getTime());
+				output.putNextEntry(outputEntry);
+
+				// Read current entry
+				byte[] entryBytes = IOUtil
+						.createByteArrayFromInputStream(archive);
+
+				// Instrument embedded archives if a classPattern has been specified
+				if ((classPattern.isSpecified())
+						&& ArchiveUtil.isArchive(entryName)) {
+					Archive archiveObj = new Archive(file, entryBytes);
+					addInstrumentationToArchive(archiveObj);
+					if (archiveObj.isModified()) {
+						modified = true;
+						entryBytes = archiveObj.getBytes();
+						outputEntry.setTime(System.currentTimeMillis());
+					}
+				} else if (isClass(entry) && classPattern.matches(entryName)) {
+					try {
+						CoberturaInstrumenter.InstrumentationResult res = coberturaInstrumenter
+								.instrumentClass(new ByteArrayInputStream(
+										entryBytes));
+						if (res != null) {
+							logger.debug("Putting instrumented entry: "
+									+ entry.getName());
+							entryBytes = res.getContent();
+							modified = true;
+							outputEntry.setTime(System.currentTimeMillis());
+						}
+					} catch (Throwable t) {
+						if (entry.getName().endsWith("_Stub.class")) {
+							//no big deal - it is probably an RMI stub, and they don't need to be instrumented
+							logger.debug(
+									"Problems instrumenting archive entry: "
+											+ entry.getName(), t);
+						} else {
+							logger.warn(
+									"Problems instrumenting archive entry: "
+											+ entry.getName(), t);
+						}
+					}
+				}
+
+				// Add entry to the output
+				output.write(entryBytes);
+				output.closeEntry();
+				archive.closeEntry();
+			} catch (Exception e) {
+				logger.warn("Problems with archive entry: " + entry.getName(),
+						e);
+			} catch (Throwable t) {
+				logger.warn("Problems with archive entry: " + entry.getName(),
+						t);
+			}
+			output.flush();
+		}
+		return modified;
+	}
+
+	private void addInstrumentationToArchive(Archive archive) throws Exception {
+		InputStream in = null;
+		ByteArrayOutputStream out = null;
+		try {
+			in = archive.getInputStream();
+			out = new ByteArrayOutputStream();
+			boolean modified = addInstrumentationToArchive(archive
+					.getCoberturaFile(), in, out);
+
+			if (modified) {
+				out.flush();
+				byte[] bytes = out.toByteArray();
+				archive.setModifiedBytes(bytes);
+			}
+		} finally {
+			in = IOUtil.closeInputStream(in);
+			out = (ByteArrayOutputStream) IOUtil.closeOutputStream(out);
+		}
+	}
+
+	private void addInstrumentationToArchive(CoberturaFile archive) {
+		logger.debug("Instrumenting archive " + archive.getAbsolutePath());
+
+		File outputFile = null;
+		ZipInputStream input = null;
+		ZipOutputStream output = null;
+		boolean modified = false;
+		try {
+			// Open archive
+			try {
+				input = new ZipInputStream(new FileInputStream(archive));
+			} catch (FileNotFoundException e) {
+				logger.warn("Cannot open archive file: "
+						+ archive.getAbsolutePath(), e);
+				return;
+			}
+
+			// Open output archive
+			try {
+				// check if destination folder is set
+				if (destinationDirectory != null) {
+					// if so, create output file in it
+					outputFile = new File(destinationDirectory, archive
+							.getPathname());
+				} else {
+					// otherwise create output file in temporary location
+					outputFile = File.createTempFile(
+							"CoberturaInstrumentedArchive", "jar");
+					outputFile.deleteOnExit();
+				}
+				output = new ZipOutputStream(new FileOutputStream(outputFile));
+			} catch (IOException e) {
+				logger.warn("Cannot open file for instrumented archive: "
+						+ archive.getAbsolutePath(), e);
+				return;
+			}
+
+			// Instrument classes in archive
+			try {
+				modified = addInstrumentationToArchive(archive, input, output);
+			} catch (Throwable e) {
+				logger.warn("Cannot instrument archive: "
+						+ archive.getAbsolutePath(), e);
+				return;
+			}
+		} finally {
+			input = (ZipInputStream) IOUtil.closeInputStream(input);
+			output = (ZipOutputStream) IOUtil.closeOutputStream(output);
+		}
+
+		// If destination folder was not set, overwrite orginal archive with
+		// instrumented one
+		if (modified && (destinationDirectory == null)) {
+			try {
+				logger.debug("Moving " + outputFile.getAbsolutePath() + " to "
+						+ archive.getAbsolutePath());
+				IOUtil.moveFile(outputFile, archive);
+			} catch (IOException e) {
+				logger.warn("Cannot instrument archive: "
+						+ archive.getAbsolutePath(), e);
+				return;
+			}
+		}
+		if ((destinationDirectory != null) && (!modified)) {
+			outputFile.delete();
+		}
+	}
+
+	private void addInstrumentationToSingleClass(File file) {
+		logger.info("Instrumenting: " + file.getAbsolutePath() + " to "
+				+ destinationDirectory);
+		coberturaInstrumenter.addInstrumentationToSingleClass(file);
+	}
+
+	// TODO: Don't attempt to instrument a file if the outputFile already
+	//       exists and is newer than the input file, and the output and
+	//       input file are in different locations?
+	private void addInstrumentation(CoberturaFile coberturaFile) {
+		if (coberturaFile.isClass()
+				&& classPattern.matches(coberturaFile.getPathname())) {
+			addInstrumentationToSingleClass(coberturaFile);
+		} else if (coberturaFile.isDirectory()) {
+			String[] contents = coberturaFile.list();
+			for (int i = 0; i < contents.length; i++) {
+				File relativeFile = new File(coberturaFile.getPathname(),
+						contents[i]);
+				CoberturaFile relativeCoberturaFile = new CoberturaFile(
+						coberturaFile.getBaseDir(), relativeFile.toString());
+				//recursion!
+				addInstrumentation(relativeCoberturaFile);
+			}
+		}
+	}
+
+	// TODO: Preserved current behaviour, but this code is failing on WARN, not error
+	private static class LoggerWrapper {
+		private final Logger logger = LoggerFactory
+				.getLogger(LoggerWrapper.class);
+
+		private boolean failOnError = false;
+
+		public void setFailOnError(boolean failOnError) {
+			this.failOnError = failOnError;
+		}
+
+		public void debug(String message) {
+			logger.debug(message);
+		}
+
+		public void debug(String message, Throwable t) {
+			logger.debug(message, t);
+		}
+
+		public void info(String message) {
+			logger.debug(message);
+		}
+
+		public void warn(String message, Throwable t) {
+			logger.warn(message, t);
+			if (failOnError) {
+				throw new RuntimeException(
+						"Warning detected and failOnError is true", t);
+			}
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/ContextMethodAwareMethodAdapter.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/ContextMethodAwareMethodAdapter.java
new file mode 100644
index 0000000..f790afd
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/ContextMethodAwareMethodAdapter.java
@@ -0,0 +1,77 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Abstract implementation of {@link MethodVisitor} that:
+ * <ul>
+ * <li>provides information about {@link #className},{@link #methodName} and {@link #methodSignature} of method currently being instrumented/analyzed</li>
+ * <li>Assign line identifiers (see {@link AbstractFindTouchPointsClassInstrumenter#lineIdGenerator} to every LINENUMBER asm instruction found</li>
+ * </ul>
+ *
+ * @author ptab
+ */
+public abstract class ContextMethodAwareMethodAdapter extends MethodVisitor {
+	protected final String className;
+	protected final String methodName;
+	protected final String methodSignature;
+
+	/**
+	 * What was the last lineId assigned. We can read this field to know which line (by identifier) we are currently analyzing
+	 */
+	protected int lastLineId;
+
+	/**
+	 * Generator that assigns unique (in scope of single class) identifiers to every LINENUMBER asm derective.
+	 * <p/>
+	 * <p>We will use this 'generator' to provide this identifiers. Remember to acquire identifiers using {@link AtomicInteger#incrementAndGet()} (not {@link AtomicInteger#getAndIncrement()}!!!)</p>
+	 */
+	protected final AtomicInteger lineIdGenerator;
+
+	public ContextMethodAwareMethodAdapter(MethodVisitor mv, String className,
+			String methodName, String methodSignature,
+			AtomicInteger lineIdGenerator) {
+		super(Opcodes.ASM4, mv);
+		this.className = className;
+		this.methodName = methodName;
+		this.methodSignature = methodSignature;
+		lastLineId = 0;
+		this.lineIdGenerator = lineIdGenerator;
+	}
+
+	@Override
+	public void visitLineNumber(int number, Label label) {
+		lastLineId = lineIdGenerator.incrementAndGet();
+		super.visitLineNumber(number, label);
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter.java
new file mode 100644
index 0000000..6c963fa
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter.java
@@ -0,0 +1,343 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import net.sourceforge.cobertura.util.RegexUtil;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.VarInsnNode;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
+
+/**
+ * Analyzes given method, assign unique event identifiers to every found
+ * interesting instruction and calls business method in the {@link #touchPointListener}.
+ *
+ * @author ptab
+ */
+public class FindTouchPointsMethodAdapter
+		extends
+			ContextMethodAwareMethodAdapter {
+	/**
+	 * Source of identifiers for events.
+	 * <p/>
+	 * <p>Remember to acquire identifiers using {@link AtomicInteger#incrementAndGet()} (not {@link AtomicInteger#getAndIncrement()}!!!)</p>
+	 */
+	private final AtomicInteger eventIdGenerator;
+
+	/**
+	 * Backing listener that will be informed about all interesting events found
+	 */
+	private TouchPointListener touchPointListener;
+
+	/**
+	 * Line number of current line.
+	 * <p/>
+	 * <p>It it NOT lineId</pl>
+	 */
+	private int currentLine;
+
+	/**
+	 * List of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	private Collection ignoreRegexp;
+
+	/**
+	 * See {@link AbstractFindTouchPointsClassInstrumenter#duplicatedLinesMap}
+	 */
+	private final Map<Integer, Map<Integer, Integer>> duplicatedLinesMap;
+
+	/**
+	 * Map of (line number -> (lineId -> List of eventIds)).
+	 * <p/>
+	 * <p>For every line number, and for evere lineId in the line we store list of all generated events</p>
+	 * <p/>
+	 * <p>When we will detect duplicated block of code in given line - instead of generating new eventIds we will
+	 * use the same events</p>
+	 */
+	private final Map<Integer, Map<Integer, LinkedList<Integer>>> line2eventIds = new HashMap<Integer, Map<Integer, LinkedList<Integer>>>();
+
+	/**
+	 * If we are currently processing a new (not duplicated line), it is a list (linked into {@link #line2eventIds}) that we use to store newly generated identifiers into it,
+	 * otherwise it  is null.
+	 */
+	private LinkedList<Integer> saveEventIdList = null;
+
+	/**
+	 * If we are currently processing a duplicated line, it is a list of identifiers that should be used for the line. After processing event, you should remove identifier from the begining of the list.
+	 */
+	private LinkedList<Integer> replyEventIdList = null;
+
+	/**
+	 * State of last N instructions.
+	 */
+	private final List<AbstractInsnNode> backlog;
+
+	public FindTouchPointsMethodAdapter(HistoryMethodAdapter mv,
+			String className, String methodName, String methodSignature,
+			AtomicInteger eventIdGenerator,
+			Map<Integer, Map<Integer, Integer>> duplicatedLinesMap,
+			AtomicInteger lineIdGenerator) {
+		this(mv, mv.backlog(), className, methodName, methodSignature,
+				eventIdGenerator, duplicatedLinesMap, lineIdGenerator);
+	}
+
+	public FindTouchPointsMethodAdapter(MethodVisitor mv, String className,
+			String methodName, String methodSignature,
+			AtomicInteger eventIdGenerator,
+			Map<Integer, Map<Integer, Integer>> duplicatedLinesMap,
+			AtomicInteger lineIdGenerator) {
+		this(mv, Collections.<AbstractInsnNode> emptyList(), className,
+				methodName, methodSignature, eventIdGenerator,
+				duplicatedLinesMap, lineIdGenerator);
+	}
+
+	protected FindTouchPointsMethodAdapter(MethodVisitor mv,
+			List<AbstractInsnNode> backlog, String className,
+			String methodName, String methodSignature,
+			AtomicInteger eventIdGenerator,
+			Map<Integer, Map<Integer, Integer>> duplicatedLinesMap,
+			AtomicInteger lineIdGenerator) {
+		super(mv, className, methodName, methodSignature, lineIdGenerator);
+		this.backlog = backlog;
+		this.eventIdGenerator = eventIdGenerator;
+		this.duplicatedLinesMap = duplicatedLinesMap;
+	}
+
+	private int generateNewEventId() {
+		return eventIdGenerator.incrementAndGet();
+	}
+
+	/**
+	 * Depending on situation if we are processing a new line or duplicated line,
+	 * generates a new identifier or reuses previously generated for the same event.
+	 *
+	 * @return
+	 */
+	private int getEventId() {
+		if (replyEventIdList != null && !replyEventIdList.isEmpty()) {
+			//in case of a duplicated line
+			return replyEventIdList.removeFirst();
+		} else {
+			// in case of a new line
+			int eventId = generateNewEventId();
+			if (saveEventIdList != null) {
+				saveEventIdList.addLast(eventId);
+			}
+			return eventId;
+		}
+	}
+
+	@Override
+	public void visitCode() {
+		super.visitCode();
+		touchPointListener.afterMethodStart(mv);
+	}
+
+	/**
+	 * Processing information about new line.
+	 * <p/>
+	 * Upgrades {@link #replyEventIdList} and {@link #saveEventIdList} and calls {@link TouchPointListener#afterLineNumber(int, Label, int, MethodVisitor, String, String)}
+	 */
+	public void visitLineNumber(int line, Label label) {
+		super.visitLineNumber(line, label);
+		currentLine = line;
+
+		if (!isDuplicatedLine(line, lastLineId)) {
+			/*
+			 * It is a new line (first time seen, so we will save all found
+			 * events)
+			 */
+			replyEventIdList = null;
+			saveEventIdList = new LinkedList<Integer>();
+			Map<Integer, LinkedList<Integer>> eventsMap = line2eventIds
+					.get(line);
+			if (eventsMap == null) {
+				eventsMap = new HashMap<Integer, LinkedList<Integer>>();
+				line2eventIds.put(line, eventsMap);
+			}
+			eventsMap.put(lastLineId, saveEventIdList);
+		} else {
+			Integer orgin = getOriginForLine(line, lastLineId);
+			Map<Integer, LinkedList<Integer>> m = line2eventIds
+					.get(currentLine);
+			LinkedList<Integer> eventIds = m.get(orgin);
+
+			/* copy of  current list */
+			replyEventIdList = new LinkedList<Integer>(eventIds);
+			saveEventIdList = null;
+		}
+
+		touchPointListener.afterLineNumber(getEventId(), label, currentLine,
+				mv, methodName, methodSignature);
+	}
+
+	/**
+	 * Checks if given line is a duplicate of previously processed line
+	 *
+	 * @param line   - line number
+	 * @param lineId - line identifier
+	 *
+	 * @return true - if line is duplicate of previously processed lines
+	 */
+	private boolean isDuplicatedLine(int line, Integer lineId) {
+		return getOriginForLine(line, lineId) != null;
+	}
+
+	/**
+	 * @param line   - line number
+	 * @param lineId - line identifier
+	 *
+	 * @return lineId of the origin line (first processed line) that the given line is duplicate of.
+	 *         If the current line is not an duplicate of the previously processed line the method returns NULL.
+	 */
+	private Integer getOriginForLine(int line, Integer lineId) {
+		Map<Integer, Integer> labelMap = duplicatedLinesMap.get(line);
+		return labelMap != null ? labelMap.get(lineId) : null;
+	}
+
+	@Override
+	public void visitLabel(Label label) {
+		int eventId = getEventId();
+		touchPointListener.beforeLabel(eventId, label, currentLine, mv);
+		super.visitLabel(label);
+		touchPointListener.afterLabel(eventId, label, currentLine, mv);
+	}
+
+	@Override
+	public void visitJumpInsn(int opcode, Label label) {
+		/* Ignore any jump instructions in the "class init" method.
+		 When initializing static variables, the JVM first checks
+		 that the variable is null before attempting to set it.
+		 This check contains an IFNONNULL jump instruction which
+		 would confuse people if it showed up in the reports.*/
+		if ((opcode != Opcodes.GOTO) && (opcode != Opcodes.JSR)
+				&& (currentLine != 0) && (!methodName.equals("<clinit>"))) {
+			int eventId = getEventId();
+			touchPointListener.beforeJump(eventId, label, currentLine, mv);
+			super.visitJumpInsn(opcode, label);
+			touchPointListener.afterJump(eventId, label, currentLine, mv);
+		} else {
+			super.visitJumpInsn(opcode, label);
+		}
+	}
+
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String method,
+			String descr) {
+		super.visitMethodInsn(opcode, owner, method, descr);
+		//We skip lines that contains call to methods that are specified inside ignoreRegexp
+		if (RegexUtil.matches(ignoreRegexp, owner)) {
+			touchPointListener.ignoreLine(getEventId(), currentLine);
+		}
+	}
+
+	@Override
+	public void visitLookupSwitchInsn(Label def, int[] values, Label[] labels) {
+		touchPointListener.beforeSwitch(getEventId(), def, labels, currentLine,
+				mv, tryToFindSignatureOfConditionEnum());
+		super.visitLookupSwitchInsn(def, values, labels);
+	}
+
+	@Override
+	public void visitTableSwitchInsn(int min, int max, Label def, Label[] labels) {
+		touchPointListener.beforeSwitch(getEventId(), def, labels, currentLine,
+				mv, tryToFindSignatureOfConditionEnum());
+		super.visitTableSwitchInsn(min, max, def, labels);
+	}
+
+	enum Abc {
+		A, B
+	}
+
+	;
+
+	/**
+	 * We try to detect such a last 2 instructions and extract the enum signature.
+	 */
+	private String tryToFindSignatureOfConditionEnum() {
+		//		mv.visitMethodInsn(INVOKESTATIC, "net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter", "$SWITCH_TABLE$net$sourceforge$cobertura$instrument$FindTouchPointsMethodAdapter$Abc", "()[I");
+		//		mv.visitVarInsn(ALOAD, 1);
+		//		mv.visitMethodInsn(INVOKEVIRTUAL, "net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter$Abc", "ordinal", "()I");
+		//		mv.visitInsn(IALOAD);
+
+		if (backlog == null || backlog.size() < 4)
+			return null;
+		int last = backlog.size() - 1;
+		if ((backlog.get(last) instanceof InsnNode)
+				&& (backlog.get(last - 1) instanceof MethodInsnNode)
+				&& (backlog.get(last - 2) instanceof VarInsnNode)) {
+			VarInsnNode i2 = (VarInsnNode) backlog.get(last - 2);
+			MethodInsnNode i3 = (MethodInsnNode) backlog.get(last - 1);
+			InsnNode i4 = (InsnNode) backlog.get(last);
+			if ((i2.getOpcode() == Opcodes.ALOAD)
+					&& (i3.getOpcode() == Opcodes.INVOKEVIRTUAL && i3.name
+							.equals("ordinal"))
+					&& (i4.getOpcode() == Opcodes.IALOAD)) {
+				return i3.owner;
+			}
+		}
+		return null;
+	}
+
+	// ===========  Getters and setters =====================
+
+	/**
+	 * Gets backing listener that will be informed about all interesting events found
+	 */
+	public TouchPointListener getTouchPointListener() {
+		return touchPointListener;
+	}
+
+	/**
+	 * Niestety terminalnie.
+	 * Sets backing listener that will be informed about all interesting events found
+	 */
+	public void setTouchPointListener(TouchPointListener touchPointListener) {
+		this.touchPointListener = touchPointListener;
+	}
+
+	/**
+	 * @return list of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	public Collection<Pattern> getIgnoreRegexp() {
+		return ignoreRegexp;
+	}
+
+	/**
+	 * sets list of patterns to know that we don't want trace lines that are calls to some methods
+	 */
+	public void setIgnoreRegexp(Collection<Pattern> ignoreRegexp) {
+		this.ignoreRegexp = ignoreRegexp;
+	}
+
+}
\ No newline at end of file
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/HistoryMethodAdapter.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/HistoryMethodAdapter.java
new file mode 100644
index 0000000..aeba9ce
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/HistoryMethodAdapter.java
@@ -0,0 +1,163 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.*;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * A message adapter that keeps list of last N events.
+ *
+ * @author piotr.tabor at gmail.com.
+ */
+public class HistoryMethodAdapter extends MethodVisitor {
+
+	private final LinkedList<AbstractInsnNode> backlog = new LinkedList<AbstractInsnNode>();
+	private final int eventsToTrace;
+
+	public HistoryMethodAdapter(MethodVisitor mv, int eventsToTrace) {
+		super(Opcodes.ASM4, mv);
+		this.eventsToTrace = eventsToTrace;
+	}
+	public List<AbstractInsnNode> backlog() {
+		return Collections.unmodifiableList(backlog);
+	}
+
+	private void appendToBacklog(AbstractInsnNode node) {
+		if (backlog.size() >= eventsToTrace) {
+			backlog.removeFirst();
+		}
+		backlog.addLast(node);
+	}
+
+	@Override
+	public void visitFieldInsn(int arg0, String arg1, String arg2, String arg3) {
+		super.visitFieldInsn(arg0, arg1, arg2, arg3);
+		appendToBacklog(new FieldInsnNode(arg0, arg1, arg2, arg3));
+	}
+
+	@Override
+	public void visitFrame(int arg0, int arg1, Object[] arg2, int arg3,
+			Object[] arg4) {
+		super.visitFrame(arg0, arg1, arg2, arg3, arg4);
+		appendToBacklog(new FrameNode(arg0, arg1, arg2, arg3, arg4));
+	}
+
+	@Override
+	public void visitIincInsn(int arg0, int arg1) {
+		super.visitIincInsn(arg0, arg1);
+		appendToBacklog(new IincInsnNode(arg0, arg1));
+	}
+
+	@Override
+	public void visitInsn(int arg0) {
+		super.visitInsn(arg0);
+		appendToBacklog(new InsnNode(arg0));
+	}
+
+	@Override
+	public void visitIntInsn(int arg0, int arg1) {
+		super.visitIntInsn(arg0, arg1);
+		appendToBacklog(new IntInsnNode(arg0, arg1));
+	}
+
+	@Override
+	public void visitJumpInsn(int arg0, Label arg1) {
+		super.visitJumpInsn(arg0, arg1);
+		appendToBacklog(new JumpInsnNode(arg0, new LabelNode(arg1)));
+	}
+
+	@Override
+	public void visitLabel(Label arg0) {
+		super.visitLabel(arg0);
+		appendToBacklog(new LabelNode(arg0));
+	}
+
+	@Override
+	public void visitLdcInsn(Object arg0) {
+		super.visitLdcInsn(arg0);
+		appendToBacklog(new LdcInsnNode(arg0));
+	}
+
+	@Override
+	public void visitLineNumber(int arg0, Label arg1) {
+		super.visitLineNumber(arg0, arg1);
+		appendToBacklog(new LineNumberNode(arg0, new LabelNode(arg1)));
+	}
+
+	@Override
+	public void visitLookupSwitchInsn(Label arg0, int[] arg1, Label[] arg2) {
+		super.visitLookupSwitchInsn(arg0, arg1, arg2);
+		LabelNode nodes[] = new LabelNode[arg2.length];
+		for (int i = 0; i < arg2.length; i++) {
+			nodes[i] = new LabelNode(arg2[i]);
+		}
+		appendToBacklog(new LookupSwitchInsnNode(new LabelNode(arg0), arg1,
+				nodes));
+	}
+
+	@Override
+	public void visitMethodInsn(int arg0, String arg1, String arg2, String arg3) {
+		super.visitMethodInsn(arg0, arg1, arg2, arg3);
+		appendToBacklog(new MethodInsnNode(arg0, arg1, arg2, arg3));
+	}
+
+	@Override
+	public void visitMultiANewArrayInsn(String arg0, int arg1) {
+		super.visitMultiANewArrayInsn(arg0, arg1);
+		appendToBacklog(new MultiANewArrayInsnNode(arg0, arg1));
+	}
+
+	@Override
+	public void visitTableSwitchInsn(int arg0, int arg1, Label arg2,
+			Label[] arg3) {
+		super.visitTableSwitchInsn(arg0, arg1, arg2, arg3);
+		LabelNode nodes[] = new LabelNode[arg3.length];
+		for (int i = 0; i < arg3.length; i++) {
+			nodes[i] = new LabelNode(arg3[i]);
+		}
+		appendToBacklog(new TableSwitchInsnNode(arg0, arg1,
+				new LabelNode(arg2), nodes));
+	}
+
+	@Override
+	public void visitTypeInsn(int arg0, String arg1) {
+		super.visitTypeInsn(arg0, arg1);
+		appendToBacklog(new TypeInsnNode(arg0, arg1));
+	}
+
+	@Override
+	public void visitVarInsn(int arg0, int arg1) {
+		super.visitVarInsn(arg0, arg1);
+		appendToBacklog(new VarInsnNode(arg0, arg1));
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/InstrumentMain.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/InstrumentMain.java
new file mode 100644
index 0000000..bb21cb4
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/InstrumentMain.java
@@ -0,0 +1,193 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Joakim Erdfelt
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Jiri Mares
+ * Copyright (C) 2008 Scott Frederick
+ * Copyright (C) 2010 Tad Smith
+ * Copyright (C) 2010 Piotr Tabor
+ * Contact information for the above is given in the COPYRIGHT file.
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import net.sourceforge.cobertura.dsl.ArgumentsBuilder;
+import net.sourceforge.cobertura.dsl.Cobertura;
+import net.sourceforge.cobertura.util.*;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <p>
+ * Add coverage instrumentation to existing classes.
+ * </p>
+ * <p/>
+ * <h3>What does that mean, exactly?</h3>
+ * <p>
+ * It means Cobertura will look at each class you give it.  It
+ * loads the bytecode into memory.  For each line of source,
+ * Cobertura adds a few extra instructions.  These instructions
+ * do the following:
+ * </p>
+ * <p/>
+ * <ol>
+ * <li>Get an instance of the ProjectData class.</li>
+ * <li>Call a method in this ProjectData class that increments
+ * a counter for this line of code.
+ * </ol>
+ */
+public class InstrumentMain {
+	private static final LoggerWrapper logger = new LoggerWrapper();
+	public static URLClassLoader urlClassLoader;
+
+	public static int instrument(String[] args) {
+		Header.print(System.out);
+
+		long startTime = System.currentTimeMillis();
+
+		try {
+			args = CommandLineBuilder.preprocessCommandLineArguments(args);
+		} catch (Exception ex) {
+			System.err.println("Error: Cannot process arguments: "
+					+ ex.getMessage());
+			return 1;
+		}
+		try {
+			new Cobertura(createArgumentsFromCMDParams(args).build())
+					.instrumentCode().saveProjectData();
+		} catch (Throwable throwable) {
+			System.err.println(String.format(
+					"Failed while instrumenting code: %s", throwable
+							.getMessage()));
+			throwable.printStackTrace();
+			// This should probably return 1, but the old code didn't exit
+			// here, so we won't either...
+		}
+
+		long stopTime = System.currentTimeMillis();
+		logger.info("Instrument time: " + (stopTime - startTime) + "ms");
+		return 0;
+	}
+
+	public static void main(String[] args) {
+		int returnValue = instrument(args);
+		if ( returnValue != 0 ) {
+			System.exit(returnValue);
+		}
+	}
+
+	private static ArgumentsBuilder createArgumentsFromCMDParams(String[] args) {
+		ArgumentsBuilder builder = new ArgumentsBuilder();
+
+		// Parse parameters
+		for (int i = 0; i < args.length; i++) {
+			if (args[i].equals("--basedir")) {
+				String baseDir = args[++i];
+				builder.setBaseDirectory(baseDir);
+			} else if (args[i].equals("--datafile"))
+				builder.setDataFile(args[++i]);
+			else if (args[i].equals("--destination")) {
+				builder.setDestinationDirectory(args[++i]);
+			} else if (args[i].equals("--ignore")) {
+				builder.addIgnoreRegex(args[++i]);
+			} else if (args[i].equals("--ignoreMethodAnnotation")) {
+				builder.addIgnoreMethodAnnotation(args[++i]);
+			} else if (args[i].equals("--ignoreClassAnnotation")) {
+				builder.addIgnoreClassAnnotation(args[++i]);
+			} else if (args[i].equals("--ignoreTrivial")) {
+				builder.ignoreTrivial(true);
+			} else if (args[i].equals("--includeClasses")) {
+				builder.addIncludeClassesRegex(args[++i]);
+			} else if (args[i].equals("--excludeClasses")) {
+				builder.addExcludeClassesRegex(args[++i]);
+			} else if (args[i].equals("--failOnError")) {
+				builder.failOnError(true);
+				logger.setFailOnError(true);
+			} else if (args[i].equals("--threadsafeRigorous")) {
+				builder.threadsafeRigorous(true);
+			} else if (args[i].equals("--auxClasspath")) {
+				addElementsToJVM(args[++i]);
+                        } else if (args[i].equals("--listOfFilesToInstrument")) {
+                                builder.listOfFilesToInstrument(args[++i]);
+			} else {
+				builder.addFileToInstrument(args[i]);
+			}
+		}
+		return builder;
+	}
+
+	private static void addElementsToJVM(String classpath) {
+		List<URL> urlsArray = new ArrayList<URL>();
+		String[] classpathParsed = classpath.split(File.pathSeparator);
+
+		for (String element : classpathParsed) {
+			File f = null;
+			try {
+				f = new File(element);
+				urlsArray.add(f.toURI().toURL());
+			} catch (MalformedURLException e) {
+				logger.debug("Warning - could not convert file: " + element
+						+ " to a URL.", e);
+			}
+		}
+		urlClassLoader = new URLClassLoader(urlsArray.toArray(new URL[urlsArray
+				.size()]));
+	}
+
+	// TODO: Preserved current behaviour, but this code is failing on WARN, not error
+	private static class LoggerWrapper {
+		private final Logger logger = LoggerFactory
+				.getLogger(InstrumentMain.class);
+		private boolean failOnError = false;
+
+		public void setFailOnError(boolean failOnError) {
+			this.failOnError = failOnError;
+		}
+
+		public void debug(String message) {
+			logger.debug(message);
+		}
+
+		public void debug(String message, Throwable t) {
+			logger.debug(message, t);
+		}
+
+		public void info(String message) {
+			logger.debug(message);
+		}
+
+		public void warn(String message, Throwable t) {
+			logger.warn(message, t);
+			if (failOnError) {
+				throw new RuntimeException(
+						"Warning detected and failOnError is true", t);
+			}
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/Main.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/Main.java
new file mode 100644
index 0000000..8fc17dd
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/Main.java
@@ -0,0 +1,49 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Joakim Erdfelt
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Jiri Mares
+ * Copyright (C) 2008 Scott Frederick
+ * Copyright (C) 2010 Tad Smith 
+ * Copyright (C) 2010 Piotr Tabor  
+ * Contact information for the above is given in the COPYRIGHT file.
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+/**
+ * Deprecated wrapper class for the new CheckCoverageMain class.  It is only
+ * here to facilitate an orderly transition to the new class and will go
+ * away in a few releases
+ *
+ * @author Steven C. Saliman
+ */
+ at Deprecated
+public class Main {
+
+	public static void main(String[] args) {
+		System.err.println("net.sourceforge.cobertura.instrument.Main is a deprecated class.");
+		System.err.println("Please use net.sourceforge.cobertura.instrument.InstrumentMain instead");
+		InstrumentMain.main(args);
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/TouchPointListener.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/TouchPointListener.java
new file mode 100644
index 0000000..6e534b1
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/TouchPointListener.java
@@ -0,0 +1,134 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * <p>Interfaces of listener that is called if interesting 'place' is found in instrumented/analyzed code</p>
+ * <p/>
+ * It is guaranteed that the same 'eventIds' will be used for the same events (in the case of identical source byte-code),
+ * so you can use this ids to identify the same places between different passes of instrumentation.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public interface TouchPointListener {
+	/**
+	 * Event called when a new method have been just started for instrumentation. It is called
+	 * after method declaration has been read, but before 'a real' code has been processed.
+	 *
+	 * @param nextMethodVisitor - sink for instrumented code
+	 */
+	public void afterMethodStart(MethodVisitor nextMethodVisitor);
+
+	/**
+	 * <p>Before code responsible for realizing 'interesting' JUMP </p>
+	 * <p/>
+	 * <p>JUMP event is not called in case of GOTO and RETURN instruction (not conditional JUMPS)</p>
+	 *
+	 * @param eventId           - id of the detected event.
+	 * @param label             - destination label of the jump
+	 * @param currentLine       - number of currently visited line
+	 * @param nextMethodVisitor - sink for instrumented code
+	 */
+	public void afterJump(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor);
+
+	/**
+	 * <p>Called after code responsible for realizing 'interesting' JUMP </p>
+	 * <p/>
+	 * <p>JUMP event is not called in case of GOTO and RETURN instruction (not conditional JUMPS)</p>
+	 *
+	 * @param eventId           - id of the detected event.
+	 * @param label             - destination label of the jump
+	 * @param currentLine       - number of currently visited line
+	 * @param nextMethodVisitor - sink for instrumented code
+	 */
+	public void beforeJump(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor);
+
+	/**
+	 * after LINENUMBER instruction was processed.
+	 *
+	 * @param eventId           - id of the detected event.
+	 * @param label             - label connected to the line
+	 * @param currentLine       - number of currently visited line
+	 * @param nextMethodVisitor - sink for instrumented code
+	 * @param methodName        - name  of currently being instrumented method
+	 * @param methodSignature   - signature (params and returned value type) of currently being instrumented method
+	 */
+	public void afterLineNumber(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor, String methodName,
+			String methodSignature);
+
+	/**
+	 * <p>If we determined that some line should be not 'counted' by cobertura (for example the line might be specified in {@link AbstractFindTouchPointsClassInstrumenter#ignoreRegexp})
+	 * we call this method.</p>
+	 * <p/>
+	 * It's possible that {@link #afterLineNumber(int, Label, int, MethodVisitor, String, String)} event will be (or has been already) fired.
+	 *
+	 * @param eventId     - id of the event connected to the line (the same eventId that might be used for the line in {@link #afterLineNumber(int, Label, int, MethodVisitor, String, String)})
+	 * @param currentLine - number of line that should be ignored.
+	 */
+	public void ignoreLine(int eventId, int currentLine);
+
+	/**
+	 * Called befere processing switch statement.
+	 *
+	 * @param eventId       - id of the detected event.
+	 * @param def           - label of 'default' target label that will be used when none of given values match the switch
+	 * @param labels        - table of labels connected to switch 'values' (different switch branches). There might be duplicates in the table (fall-through in switch statement)
+	 * @param currentLine   - number of line in which the 'switch' keyword has been found (number of line currently being processed)
+	 * @param mv            - sink for instrumented (injected) code
+	 * @param conditionType - NULL (if undetected) or signature of variable used as a switch condition.	 *
+	 */
+	public void beforeSwitch(int eventId, Label def, Label[] labels,
+			int currentLine, MethodVisitor mv, String conditionType);
+
+	/**
+	 * Called before processing 'label' directive
+	 *
+	 * @param eventId     - id of the detected event.
+	 * @param label       - internal identifier of label being found (single pass of instrumentation valid only)
+	 * @param currentLine - number of line in which the 'switch' keyword has been found (number of line currently being processed)
+	 * @param mv          - sink for instrumented (injected) code
+	 */
+	public void beforeLabel(int eventId, Label label, int currentLine,
+			MethodVisitor mv);
+
+	/**
+	 * Called before processing 'label' directive
+	 *
+	 * @param eventId     - id of the detected event.
+	 * @param label       - internal identifier of label being found (single pass of instrumentation valid only)
+	 * @param currentLine - number of line in which the 'switch' keyword has been found (number of line currently being processed)
+	 * @param mv          - sink for instrumented (injected) code
+	 */
+	public void afterLabel(int eventId, Label label, int currentLine,
+			MethodVisitor mv);
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/CodeFootstamp.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/CodeFootstamp.java
new file mode 100644
index 0000000..233b83d
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/CodeFootstamp.java
@@ -0,0 +1,200 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass1;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.Opcodes;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+
+/**
+ * <p>Represents a single 'footprint' of some piece of ASM code. Is used to detect if two
+ * code pieces are (nearly) the same or different.</p>
+ * <p/>
+ * <p>During duplicate-detection we create {@link CodeFootstamp} for every block found starting with LINENUMBER directive.<br/>
+ * We appends to the {@link CodeFootstamp} all found 'jvm asm' instructions. When we found the end of the block (start of next line) we need to
+ * call {@link #finalize()}.  After that we are allowed to use {@link #hashCode()}, {@link #equals(Object)} and {@link #isMeaningful()} methods
+ * to compare two blocks and decide if they are duplicates or not.
+ * </p>
+ * <p/>
+ * We find two {@link CodeFootstamp} as duplicates not only when they are completely identical, but also if:
+ * <ul>
+ * <li> They start with another number of 'LABEL' instructions (see {@link #trimableIfFirst(String)})</li>
+ * <li> They differs in last instruction being  'LABEL', 'GOTO', 'RETURN' or 'ATHROW'  (see {@link #trimableIfLast(String)})</li>
+ * <li> They use different destination labels for JUMPs and SWITCHES</li>
+ * </ul>
+ * <p/>
+ * <p> You should also use {@link #isMeaningful()} method to avoid comparing two {@link CodeFootstamp} that are two short (for example empty).
+ * They would be probably found this snapshot as 'equal', but in fact the snapshoots are too short to proof anything.
+ * </p>
+ * <p/>
+ * <p>At the implementation level we encode all found instructions into list of String {@link #events} and we are comparing those string list.
+ * It's not beautiful design - but its simple and works.
+ * </p>
+ * <p/>
+ * <p>This class implements {@link #equals(Object)} and {@link #hashCode()} so might be used as key in maps</p>
+ */
+public class CodeFootstamp {
+	private final LinkedList<String> events = new LinkedList<String>();
+	private boolean finalized = false;
+
+	public void visitLabel(Label label) {
+		appendIfNotFinal("L");
+	}
+
+	private void appendIfNotFinal(String string) {
+		assertNotFinal();
+		events.addLast(string);
+	}
+
+	private void assertNotFinal() {
+		if (finalized) {
+			throw new IllegalStateException(
+					"The signature has bean already finalized");
+		}
+	}
+
+	public void visitFieldInsn(int access, String name, String description,
+			String signature) {
+		appendIfNotFinal("F:" + access + ":" + name + ":" + description + ":"
+				+ signature);
+	}
+
+	public void visitInsn(int opCode) {
+		appendIfNotFinal(String.valueOf(opCode));
+	}
+
+	void visitIntInsn(int opCode, int variable) {
+		appendIfNotFinal(opCode + ":" + variable);
+	}
+
+	public void visitIintInsn(int opCode, int variable) {
+		appendIfNotFinal(opCode + ":" + variable);
+	}
+
+	public void visitLdcInsn(Object obj) {
+		appendIfNotFinal("LDC:" + obj.toString());
+	}
+
+	public void visitJumpInsn(int opCode, Label label) {
+		appendIfNotFinal("JUMP:" + opCode);
+	}
+
+	public void visitMethodInsn(int opCode, String className,
+			String methodName, String description) {
+		appendIfNotFinal("MI:" + opCode + ":" + className + ":" + methodName
+				+ ":" + description);
+	}
+
+	public void visitMultiANewArrayInsn(String type, int arg1) {
+		appendIfNotFinal("MultiArr:" + type + ":" + arg1);
+
+	}
+
+	public void visitLookupSwitchInsn(Label arg0, int[] arg1, Label[] arg2) {
+		appendIfNotFinal("LSWITCH:" + Arrays.toString(arg1));
+	}
+
+	public void visitTableSwitchInsn(int arg0, int arg1, Label arg2,
+			Label[] arg3) {
+		appendIfNotFinal("TSWITCH:" + arg0 + ":" + arg1);
+	}
+
+	public void finalize() {
+		while (events.size() > 0 && trimableIfLast(events.getLast())) {
+			events.removeLast();
+		}
+		while (events.size() > 0 && trimableIfFirst(events.getFirst())) {
+			events.removeFirst();
+		}
+		finalized = true;
+	}
+
+	private boolean trimableIfFirst(String e) {
+		return e.equals("L");//No labels at the begining
+	}
+
+	private boolean trimableIfLast(String e) {
+		return e.equals("JUMP:" + String.valueOf(Opcodes.GOTO))
+				|| e.equals(String.valueOf(Opcodes.RETURN))
+				|| e.equals(String.valueOf(Opcodes.ATHROW)) || e.equals("L");
+	}
+
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		for (String s : events) {
+			sb.append(s).append(';');
+		}
+		return sb.toString();
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((events == null) ? 0 : events.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		CodeFootstamp other = (CodeFootstamp) obj;
+		if (events == null) {
+			if (other.events != null) {
+				return false;
+			}
+		} else if (!events.equals(other.events)) {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Some signatures are to simple (empty) and generates false positive duplicates. To avoid
+	 * that we filter here lines that are shorter then 2 jvm asm instruction.
+	 *
+	 * @return true if the signature is long enough to make sense comparing it
+	 */
+	public boolean isMeaningful() {
+		if (!finalized) {
+			throw new IllegalStateException(
+					"The signature should been already finalized");
+		}
+		return events.size() >= 1;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectDuplicatedCodeClassVisitor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectDuplicatedCodeClassVisitor.java
new file mode 100644
index 0000000..aaa592e
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectDuplicatedCodeClassVisitor.java
@@ -0,0 +1,225 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass1;
+
+import net.sourceforge.cobertura.instrument.AbstractFindTouchPointsClassInstrumenter;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.util.CheckClassAdapter;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * The same line can cause generation of many byte-code blocks connected to the same line.
+ * <p/>
+ * This especially occurs in case of 'finally' blocks. For example:
+ * <p/>
+ * <pre>
+ * 173: public void methodWithFinishBlock(FinishReturnTypeEnum f){
+ * 174:   try {
+ * 175:     switch (f) {
+ * 176:       case BY_RETURN:
+ * 177:         System.out.println("will return");
+ * 178:         return;
+ * 179:	      case BY_THROW:
+ * 180:	        System.out.println("will throw");
+ * 181:	        throw new IllegalStateException("Expected exception");
+ * 182:	      default:
+ * 183:	        System.out.println("default");
+ * 184:     }
+ * 185:	  } finally {
+ * 186:	    if (f != null) { //This piece of code is generated in ASM 3 times. We should merge it into one block
+ * 187:	      System.out.println("Finish with: f="+f);
+ * 188:	  }
+ * 189:	}
+ * 190}
+ * </pre>
+ * <p/>
+ * effects in generation such a JVM code:
+ * <p/>
+ * <pre>
+ * // access flags 1
+ *   public methodWithFinishBlock(Ltest/performance/Test1$FinishReturnTypeEnum;)V
+ *     TRYCATCHBLOCK L0 L1 L2
+ *     TRYCATCHBLOCK L3 L2 L2
+ *    L0
+ *     LINENUMBER 175 L0
+ *     INVOKESTATIC test/performance/Test1.$SWITCH_TABLE$test$performance$Test1$FinishReturnTypeEnum()[I
+ *     ALOAD 1
+ *     INVOKEVIRTUAL test/performance/Test1$FinishReturnTypeEnum.ordinal()I
+ *     IALOAD
+ *     TABLESWITCH
+ *       1: L4
+ *       2: L3
+ *       default: L5
+ *    L4
+ *     LINENUMBER 177 L4
+ *     GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
+ *     LDC "will return"
+ *     INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
+ *    L1
+ *     LINENUMBER 186 L1
+ *     ALOAD 1
+ *     IFNULL L6
+ *    L7
+ *     LINENUMBER 187 L7
+ *     GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
+ *     NEW java/lang/StringBuilder
+ *     DUP
+ *     LDC "Finish with: f="
+ *     INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
+ *     ALOAD 1
+ *     INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
+ *     INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
+ *     INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
+ *    L6
+ *     LINENUMBER 178 L6
+ *     RETURN
+ *    L3
+ *     LINENUMBER 180 L3
+ *     GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
+ *     LDC "will throw"
+ *     INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
+ *    L8
+ *     LINENUMBER 181 L8
+ *     NEW java/lang/IllegalStateException
+ *     DUP
+ *     LDC "Expected exception"
+ *     INVOKESPECIAL java/lang/IllegalStateException.<init>(Ljava/lang/String;)V
+ *     ATHROW
+ *    L5
+ *     LINENUMBER 183 L5
+ *     GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
+ *     LDC "default"
+ *     INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
+ *     GOTO L9
+ *    L2
+ *     LINENUMBER 185 L2
+ *     ASTORE 2
+ *    L10
+ *     LINENUMBER 186 L10
+ *     ALOAD 1
+ *     IFNULL L11
+ *    L12
+ *     LINENUMBER 187 L12
+ *     GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
+ *     NEW java/lang/StringBuilder
+ *     DUP
+ *     LDC "Finish with: f="
+ *     INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
+ *     ALOAD 1
+ *     INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
+ *     INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
+ *     INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
+ *    L11
+ *     LINENUMBER 189 L11
+ *     ALOAD 2
+ *     ATHROW
+ *    L9
+ *     LINENUMBER 186 L9
+ *     ALOAD 1
+ *     IFNULL L13
+ *    L14
+ *     LINENUMBER 187 L14
+ *     GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
+ *     NEW java/lang/StringBuilder
+ *     DUP
+ *     LDC "Finish with: f="
+ *     INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
+ *     ALOAD 1
+ *     INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
+ *     INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
+ *     INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
+ *    L13
+ *     LINENUMBER 190 L13
+ *     RETURN
+ *    L15
+ *     LOCALVARIABLE this Ltest/performance/Test1; L0 L15 0
+ *     LOCALVARIABLE f Ltest/performance/Test1$FinishReturnTypeEnum; L0 L15 1
+ *     MAXSTACK = 4
+ *     MAXLOCALS = 3
+ * </pre>
+ * <p/>
+ * <p>Note that 'LINENUMBER 186' instruction occurs many times and code after that instruction is nearly identical
+ * (see {@link CodeFootstamp} criteria of 'identity').</p>
+ * <p/>
+ * <p>On the other hand duplicated 'LINENUMBER 186' instruction could happened for for example for 'for' loop. In this
+ * case the code after this instruction is different.</p>
+ * <p/>
+ * <p>The goal of this class is to provide {@link #duplicatedLinesCollector} that is map of:
+ * (line number -> (duplicated lineId -> origin lineId)).</p>
+ */
+public class DetectDuplicatedCodeClassVisitor extends ClassVisitor {
+
+	/**
+	 * map of (line number -> (duplicated lineId -> origin lineId))
+	 */
+	private Map<Integer, Map<Integer, Integer>> duplicatedLinesCollector = new HashMap<Integer, Map<Integer, Integer>>();
+
+	/**
+	 * Name (internal asm) of currently processed class
+	 */
+	private String className;
+
+	/**
+	 * Every LINENUMBER instruction will have generated it's lineId.
+	 * <p/>
+	 * The generated ids must be the same as those generated by
+	 * ( {@link AbstractFindTouchPointsClassInstrumenter#lineIdGenerator} )
+	 */
+	private final AtomicInteger lineIdGenerator = new AtomicInteger(0);
+
+	public DetectDuplicatedCodeClassVisitor(ClassVisitor cv) {
+		super(Opcodes.ASM4, new CheckClassAdapter(cv, false));
+	}
+
+	@Override
+	public void visit(int version, int access, String name, String signature,
+			String superName, String[] interfaces) {
+		super.visit(version, access, name, signature, superName, interfaces);
+		this.className = name;
+	}
+
+	@Override
+	public MethodVisitor visitMethod(int access, String methodName,
+			String description, String signature, String[] exceptions) {
+		MethodVisitor nestedVisitor = super.visitMethod(access, methodName,
+				description, signature, exceptions);
+		return new DetectDuplicatedCodeMethodVisitor(nestedVisitor,
+				duplicatedLinesCollector, className, methodName, description,
+				lineIdGenerator);
+	}
+
+	/**
+	 * Returns map of (line number -> (duplicated lineId -> origin lineId))
+	 */
+	public Map<Integer, Map<Integer, Integer>> getDuplicatesLinesCollector() {
+		return duplicatedLinesCollector;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectDuplicatedCodeMethodVisitor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectDuplicatedCodeMethodVisitor.java
new file mode 100644
index 0000000..a625646
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectDuplicatedCodeMethodVisitor.java
@@ -0,0 +1,259 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass1;
+
+import net.sourceforge.cobertura.instrument.ContextMethodAwareMethodAdapter;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Detects duplicates in a single analyzed method of ASM code. Applies found information about
+ * duplicates into {@link #duplicatesCollector} structure.
+ * <p/>
+ * See {@link DetectDuplicatedCodeClassVisitor} about reasons for the class.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class DetectDuplicatedCodeMethodVisitor
+		extends
+			ContextMethodAwareMethodAdapter {
+	private final Logger logger = LoggerFactory
+			.getLogger(DetectDuplicatedCodeClassVisitor.class);
+	/**
+	 * Map of (lineNumber -> (list of pairs: lineId,{@link CodeFootstamp} for the lineId))).
+	 */
+	private final Map<Integer, List<LineIdWithCodeFootstamp>> line2label2codefootstamp = new LinkedHashMap<Integer, List<LineIdWithCodeFootstamp>>();
+
+	/**
+	 * Map of (lineNumber -> (duplicate lineId -> origin lineId)). This structure is filled with a new reasults at the {@link #visitEnd()} method.
+	 */
+	private final Map<Integer, Map<Integer, Integer>> duplicatesCollector;
+
+	/**
+	 * Represents pair of lineId and {@link CodeFootstamp} connected with that {@link #lineId}
+	 */
+	private static class LineIdWithCodeFootstamp {
+		private Integer lineId;
+		private CodeFootstamp footstamp;
+
+		public LineIdWithCodeFootstamp(Integer lineId, CodeFootstamp footstamp) {
+			super();
+			this.lineId = lineId;
+			this.footstamp = footstamp;
+		}
+	}
+
+	/**
+	 * {@link CodeFootstamp} of currently analyzed block of code. We will append to that variable
+	 * events that we will see in the current block of code.
+	 */
+	private CodeFootstamp currentLineFootstamp;
+
+	public DetectDuplicatedCodeMethodVisitor(MethodVisitor mv,
+			Map<Integer, Map<Integer, Integer>> duplicatesCollector,
+			String className, String methodName, String methodSignature,
+			AtomicInteger lineIdGenerator) {
+		super(mv, className, methodName, methodSignature, lineIdGenerator);
+		this.duplicatesCollector = duplicatesCollector;
+	}
+
+	//---------------- Visit event and put it into footstamp methods ----------------------	
+
+	/**
+	 * <p>Starts a new block and assigns a new {@link #currentLineFootstamp}.</p>
+	 * <p/>
+	 * <p>Put's the new {@link LineIdWithCodeFootstamp} into {@link #line2label2codefootstamp}
+	 */
+	@Override
+	public void visitLineNumber(int lineNumber, Label label) {
+		super.visitLineNumber(lineNumber, label);
+
+		currentLineFootstamp = new CodeFootstamp();
+		List<LineIdWithCodeFootstamp> footstamps = (line2label2codefootstamp
+				.get(lineNumber));
+		if (footstamps == null) {
+			footstamps = new LinkedList<LineIdWithCodeFootstamp>();
+			line2label2codefootstamp.put(lineNumber, footstamps);
+		}
+		footstamps.add(new LineIdWithCodeFootstamp(lastLineId,
+				currentLineFootstamp));
+	}
+
+	@Override
+	public void visitLabel(Label label) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitLabel(label);
+		}
+		super.visitLabel(label);
+	}
+
+	@Override
+	public void visitFieldInsn(int access, String name, String description,
+			String signature) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitFieldInsn(access, name, description,
+					signature);
+		}
+		super.visitFieldInsn(access, name, description, signature);
+	}
+
+	@Override
+	public void visitInsn(int opCode) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitInsn(opCode);
+		}
+		super.visitInsn(opCode);
+	}
+
+	@Override
+	public void visitIntInsn(int opCode, int variable) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitIntInsn(opCode, variable);
+		}
+		super.visitIntInsn(opCode, variable);
+	}
+
+	@Override
+	public void visitIincInsn(int opCode, int variable) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitIintInsn(opCode, variable);
+		}
+		super.visitIincInsn(opCode, variable);
+	}
+
+	@Override
+	public void visitJumpInsn(int opCode, Label label) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitJumpInsn(opCode, label);
+		}
+		super.visitJumpInsn(opCode, label);
+	}
+
+	@Override
+	public void visitLdcInsn(Object obj) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitLdcInsn(obj);
+		}
+		super.visitLdcInsn(obj);
+	}
+
+	@Override
+	public void visitMethodInsn(int opCode, String className,
+			String methodName, String description) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitMethodInsn(opCode, className, methodName,
+					description);
+		}
+		super.visitMethodInsn(opCode, className, methodName, description);
+	}
+
+	@Override
+	public void visitMultiANewArrayInsn(String type, int arg1) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitMultiANewArrayInsn(type, arg1);
+		}
+		super.visitMultiANewArrayInsn(type, arg1);
+	}
+
+	@Override
+	public void visitLookupSwitchInsn(Label arg0, int[] arg1, Label[] arg2) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitLookupSwitchInsn(arg0, arg1, arg2);
+		}
+		super.visitLookupSwitchInsn(arg0, arg1, arg2);
+	}
+
+	@Override
+	public void visitTableSwitchInsn(int arg0, int arg1, Label arg2,
+			Label[] arg3) {
+		if (currentLineFootstamp != null) {
+			currentLineFootstamp.visitTableSwitchInsn(arg0, arg1, arg2, arg3);
+		}
+		super.visitTableSwitchInsn(arg0, arg1, arg2, arg3);
+	}
+
+	@Override
+	public void visitEnd() {
+		super.visitEnd();
+		putDuplicatedLinesIntoMap(duplicatesCollector);
+	}
+
+	/**
+	 * Analyzes (compare) all footstamps stored in {@link #line2label2codefootstamp} and add found duplicated
+	 * into {@link #duplicatesCollector}
+	 */
+	public void putDuplicatedLinesIntoMap(
+			Map<Integer, Map<Integer, Integer>> res) {
+		for (Map.Entry<Integer, List<LineIdWithCodeFootstamp>> l : line2label2codefootstamp
+				.entrySet()) {
+			Map<Integer, Integer> r = putDuplicates(l.getValue());
+			if (r != null) {
+				res.put(l.getKey(), r);
+			}
+
+			if (logger.isDebugEnabled()) {
+				for (LineIdWithCodeFootstamp pair : l.getValue()) {
+					logger.debug("SIGNATURE:" + l.getKey() + ":" + pair.lineId
+							+ ":" + pair.footstamp);
+				}
+			}
+		}
+	}
+
+	/**
+	 * <p>Analyzes (compares) a list of duplicates connected to the line with the same number and
+	 * add found duplicated into {@link #duplicatesCollector}</p>
+	 *
+	 * @param listOfFootstamps - list of footstamps connected with a source-code line with the same number
+	 *
+	 * @return A map (duplicate lineId -> origin lineId ) of duplicates found in the listOfFootstams, or NULL
+	 *         if no such duplicates has been found.
+	 */
+	private Map<Integer, Integer> putDuplicates(
+			List<LineIdWithCodeFootstamp> listOfFootstamps) {
+		Map<CodeFootstamp, Integer> reversedMap = new HashMap<CodeFootstamp, Integer>();
+		Map<Integer, Integer> result = new HashMap<Integer, Integer>();
+		for (LineIdWithCodeFootstamp lcf : listOfFootstamps) {
+			lcf.footstamp.finalize();
+			if (lcf.footstamp.isMeaningful()) {
+				Integer found = reversedMap.get(lcf.footstamp);
+				if (found != null) {
+					result.put(lcf.lineId, found);
+				} else {
+					reversedMap.put(lcf.footstamp, lcf.lineId);
+				}
+			}
+		}
+		return result.size() > 0 ? result : null;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectIgnoredCodeClassVisitor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectIgnoredCodeClassVisitor.java
new file mode 100644
index 0000000..d0c8385
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectIgnoredCodeClassVisitor.java
@@ -0,0 +1,102 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass1;
+
+import net.sourceforge.cobertura.instrument.AbstractFindTouchPointsClassInstrumenter;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.util.CheckClassAdapter;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class DetectIgnoredCodeClassVisitor extends ClassVisitor {
+	/**
+	 * set of ignored line IDs
+	 */
+	private Set<Integer> ignoredLineIds = new HashSet<Integer>();
+
+	/**
+	 * Set of concatenated methodName and methodSignature that should be ignored
+	 */
+	private Set<String> ignoredMethodNamesAndSignatures = new HashSet<String>();
+
+	/**
+	 * Name (internal asm) of currently processed class
+	 */
+	private String className;
+
+	/**
+	 * Name (internal asm) of parent of processed class
+	 */
+	private String superName;
+
+	/**
+	 * Every LINENUMBER instruction will have generated it's lineId.
+	 * <p/>
+	 * The generated ids must be the same as those generated by ( {@link AbstractFindTouchPointsClassInstrumenter#lineIdGenerator} )
+	 */
+	private final AtomicInteger lineIdGenerator = new AtomicInteger(0);
+
+	private final boolean ignoreTrivial;
+	private final Set<String> ignoreAnnotations;
+
+	public DetectIgnoredCodeClassVisitor(ClassVisitor cv,
+			boolean ignoreTrivial, Set<String> ignoreAnnotations) {
+		super(Opcodes.ASM4, new CheckClassAdapter(cv, false));
+		this.ignoreTrivial = ignoreTrivial;
+		this.ignoreAnnotations = ignoreAnnotations;
+	}
+
+	@Override
+	public void visit(int version, int access, String name, String signature,
+			String superName, String[] interfaces) {
+		super.visit(version, access, name, signature, superName, interfaces);
+		this.className = name;
+		this.superName = superName;
+	}
+
+	@Override
+	public MethodVisitor visitMethod(int access, String methodName,
+			String description, String signature, String[] exceptions) {
+		MethodVisitor nestedVisitor = super.visitMethod(access, methodName,
+				description, signature, exceptions);
+		return new DetectIgnoredCodeMethodVisitor(nestedVisitor,
+				ignoredLineIds, ignoredMethodNamesAndSignatures, ignoreTrivial,
+				ignoreAnnotations, className, superName, methodName,
+				description, lineIdGenerator);
+	}
+
+	public Set<Integer> getIgnoredLineIds() {
+		return ignoredLineIds;
+	}
+
+	public Set<String> getIgnoredMethodNamesAndSignatures() {
+		return ignoredMethodNamesAndSignatures;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectIgnoredCodeMethodVisitor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectIgnoredCodeMethodVisitor.java
new file mode 100644
index 0000000..63a4d7e
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/DetectIgnoredCodeMethodVisitor.java
@@ -0,0 +1,212 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass1;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.instrument.ContextMethodAwareMethodAdapter;
+import org.objectweb.asm.*;
+
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class DetectIgnoredCodeMethodVisitor
+		extends
+			ContextMethodAwareMethodAdapter {
+	final String superName;
+	final Set<Integer> ignoredLineIds;
+	final Set<String> ignoredMethodNamesAndSignatures;
+
+	final Set<String> ignoreMethodAnnotations;
+	final boolean ignoreTrivial;
+
+	enum IgnoredStatus {
+		POSSIBLE_TRIVIAL_GETTER, POSSIBLE_TRIVIAL_SETTER, POSSIBLE_TRIVIAL_INIT, IGNORED_BY_ANNOTATION, NOT_IGNORED;
+
+		boolean isTrivial() {
+			return (this == POSSIBLE_TRIVIAL_GETTER)
+					|| (this == POSSIBLE_TRIVIAL_SETTER)
+					|| (this == POSSIBLE_TRIVIAL_INIT);
+		}
+	}
+
+	public IgnoredStatus ignoredStatus;
+
+	public DetectIgnoredCodeMethodVisitor(MethodVisitor mv,
+			Set<Integer> ignoredLineIds,
+			Set<String> ignoredMethodNamesAndSignatures, boolean ignoreTrivial,
+			Set<String> ignoreMethodAnnotations, String className,
+			String superName, String methodName, String description,
+			AtomicInteger lineIdGenerator) {
+		super(mv, className, methodName, description, lineIdGenerator);
+		this.superName = superName;
+		this.ignoredLineIds = ignoredLineIds;
+		this.ignoredMethodNamesAndSignatures = ignoredMethodNamesAndSignatures;
+		this.ignoreTrivial = ignoreTrivial;
+		this.ignoredStatus = checkForTrivialSignature(methodName, description);
+		this.ignoreMethodAnnotations = ignoreMethodAnnotations;
+	}
+
+	private static IgnoredStatus checkForTrivialSignature(String name,
+			String desc) {
+		Type[] args = Type.getArgumentTypes(desc);
+		Type ret = Type.getReturnType(desc);
+		if (name.equals("<init>")) {
+			return IgnoredStatus.POSSIBLE_TRIVIAL_INIT;
+		}
+
+		// a "setter" method must:
+		// - have a name starting with "set"
+		// - take one arguments
+		// - return nothing (void)
+		if (name.startsWith("set") && args.length == 1
+				&& ret.equals(Type.VOID_TYPE)) {
+			return IgnoredStatus.POSSIBLE_TRIVIAL_SETTER;
+		}
+
+		// a "getter" method must:
+		// - have a name starting with "get", "is", or "has"
+		// - take no arguments
+		// - return a value (non-void)
+		if ((name.startsWith("get") || name.startsWith("is") || name
+				.startsWith("has"))
+				&& args.length == 0 && !ret.equals(Type.VOID_TYPE)) {
+			return IgnoredStatus.POSSIBLE_TRIVIAL_GETTER;
+		}
+
+		return IgnoredStatus.NOT_IGNORED;
+	}
+
+	public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+		// Check to see if this annotation is one of the ones that we use to
+		// trigger us to ignore this method
+		String clazz = Type.getObjectType(
+				desc.substring(1).replace(';', ' ').trim()).getClassName();
+		if (ignoreMethodAnnotations.contains(clazz)
+				|| desc.equals(Type.getDescriptor(CoverageIgnore.class))) {
+			ignoredStatus = IgnoredStatus.IGNORED_BY_ANNOTATION;
+		}
+		return super.visitAnnotation(desc, visible);
+	}
+
+	@Override
+	public void visitJumpInsn(int arg0, Label arg1) {
+		markNotTrivial();
+		super.visitJumpInsn(arg0, arg1);
+	}
+
+	public void visitFieldInsn(int opcode, String string, String string1,
+			String string2) {
+		super.visitFieldInsn(opcode, string, string1, string2);
+		if (ignoredStatus.isTrivial()) {
+			// trivial opcodes for accessing class fields are:
+			// - GETFIELD or PUTFIELD
+			if ((ignoredStatus == IgnoredStatus.POSSIBLE_TRIVIAL_GETTER && opcode != Opcodes.GETFIELD)
+					|| (ignoredStatus == IgnoredStatus.POSSIBLE_TRIVIAL_SETTER && opcode != Opcodes.PUTFIELD)
+					|| (ignoredStatus == IgnoredStatus.POSSIBLE_TRIVIAL_INIT && opcode != Opcodes.PUTFIELD)) {
+				markNotTrivial();
+			}
+		}
+	}
+
+	public void visitVarInsn(int opcode, int i1) {
+		super.visitVarInsn(opcode, i1);
+		if (ignoredStatus.isTrivial() && opcode != Opcodes.ILOAD
+				&& opcode != Opcodes.LLOAD && opcode != Opcodes.FLOAD
+				&& opcode != Opcodes.DLOAD && opcode != Opcodes.ALOAD) {
+			markNotTrivial();
+		}
+	}
+
+	@Override
+	public void visitTypeInsn(int arg0, String arg1) {
+		super.visitTypeInsn(arg0, arg1);
+		markNotTrivial();
+	}
+
+	@Override
+	public void visitLookupSwitchInsn(Label arg0, int[] arg1, Label[] arg2) {
+		super.visitLookupSwitchInsn(arg0, arg1, arg2);
+		markNotTrivial();
+	}
+
+	@Override
+	public void visitTableSwitchInsn(int arg0, int arg1, Label arg2,
+			Label[] arg3) {
+		super.visitTableSwitchInsn(arg0, arg1, arg2, arg3);
+		markNotTrivial();
+	}
+
+	@Override
+	public void visitMultiANewArrayInsn(String arg0, int arg1) {
+		super.visitMultiANewArrayInsn(arg0, arg1);
+		markNotTrivial();
+	}
+
+	@Override
+	public void visitIincInsn(int arg0, int arg1) {
+		super.visitIincInsn(arg0, arg1);
+		markNotTrivial();
+	}
+
+	@Override
+	public void visitLdcInsn(Object arg0) {
+		super.visitLdcInsn(arg0);
+		markNotTrivial();
+	}
+
+	@Override
+	public void visitIntInsn(int arg0, int arg1) {
+		super.visitIntInsn(arg0, arg1);
+		markNotTrivial();
+	}
+
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name,
+			String desc) {
+		if (ignoredStatus.isTrivial()
+				&& !(ignoredStatus == IgnoredStatus.POSSIBLE_TRIVIAL_INIT
+						&& name.equals("<init>") && owner.equals(superName) && opcode == Opcodes.INVOKESPECIAL)) {
+			markNotTrivial();
+		}
+		super.visitMethodInsn(opcode, owner, name, desc);
+	}
+
+	@Override
+	public void visitEnd() {
+		super.visitEnd();
+		if ((ignoredStatus == IgnoredStatus.IGNORED_BY_ANNOTATION)
+				|| (ignoreTrivial && ignoredStatus.isTrivial())) {
+			ignoredMethodNamesAndSignatures.add(methodName + methodSignature);
+		}
+	}
+
+	public void markNotTrivial() {
+		if (ignoredStatus.isTrivial()) {
+			ignoredStatus = IgnoredStatus.NOT_IGNORED;
+		}
+	}
+
+}
diff --git a/examples/functionaltest1/src/test/first/B.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/package-info.java
similarity index 64%
copy from examples/functionaltest1/src/test/first/B.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/package-info.java
index 807890f..103195b 100644
--- a/examples/functionaltest1/src/test/first/B.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass1/package-info.java
@@ -1,46 +1,34 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.first;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-public class B
-{
-
-	public void call()
-	{
-		A.someMethod();
-	}
-
-	public void dontCall()
-	{
-		A.someMethod();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/**
+ * There are cases when the same piece of java code generates multiple series of ASM instructions. 
+ * In particular the same line of code can be rendered in many places of destination code. See 
+ * {@link DetectDuplicatedCodeClassVisitor} for example. 
+ *
+ * This package contains {@link DetectDuplicatedCodeClassVisitor} that is responsible for
+ * detecting such a duplicates. It does not change class but only provide analysis. 
+ */
+package net.sourceforge.cobertura.instrument.pass1;
\ No newline at end of file
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass2/BuildClassMapClassVisitor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass2/BuildClassMapClassVisitor.java
new file mode 100644
index 0000000..429c119
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass2/BuildClassMapClassVisitor.java
@@ -0,0 +1,168 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass2;
+
+import net.sourceforge.cobertura.CoverageIgnore;
+import net.sourceforge.cobertura.instrument.AbstractFindTouchPointsClassInstrumenter;
+import net.sourceforge.cobertura.instrument.FindTouchPointsMethodAdapter;
+import net.sourceforge.cobertura.instrument.HistoryMethodAdapter;
+import net.sourceforge.cobertura.instrument.pass3.CodeProvider;
+import net.sourceforge.cobertura.instrument.tp.ClassMap;
+import org.objectweb.asm.*;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * <p>Analyzes given class. Builds {@link ClassMap} that represents any touch-points and other important information
+ * for instrumentation.</p>
+ * <p/>
+ * This instrumenter ({@link ClassVisitor}) does not change the bytecode of the class. It makes only analyzys and fills {@link ClassMap}.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class BuildClassMapClassVisitor
+		extends
+			AbstractFindTouchPointsClassInstrumenter {
+	/**
+	 * {@link ClassMap} for the currently analyzed class.
+	 */
+	private final ClassMap classMap = new ClassMap();
+
+	/**
+	 * Information about important 'events' (instructions) are sent into the listener that is internally
+	 * responsible for modifying the {@link #classMap} content.
+	 */
+	private final BuildClassMapTouchPointListener touchPointListener = new BuildClassMapTouchPointListener(
+			classMap);
+
+	/**
+	 * It's flag that signals if the class should be instrumented by cobertura.
+	 * After analyzing the class you can check the field using {@link #shouldBeInstrumented()}.
+	 */
+	private boolean toInstrument = true;
+
+	private final Set<String> ignoredMethods;
+	private final Set<String> ignoredClassAnnotations;
+
+	/**
+	 * @param cv                 - a listener for code-instrumentation events
+	 * @param ignoreRegexes       - list of patters of method calls that should be ignored from line-coverage-measurement
+	 * @param ignoreClassAnnotations - list of class annotations to exclude them from instrumentation at all
+     * @param duplicatedLinesMap - map of found duplicates in the class. You should use {@link DetectDuplicatedCodeClassVisitor} to find the duplicated lines.
+	 */
+	public BuildClassMapClassVisitor(ClassVisitor cv,
+			Collection<Pattern> ignoreRegexes,
+			Set<String> ignoreClassAnnotations,
+			Map<Integer, Map<Integer, Integer>> duplicatedLinesMap,
+			Set<String> ignoredMethods) {
+		super(cv, ignoreRegexes, duplicatedLinesMap);
+		this.ignoredMethods = ignoredMethods;
+		this.ignoredClassAnnotations = ignoreClassAnnotations;
+	}
+
+	@Override
+	public AnnotationVisitor visitAnnotation(String name, boolean arg1) {
+		if (Type.getDescriptor(CoverageIgnore.class).equals(name)) {
+			toInstrument = false;
+		} else if (ignoredClassAnnotations != null) {
+			String className = Type.getObjectType(name).getClassName();
+			// Class name contains artifacts anyway so trimming them out before
+			// matching
+			String normalizedClassName = className.replaceAll("[L;]", "");
+			if (ignoredClassAnnotations.contains(normalizedClassName)) {
+				toInstrument = false;
+			}
+		}
+
+		return super.visitAnnotation(name, arg1);
+	}
+
+	/**
+	 * Stores in {@link #classMap} information of className and if the class should be instrumented ({@link #shouldBeInstrumented()})
+	 */
+	@Override
+	public void visit(int version, int access, String name, String signature,
+			String parent, String[] interfaces) {
+		classMap.setClassName(name);
+
+		if ((access & Opcodes.ACC_INTERFACE) != 0) {
+			toInstrument = false;
+		}
+		super.visit(version, access, name, signature, parent, interfaces);
+	}
+
+	/**
+	 * Stores in {@link #classMap} information of source filename
+	 */
+	@Override
+	public void visitSource(String file, String debug) {
+		classMap.setSource(file);
+		super.visitSource(file, debug);
+	}
+
+	/**
+	 * Analyzes given method and stores  information about all found important places into {@link #classMap}
+	 */
+	@Override
+	public MethodVisitor visitMethod(int access, String name, String desc,
+			String signature, String[] exceptions) {
+		if (((access & Opcodes.ACC_STATIC) != 0)
+				&& CodeProvider.COBERTURA_INIT_METHOD_NAME.equals(name)) {
+			toInstrument = false; //  The class has bean already instrumented.
+		}
+
+		MethodVisitor mv = super.visitMethod(access, name, desc, signature,
+				exceptions);
+		if (ignoredMethods.contains(name + desc)) {
+			return mv;
+		}
+		FindTouchPointsMethodAdapter instrumenter = new FindTouchPointsMethodAdapter(
+				new HistoryMethodAdapter(mv, 4), classMap.getClassName(), name,
+				desc, eventIdGenerator, duplicatedLinesMap, lineIdGenerator);
+		instrumenter.setTouchPointListener(touchPointListener);
+		instrumenter.setIgnoreRegexp(getIgnoreRegexp());
+		return instrumenter;
+	}
+
+	/**
+	 * Returns classMap build for the analyzed map. The classmap is filled after running the analyzer ({@link ClassReader#accept(ClassVisitor, int)}).
+	 *
+	 * @return the classmap.
+	 */
+	public ClassMap getClassMap() {
+		return classMap;
+	}
+
+	/**
+	 * It's flag that signals if the class should be instrumented by Cobertura.
+	 */
+	public boolean shouldBeInstrumented() {
+		return toInstrument;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass2/BuildClassMapTouchPointListener.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass2/BuildClassMapTouchPointListener.java
new file mode 100644
index 0000000..cd82bc0
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass2/BuildClassMapTouchPointListener.java
@@ -0,0 +1,85 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass2;
+
+import net.sourceforge.cobertura.instrument.TouchPointListener;
+import net.sourceforge.cobertura.instrument.tp.ClassMap;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * Analyzes given method and applies information about all found important places into {@link #classmap}.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class BuildClassMapTouchPointListener implements TouchPointListener {
+	private final ClassMap classmap;
+
+	public BuildClassMapTouchPointListener(ClassMap classMap) {
+		this.classmap = classMap;
+	}
+
+	public void beforeJump(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor) {
+		classmap.registerNewJump(eventId, currentLine, label);
+	}
+
+	public void beforeLabel(int eventId, Label label, int currentLine,
+			MethodVisitor mv) {
+		classmap.registerNewLabel(eventId, currentLine, label);
+	}
+
+	public void afterLineNumber(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor, String methodName,
+			String methodSignature) {
+		classmap.registerLineNumber(eventId, currentLine, label, methodName,
+				methodSignature);
+	}
+
+	public void beforeSwitch(int eventId, Label def, Label[] labels,
+			int currentLine, MethodVisitor mv, String conditionType) {
+		classmap.registerSwitch(eventId, currentLine, def, labels,
+				conditionType);
+	}
+
+	public void ignoreLine(int eventId, int currentLine) {
+		classmap.unregisterLine(eventId, currentLine);
+	}
+
+	// --------------- Not interesting events for analysis ---------------------------
+	public void afterJump(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor) {
+	}
+
+	public void afterLabel(int eventId, Label label, int currentLine,
+			MethodVisitor mv) {
+	}
+
+	public void afterMethodStart(MethodVisitor nextMethodVisitor) {
+	}
+
+	;
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/AbstractCodeProvider.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/AbstractCodeProvider.java
new file mode 100644
index 0000000..a15ab60
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/AbstractCodeProvider.java
@@ -0,0 +1,263 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass3;
+
+import net.sourceforge.cobertura.coveragedata.LightClassmapListener;
+import net.sourceforge.cobertura.coveragedata.TouchCollector;
+import net.sourceforge.cobertura.instrument.tp.*;
+import org.objectweb.asm.*;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Common method used by most of {@link AbstractCodeProvider} implementations.
+ * The methods realized here are independent on counters storing structure.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public abstract class AbstractCodeProvider implements CodeProvider {
+
+	/**
+	 * CounterId used to store unnecessary events to avoid fake jump counting in
+	 * instrumented(generated) code
+	 */
+	public static final int FAKE_COUNTER_ID = 0;
+
+	public AbstractCodeProvider() {
+		super();
+	}
+
+	public void generateCodeThatSetsJumpCounterIdVariable(
+			MethodVisitor nextMethodVisitor, int new_value,
+			int lastJumpIdVariableIndex) {
+		nextMethodVisitor.visitLdcInsn(new_value);
+		nextMethodVisitor.visitVarInsn(Opcodes.ISTORE, lastJumpIdVariableIndex);
+	}
+
+	public void generateCodeThatZeroJumpCounterIdVariable(
+			MethodVisitor nextMethodVisitor, int lastJumpIdVariableIndex) {
+		generateCodeThatSetsJumpCounterIdVariable(nextMethodVisitor,
+				FAKE_COUNTER_ID, lastJumpIdVariableIndex);
+	}
+
+	public void generateCodeThatIncrementsCoberturaCounterIfVariableEqualsAndCleanVariable(
+			MethodVisitor nextMethodVisitor,
+			Integer neededJumpCounterIdVariableValue,
+			Integer counterIdToIncrement, int lastJumpIdVariableIndex,
+			String className) {
+
+		nextMethodVisitor.visitLdcInsn((int) neededJumpCounterIdVariableValue);
+		nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex);
+		Label afterJump = new Label();
+		nextMethodVisitor.visitJumpInsn(Opcodes.IF_ICMPNE, afterJump);
+		generateCodeThatIncrementsCoberturaCounter(nextMethodVisitor,
+				counterIdToIncrement, className);
+		generateCodeThatZeroJumpCounterIdVariable(nextMethodVisitor,
+				lastJumpIdVariableIndex);
+		nextMethodVisitor.visitLabel(afterJump);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p/>
+	 * The code injected by this implementation just registers the class using {@link TouchCollector#registerClass(Class)}. This way, during the
+	 * execution, touch collector knows that is responsible to ask the class after execution about a current status of the counters.
+	 */
+	protected void generateRegisterClass(MethodVisitor mv, String className) {
+		mv.visitLdcInsn(className);
+		mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
+				.getInternalName(TouchCollector.class), "registerClass",
+				"(Ljava/lang/String;)V");
+	}
+
+	final String CLASSMAP_LISTENER_INTERNALNAME = Type
+			.getInternalName(LightClassmapListener.class);
+
+	/**
+	 * {@inheritDoc}<br/><br/>
+	 * <p/>
+	 * Generates method (named  {@link #COBERTURA_CLASSMAP_METHOD_NAME}) with such a signature:
+	 * __cobertura_classmap( {@link LightClassmapListener} listener).</br>
+	 * <p/>
+	 * The method informs the listener about all lines, jumps and switches found, and about all counters tracking
+	 * the constructions.
+	 */
+	public void generateCoberturaClassMapMethod(ClassVisitor cv,
+			ClassMap classMap) {
+
+		LinkedList<TouchPointDescriptor> touchPointDescriptors = new LinkedList<TouchPointDescriptor>(
+				classMap.getTouchPointsInLineOrder());
+		int parts = 0;
+		for (int j = 0; touchPointDescriptors.size() > 0; j++) {
+			List<TouchPointDescriptor> bufor = new LinkedList<TouchPointDescriptor>();
+			for (int i = 0; i < 1000 && touchPointDescriptors.size() > 0; i++) {
+				bufor.add(touchPointDescriptors.removeFirst());
+			}
+			classMapContent(cv, j, bufor);
+			parts++;
+		}
+
+		MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC
+				| Opcodes.ACC_STATIC, COBERTURA_CLASSMAP_METHOD_NAME, "("
+				+ Type.getType(LightClassmapListener.class).toString() + ")V",
+				null, null);
+		mv.visitCode();
+		mv.visitVarInsn(Opcodes.ALOAD, 0);
+
+		mv.visitInsn(Opcodes.DUP);
+		mv.visitLdcInsn(classMap.getClassName());
+		mv.visitMethodInsn(Opcodes.INVOKEINTERFACE,
+				CLASSMAP_LISTENER_INTERNALNAME, "setClazz",
+				"(Ljava/lang/String;)V");
+
+		if (classMap.getSource() != null) {
+			mv.visitInsn(Opcodes.DUP);
+			mv.visitLdcInsn(classMap.getSource());
+			mv.visitMethodInsn(Opcodes.INVOKEINTERFACE,
+					CLASSMAP_LISTENER_INTERNALNAME, "setSource",
+					"(Ljava/lang/String;)V");
+		}
+
+		for (int i = 0; i < parts; i++) {
+			mv.visitInsn(Opcodes.DUP);
+			mv.visitMethodInsn(Opcodes.INVOKESTATIC, classMap.getClassName(),
+					COBERTURA_CLASSMAP_METHOD_NAME + "_" + i, "("
+							+ Type.getType(LightClassmapListener.class)
+									.toString() + ")V");
+		}
+
+		mv.visitInsn(Opcodes.POP);
+		mv.visitInsn(Opcodes.RETURN);
+		mv.visitMaxs(0, 0);//will be recalculated by writer
+		mv.visitEnd();
+	}
+
+	enum Abcd {
+		A, B, C;
+	}
+
+	private void classMapContent(ClassVisitor cv, int nr,
+			List<TouchPointDescriptor> touchPointDescriptors) {
+		MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC
+				| Opcodes.ACC_STATIC,
+				COBERTURA_CLASSMAP_METHOD_NAME + "_" + nr, "("
+						+ Type.getType(LightClassmapListener.class).toString()
+						+ ")V", null, null);
+		mv.visitCode();
+		mv.visitVarInsn(Opcodes.ALOAD, 0);
+		for (TouchPointDescriptor tpd : touchPointDescriptors) {
+			mv.visitInsn(Opcodes.DUP);
+			mv.visitLdcInsn(tpd.getLineNumber());
+			if (tpd instanceof LineTouchPointDescriptor) {
+				mv
+						.visitLdcInsn(((LineTouchPointDescriptor) tpd)
+								.getCounterId());
+				mv.visitLdcInsn(((LineTouchPointDescriptor) tpd)
+						.getMethodName());
+				mv.visitLdcInsn(((LineTouchPointDescriptor) tpd)
+						.getMethodSignature());
+				mv.visitMethodInsn(Opcodes.INVOKEINTERFACE,
+						CLASSMAP_LISTENER_INTERNALNAME, "putLineTouchPoint",
+						"(IILjava/lang/String;Ljava/lang/String;)V");
+			} else if (tpd instanceof JumpTouchPointDescriptor) {
+				mv.visitLdcInsn(((JumpTouchPointDescriptor) tpd)
+						.getCounterIdForTrue());
+				mv.visitLdcInsn(((JumpTouchPointDescriptor) tpd)
+						.getCounterIdForFalse());
+				mv.visitMethodInsn(Opcodes.INVOKEINTERFACE,
+						CLASSMAP_LISTENER_INTERNALNAME, "putJumpTouchPoint",
+						"(III)V");
+			} else if (tpd instanceof SwitchTouchPointDescriptor) {
+				SwitchTouchPointDescriptor stpd = (SwitchTouchPointDescriptor) tpd;
+				final String enum_sign = ((SwitchTouchPointDescriptor) tpd)
+						.getEnumType();
+				if (enum_sign == null) {
+					mv.visitLdcInsn(Integer.MAX_VALUE);
+				} else {
+					mv.visitMethodInsn(Opcodes.INVOKESTATIC, enum_sign,
+							"values", "()[L" + enum_sign + ";");
+					mv.visitInsn(Opcodes.ARRAYLENGTH);
+				}
+				Collection<Integer> ci = stpd.getCountersForLabels();
+				mv.visitLdcInsn(ci.size());//Size of a new table
+				mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
+				int i = 0;
+				for (Integer counterId : ci) {
+					mv.visitInsn(Opcodes.DUP); //First for addition of items, second ad putSwitchTouchPoint parameter (or next loop iteration)
+					mv.visitLdcInsn(i);
+					mv.visitLdcInsn(counterId);
+					mv.visitInsn(Opcodes.IASTORE);
+					i++;
+				}
+				mv.visitMethodInsn(Opcodes.INVOKEINTERFACE,
+						CLASSMAP_LISTENER_INTERNALNAME, "putSwitchTouchPoint",
+						"(II[I)V");
+			}
+		}
+		mv.visitInsn(Opcodes.POP);
+		mv.visitInsn(Opcodes.RETURN);
+		mv.visitMaxs(0, 0);//will be recalculated by writer
+		mv.visitEnd();
+	}
+
+	/**
+	 * Generates code that is injected into static constructor of an instrumented class.
+	 * <p/>
+	 * It is good place to initiate static fields inserted into a class ({@link #generateCountersField(ClassVisitor)}),
+	 * or execute other code that should be executed when the class it used for the first time. Registering the class in
+	 * {@link TouchCollector} would be a bright idea.
+	 * <p/>
+	 * It is expected that all counter will be set to zero after that operation.
+	 *
+	 * @param mv           - {@link MethodVisitor} that is listener of code-generation events
+	 * @param className    - internal name (asm) of class being instrumented
+	 * @param counters_cnt - information about how many counters are expected to be used by instrumentation code.
+	 *                     In most cases the method is responsible for allocating objects that will be used to store counters.
+	 */
+	protected abstract void generateCINITmethod(MethodVisitor mv,
+			String className, int counters_cnt);
+
+	public void generateCoberturaInitMethod(ClassVisitor cv, String className,
+			int countersCnt) {
+		MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC
+				| Opcodes.ACC_STATIC, COBERTURA_INIT_METHOD_NAME, "()V", null,
+				null);
+		mv.visitCode();
+		generateCINITmethod(mv, className, countersCnt);
+		mv.visitInsn(Opcodes.RETURN);
+		mv.visitMaxs(0, 0); //will be recalculated by writer
+		mv.visitEnd();
+	}
+
+	public void generateCallCoberturaInitMethod(MethodVisitor mv,
+			String className) {
+		mv.visitCode(); // Since we are using the ASM Check Adapter, we need to visit the code before visiting any instructions.
+		mv.visitMethodInsn(Opcodes.INVOKESTATIC, className,
+				COBERTURA_INIT_METHOD_NAME, "()V");
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/AtomicArrayCodeProvider.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/AtomicArrayCodeProvider.java
new file mode 100644
index 0000000..3caee42
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/AtomicArrayCodeProvider.java
@@ -0,0 +1,161 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass3;
+
+import org.objectweb.asm.*;
+
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+/**
+ * <p>The {@link CodeProvider} uses {@link AtomicArrayCodeProvider} to store counters.</p>
+ * <p/>
+ * This implementation is totally thread-safe, but significantly slower then {@link FastArrayCodeProvider}.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class AtomicArrayCodeProvider extends AbstractCodeProvider
+		implements
+			CodeProvider {
+	/**
+	 * Type of the generated field, that is used to store counters
+	 */
+	static final String COBERTURA_COUNTERS_FIELD_TYPE = Type.getType(
+			AtomicIntegerArray.class).toString();
+
+	public void generateCountersField(ClassVisitor cv) {
+		FieldVisitor fv = cv.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC
+				| Opcodes.ACC_FINAL | Opcodes.ACC_TRANSIENT,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE,
+				null, null);
+		fv.visitEnd();
+	}
+
+	public void generateCINITmethod(MethodVisitor mv, String className,
+			int counters_cnt) {
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		Label l1 = new Label();
+		mv.visitJumpInsn(Opcodes.IFNONNULL, l1);
+
+		mv.visitTypeInsn(Opcodes.NEW, Type
+				.getInternalName(AtomicIntegerArray.class));
+		mv.visitInsn(Opcodes.DUP);
+		mv.visitLdcInsn(counters_cnt);
+		mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type
+				.getInternalName(AtomicIntegerArray.class), "<init>", "(I)V");
+		mv.visitFieldInsn(Opcodes.PUTSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		generateRegisterClass(mv, className);
+		mv.visitLabel(l1);
+	}
+
+	public void generateCodeThatIncrementsCoberturaCounter(
+			MethodVisitor nextMethodVisitor, Integer counterId, String className) {
+		/*cobertura_counters.incrementAndGet(i);*/
+		/*cobertura_counters.*/
+		nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		/*index:*/
+		nextMethodVisitor.visitLdcInsn((int) counterId);
+		nextMethodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type
+				.getInternalName(AtomicIntegerArray.class), "incrementAndGet",
+				"(I)I");
+		nextMethodVisitor.visitInsn(Opcodes.POP);
+	}
+
+	public void generateCodeThatIncrementsCoberturaCounterFromInternalVariable(
+			MethodVisitor nextMethodVisitor, int lastJumpIdVariableIndex,
+			String className) {
+		/*cobertura_counters.incrementAndGet(value('lastJumpIdVariableIndex'));*/
+		/*cobertura_counters.*/
+		nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		/*index:*/
+		nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex);
+		nextMethodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type
+				.getInternalName(AtomicIntegerArray.class), "incrementAndGet",
+				"(I)I");
+		nextMethodVisitor.visitInsn(Opcodes.POP);
+	}
+
+	/**
+	 * <pre>
+	 * int[] __cobertura_get_and_reset_counters() {
+	 * int[] res = new int[counters.length()];
+	 * for(int i=0; i<counters.length(); i++){
+	 * res[i]=counters.getAndSet(i, 0);
+	 * }
+	 * return res;
+	 * }
+	 * </pre>
+	 */
+	public void generateCoberturaGetAndResetCountersMethod(ClassVisitor cv,
+			String className) {
+		MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC
+				| Opcodes.ACC_STATIC,
+				COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME, "()[I", null,
+				null);
+
+		mv.visitCode();
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
+				"java/util/concurrent/atomic/AtomicIntegerArray", "length",
+				"()I");
+		mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
+		mv.visitVarInsn(Opcodes.ASTORE, 0);
+		mv.visitInsn(Opcodes.ICONST_0);
+		mv.visitVarInsn(Opcodes.ISTORE, 1);
+		Label l3 = new Label();
+		mv.visitJumpInsn(Opcodes.GOTO, l3);
+		Label l4 = new Label();
+		mv.visitLabel(l4);
+		mv.visitVarInsn(Opcodes.ALOAD, 0);
+		mv.visitVarInsn(Opcodes.ILOAD, 1);
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		mv.visitVarInsn(Opcodes.ILOAD, 1);
+		mv.visitInsn(Opcodes.ICONST_0);
+		mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
+				"java/util/concurrent/atomic/AtomicIntegerArray", "getAndSet",
+				"(II)I");
+		mv.visitInsn(Opcodes.IASTORE);
+		mv.visitIincInsn(1, 1);
+		mv.visitLabel(l3);
+		mv.visitVarInsn(Opcodes.ILOAD, 1);
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
+				"java/util/concurrent/atomic/AtomicIntegerArray", "length",
+				"()I");
+		mv.visitJumpInsn(Opcodes.IF_ICMPLT, l4);
+		mv.visitVarInsn(Opcodes.ALOAD, 0);
+		mv.visitInsn(Opcodes.ARETURN);
+		mv.visitMaxs(0, 0);//will be recalculated by writer
+		mv.visitEnd();
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/CodeProvider.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/CodeProvider.java
new file mode 100644
index 0000000..5de9a3f
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/CodeProvider.java
@@ -0,0 +1,161 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass3;
+
+import net.sourceforge.cobertura.instrument.tp.ClassMap;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * Universal API for all methods that are responsible for generating any JASM code that have
+ * to be injected into real classes.
+ * <p/>
+ * The general idea is that injected code is responsible for incrementing counters. The realization of counters
+ * is implementation dependent.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public interface CodeProvider {
+	/**
+	 * Name of a field that have to be injected into instrumented class that is responsible for storing counters
+	 */
+	public static final String COBERTURA_COUNTERS_FIELD_NAME = "__cobertura_counters";
+
+	/**
+	 * Name of a method that will to be injected into instrumented class that is responsible for storing
+	 * class-map (information on mapping of counter identifiers into lines, jumps and switch-touches).
+	 */
+	public static final String COBERTURA_CLASSMAP_METHOD_NAME = "__cobertura_classmap";
+
+	/**
+	 * Name of method that will initialize internal counters variable.
+	 */
+	public static final String COBERTURA_INIT_METHOD_NAME = "__cobertura_init";
+
+	/**
+	 * Name of a method that have to be injected into instrumented class that is responsible for reading
+	 * value of given counter.
+	 * <p/>
+	 * Signature of this method is: int[] __cobertura_counter(int counterId);
+	 */
+	public static final String COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME = "__cobertura_get_and_reset_counters";
+
+	/**
+	 * Generates fields injected into  instrumented class  by cobertura.
+	 *
+	 * @param cv - ClassVisitor that is listener of code-generation events
+	 */
+	public abstract void generateCountersField(ClassVisitor cv);
+
+	/**
+	 * Injects code that increments counter given by parameter.
+	 *
+	 * @param nextMethodVisitor - {@link MethodVisitor} that is listener of code-generation events
+	 * @param counterId         -  counterId of counter that have to be incremented
+	 * @param className         - internal name (asm) of class being instrumented
+	 */
+	public abstract void generateCodeThatIncrementsCoberturaCounter(
+			MethodVisitor nextMethodVisitor, Integer counterId, String className);
+
+	/**
+	 * Injects code that increments counter given by internal variable.
+	 * The id of the variable is identified by lastJumpIdVariableIndex. The variable is in most cases set (by {@link #generateCodeThatSetsJumpCounterIdVariable(MethodVisitor, int, int)}
+	 * to some counterId and in the target label, the counter identified by the variable is incremented.
+	 * long
+	 *
+	 * @param nextMethodVisitor       - {@link MethodVisitor} that is listener of code-generation events
+	 * @param lastJumpIdVariableIndex - id of the variable used to store counterId that have to be incremented
+	 * @param className               - internal name (asm) of class being instrumented
+	 */
+	public abstract void generateCodeThatIncrementsCoberturaCounterFromInternalVariable(
+			MethodVisitor nextMethodVisitor, int lastJumpIdVariableIndex,
+			String className);
+
+	/**
+	 * Injects code that sets internal variable (identified by lastJumpIdVariableIndex) to given value.
+	 *
+	 * @param nextMethodVisitor       - {@link MethodVisitor} that is listener of code-generation events
+	 * @param new_value               - value to set the variable to
+	 * @param lastJumpIdVariableIndex - index of variable that have to be set
+	 */
+	public abstract void generateCodeThatSetsJumpCounterIdVariable(
+			MethodVisitor nextMethodVisitor, int new_value,
+			int lastJumpIdVariableIndex);
+
+	/**
+	 * Injects code that sets internal variable (identified by lastJumpIdVariableIndex) to zero.
+	 *
+	 * @param nextMethodVisitor       - {@link MethodVisitor} that is listener of code-generation events
+	 * @param lastJumpIdVariableIndex - index of variable that have to be set
+	 */
+	public abstract void generateCodeThatZeroJumpCounterIdVariable(
+			MethodVisitor nextMethodVisitor, int lastJumpIdVariableIndex);
+
+	/**
+	 * Injects code that behaves the same as such a code snippet:
+	 * <pre>
+	 * if (value('lastJumpIdVariableIndex')==neededJumpCounterIdVariableValue){
+	 * 	 cobertura_counters.increment(counterIdToIncrement);
+	 * }
+	 * </pre>
+	 * <p/>
+	 * This snippet is used in switch case of switch statement. We have a label and we want to ensure that
+	 * we are executing the label in effect of switch statement-jump, and not other JUMP or fall-throught.
+	 */
+	public abstract void generateCodeThatIncrementsCoberturaCounterIfVariableEqualsAndCleanVariable(
+			MethodVisitor nextMethodVisitor,
+			Integer neededJumpCounterIdVariableValue,
+			Integer counterIdToIncrement, int lastJumpIdVariableIndex,
+			String className);
+
+	/**
+	 * The version of cobertura prior to 1.10 used *.ser file to store information of lines, jumps, switches and other
+	 * constructions used in the class. It was difficult to user to transfer the files after instrumentation into
+	 * 'production' directory. To avoid that we are now creating the class-map as a special injected method that is responsible
+	 * for keeping such a informations.
+	 *
+	 * @param cv       - listener used to inject the code
+	 * @param classMap - structure that is keeping all collected information about the class. The information from the structure will be stored as
+	 *                 method body.
+	 */
+	public void generateCoberturaClassMapMethod(ClassVisitor cv,
+			ClassMap classMap);
+
+	/**
+	 * Generate method {@value #COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME} that is accessor to couters.
+	 * Signature of this method is: static int __cobertura_counter(int counterId);
+	 *
+	 * @param cv - listener used to inject the code
+	 */
+	public abstract void generateCoberturaGetAndResetCountersMethod(
+			ClassVisitor cv, String className);
+
+	public void generateCoberturaInitMethod(ClassVisitor cv, String className,
+			int countersCnt);
+
+	public abstract void generateCallCoberturaInitMethod(MethodVisitor mv,
+			String className);
+}
\ No newline at end of file
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/FastArrayCodeProvider.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/FastArrayCodeProvider.java
new file mode 100644
index 0000000..93d5363
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/FastArrayCodeProvider.java
@@ -0,0 +1,152 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass3;
+
+import org.objectweb.asm.*;
+
+/**
+ * <p>The {@link CodeProvider} uses int[] to store counters.</p>
+ * <p/>
+ * <p>This implementation is not fully thread-safe, but significantly (10-100x) then {@link AtomicArrayCodeProvider}.</p>
+ * <p/>
+ * <p>What does it mean 'not fully thead-safe' ?
+ * <ul>
+ * <li>Using this provider will never cause throwing any exception because of concurrency problems</li>
+ * <li>A code coverage results acquired using this code-provider will be exactly the same as using thread-safe provider)</li> *
+ * <li>There could happen small (experiments showed around 1-3%) in value of specific counters because of race-condition.</li>
+ * </ul>
+ * </p>
+ * <p/>
+ * <p>
+ * The reason of the race condition is fact that instruction: __cobertura_counters[counter_id]++ is translated into
+ * sequence of operations: <ol>
+ * <li>get value of __cobertura_counters[counter_id]</li>
+ * <li>increment value</li>
+ * <li>store value into __cobertura_counters[counter_id]</li>
+ * </ol>
+ * This mean that in case of race condition we can miss some increments. But if a counter was hit at least once, we
+ * are sure that we will increment the counter at least one. For code coverage results fact of being hit is crucial.
+ * </p>
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class FastArrayCodeProvider extends AbstractCodeProvider
+		implements
+			CodeProvider {
+
+	/**
+	 * Type of the generated field, that is used to store counters
+	 */
+	static final String COBERTURA_COUNTERS_FIELD_TYPE = "[I";
+
+	public void generateCodeThatIncrementsCoberturaCounterFromInternalVariable(
+			MethodVisitor nextMethodVisitor, int lastJumpIdVariableIndex,
+			String className) {
+		/*cobertura_counters[value('lastJumpIdVariableIndex')]++;*/
+		/*cobertura_counters.*/
+		nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		/*index:*/
+		nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex);
+		nextMethodVisitor.visitInsn(Opcodes.DUP2);
+		nextMethodVisitor.visitInsn(Opcodes.IALOAD);
+		nextMethodVisitor.visitLdcInsn(1);
+		nextMethodVisitor.visitInsn(Opcodes.IADD);
+		nextMethodVisitor.visitInsn(Opcodes.IASTORE);
+	}
+
+	public void generateCodeThatIncrementsCoberturaCounter(
+			MethodVisitor nextMethodVisitor, Integer counterId, String className) {
+		/*cobertura_counters[value('lastJumpIdVariableIndex')]++;*/
+		/*cobertura_counters.*/
+		nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		/*index:*/
+		nextMethodVisitor.visitLdcInsn((int) counterId);
+		nextMethodVisitor.visitInsn(Opcodes.DUP2);
+		nextMethodVisitor.visitInsn(Opcodes.IALOAD);
+		nextMethodVisitor.visitLdcInsn(1);
+		nextMethodVisitor.visitInsn(Opcodes.IADD);
+		nextMethodVisitor.visitInsn(Opcodes.IASTORE);
+	}
+
+	public void generateCountersField(ClassVisitor cv) {
+		/*final tooks 270ms, no-modifier 310ms, volatile 500ms*/
+		FieldVisitor fv = cv.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC
+				| Opcodes.ACC_FINAL | Opcodes.ACC_TRANSIENT,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE,
+				null, null);
+		fv.visitEnd();
+	}
+
+	//	static int x[];
+	//	
+	//	static void abc() {
+	//		if (x == null) {
+	//			x = new int[5];
+	//		}
+	//	}
+
+	public void generateCINITmethod(MethodVisitor mv, String className,
+			int counters_cnt) {
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		Label l1 = new Label();
+		mv.visitJumpInsn(Opcodes.IFNONNULL, l1);
+		mv.visitLdcInsn(counters_cnt);
+		mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
+		mv.visitFieldInsn(Opcodes.PUTSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		generateRegisterClass(mv, className);
+		mv.visitLabel(l1);
+	}
+
+	public void generateCoberturaGetAndResetCountersMethod(ClassVisitor cv,
+			String className) {
+		MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC
+				| Opcodes.ACC_STATIC,
+				COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME, "()[I", null,
+				null);
+		mv.visitCode();
+		/*cobertura_counters.*/
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		mv.visitVarInsn(Opcodes.ASTORE, 0);
+		/*cobertura_counters.*/
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		mv.visitInsn(Opcodes.ARRAYLENGTH);
+
+		mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
+		mv.visitFieldInsn(Opcodes.PUTSTATIC, className,
+				COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
+		mv.visitVarInsn(Opcodes.ALOAD, 0);
+		mv.visitInsn(Opcodes.ARETURN);
+		mv.visitMaxs(0, 0);//will be recalculated by writer
+		mv.visitEnd();
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/InjectCodeClassInstrumenter.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/InjectCodeClassInstrumenter.java
new file mode 100644
index 0000000..c4e2bef
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/InjectCodeClassInstrumenter.java
@@ -0,0 +1,199 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass3;
+
+import net.sourceforge.cobertura.instrument.AbstractFindTouchPointsClassInstrumenter;
+import net.sourceforge.cobertura.instrument.FindTouchPointsMethodAdapter;
+import net.sourceforge.cobertura.instrument.tp.ClassMap;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.LocalVariablesSorter;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * <p>This class is responsible for real instrumentation of the user's class.</p>
+ * <p/>
+ * <p>It uses information acquired
+ * by {@link BuildClassMapClassVisitor} ( {@link #classMap} ) and
+ * {@link DetectDuplicatedCodeClassVisitor} and injects
+ * code snippet provided by {@link CodeProvider} ( {@link #codeProvider} ).</p>
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class InjectCodeClassInstrumenter
+		extends
+			AbstractFindTouchPointsClassInstrumenter {
+	/**
+	 * This class is responsible for injecting code inside 'interesting places' of methods inside instrumented class
+	 */
+	private final InjectCodeTouchPointListener touchPointListener;
+
+	/**
+	 * {@link ClassMap} generated in previous instrumentation pass by {@link BuildClassMapClassVisitor}
+	 */
+	private final ClassMap classMap;
+
+	/**
+	 * {@link CodeProvider} used to generate pieces of asm code that is injected into instrumented class.
+	 * <p/>
+	 * We are strictly recommending here using {@link FastArrayCodeProvider} instead of {@link AtomicArrayCodeProvider} because
+	 * of performance.
+	 */
+	private final CodeProvider codeProvider;
+
+	/**
+	 * When we processing the class we want to now if we processed 'static initialization block' (clinit method).
+	 * <p/>
+	 * <p>If there is no such a method in the instrumented class - we will need to generate it at the end</p>
+	 */
+	private boolean wasStaticInitMethodVisited = false;
+
+	private final Set<String> ignoredMethods;
+
+	/**
+	 * @param cv                 - a listener for code-instrumentation events
+	 * @param ignoreRegexes       - list of patters of method calls that should be ignored from line-coverage-measurement
+	 * @param classMap           - map of all interesting places in the class. You should acquire it by {@link BuildClassMapClassVisitor} and remember to
+	 *                           prepare it using {@link ClassMap#assignCounterIds()} before using it with {@link InjectCodeClassInstrumenter}
+	 * @param duplicatedLinesMap - map of found duplicates in the class. You should use {@link DetectDuplicatedCodeClassVisitor} to find the duplicated lines.
+	 */
+	public InjectCodeClassInstrumenter(ClassVisitor cv,
+			Collection<Pattern> ignoreRegexes, boolean threadsafeRigorous,
+			ClassMap classMap,
+			Map<Integer, Map<Integer, Integer>> duplicatedLinesMap,
+			Set<String> ignoredMethods) {
+		super(cv, ignoreRegexes, duplicatedLinesMap);
+		this.classMap = classMap;
+		this.ignoredMethods = ignoredMethods;
+		codeProvider = threadsafeRigorous
+				? new AtomicArrayCodeProvider()
+				: new FastArrayCodeProvider();
+		touchPointListener = new InjectCodeTouchPointListener(classMap,
+				codeProvider);
+	}
+
+	/**
+	 * <p>Marks the class 'already instrumented' and injects code connected to the fields that are keeping counters.</p>
+	 */
+	@Override
+	public void visit(int version, int access, String name, String signature,
+			String supertype, String[] interfaces) {
+
+		super.visit(version, access, name, signature, supertype, interfaces);
+		codeProvider.generateCountersField(cv);
+	}
+
+	/**
+	 * <p>Instrumenting a code in a single method. Special conditions for processing 'static initialization block'.</p>
+	 * <p/>
+	 * <p>This method also uses {@link ShiftVariableMethodAdapter} that is used firstly to calculate the index of internal
+	 * variable injected to store information about last 'processed' jump or switch in runtime ( {@link ShiftVariableMethodAdapter#calculateFirstStackVariable(int, String)} ),
+	 * and then is used to inject code responsible for keeping the variable and shifting (+1) all previously seen variables.
+	 */
+	@Override
+	public MethodVisitor visitMethod(int access, String name, String desc,
+			String signature, String[] exceptions) {
+		MethodVisitor mv = super.visitMethod(access, name, desc, signature,
+				exceptions);
+		if (ignoredMethods.contains(name + desc)) {
+			return mv;
+		}
+		if ((access & Opcodes.ACC_STATIC) != 0) {
+			mv = new GenerateCallCoberturaInitMethodVisitor(mv, classMap
+					.getClassName());
+			if ("<clinit>".equals(name)) {
+				wasStaticInitMethodVisited = true;
+			}
+		}
+		FindTouchPointsMethodAdapter instrumenter = new FindTouchPointsMethodAdapter(
+				mv, classMap.getClassName(), name, desc, eventIdGenerator,
+				duplicatedLinesMap, lineIdGenerator);
+		instrumenter.setTouchPointListener(touchPointListener);
+		instrumenter.setIgnoreRegexp(getIgnoreRegexp());
+		LocalVariablesSorter sorter = new LocalVariablesSorter(access, desc,
+				instrumenter);
+		int variable = sorter.newLocal(Type.INT_TYPE);
+		touchPointListener.setLastJumpIdVariableIndex(variable);
+		return sorter;
+		//return new ShiftVariableMethodAdapter(instrumenter, access, desc, 1);
+	}
+
+	/**
+	 * Method instrumenter that injects {@link CodeProvider#generateCINITmethod(MethodVisitor, String, int)} code, and
+	 * then forwards the whole previous content of the method.
+	 *
+	 * @author piotr.tabor at gmail.com
+	 */
+	private class GenerateCallCoberturaInitMethodVisitor extends MethodVisitor {
+		private String className;
+		public GenerateCallCoberturaInitMethodVisitor(MethodVisitor arg0,
+				String className) {
+			super(Opcodes.ASM4, arg0);
+			this.className = className;
+		}
+
+		@Override
+		public void visitCode() {
+			codeProvider.generateCallCoberturaInitMethod(mv, className);
+			super.visitCode();
+		}
+	}
+
+	/**
+	 * <p>If there was no 'static initialization block' in the class, the method is responsible for generating the method.<br/>
+	 * It is also responsible for generating method that keeps mapping of counterIds into source places connected to them</p>
+	 */
+	@Override
+	public void visitEnd() {
+		if (!wasStaticInitMethodVisited) {
+			//We need to generate new method
+			MethodVisitor mv = super.visitMethod(Opcodes.ACC_STATIC,
+					"<clinit>", "()V", null, null);
+			mv.visitCode();
+			codeProvider.generateCallCoberturaInitMethod(mv, classMap
+					.getClassName());
+			mv.visitInsn(Opcodes.RETURN);
+			mv.visitMaxs(/*stack*/3,/*local*/0);
+			mv.visitEnd();
+			wasStaticInitMethodVisited = true;
+		}
+
+		codeProvider.generateCoberturaInitMethod(cv, classMap.getClassName(),
+				classMap.getMaxCounterId() + 1);
+		codeProvider.generateCoberturaClassMapMethod(cv, classMap);
+		codeProvider.generateCoberturaGetAndResetCountersMethod(cv, classMap
+				.getClassName());
+
+		super.visitEnd();
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/InjectCodeTouchPointListener.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/InjectCodeTouchPointListener.java
new file mode 100644
index 0000000..0534ed9
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/pass3/InjectCodeTouchPointListener.java
@@ -0,0 +1,186 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.pass3;
+
+import net.sourceforge.cobertura.instrument.TouchPointListener;
+import net.sourceforge.cobertura.instrument.tp.ClassMap;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+/**
+ * Inject code provided by {@link #codeProvider} into the instrumented method's body. Injects code that
+ * is responsible for incrementing counters. Mapping of places into counters is provided by {@link #classMap}.
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class InjectCodeTouchPointListener implements TouchPointListener {
+	private final static Logger logger = LoggerFactory
+			.getLogger(InjectCodeTouchPointListener.class);
+	/**
+	 * Component that is resposible for generation of the snipets
+	 */
+	private final CodeProvider codeProvider;
+
+	/**
+	 * Source of mapping from place (eventId) into counterId that is incremented if the place is touched
+	 */
+	private final ClassMap classMap;
+
+	private int lastJumpIdVariableIndex;
+
+	public InjectCodeTouchPointListener(ClassMap classMap,
+			CodeProvider codeProvider) {
+		this.classMap = classMap;
+		this.codeProvider = codeProvider;
+	}
+
+	/**
+	 * Before jump we will store into 'internal variable' the counterId of a 'true' branch of the JUMP
+	 */
+	public void beforeJump(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor) {
+		Integer jumpTrueCounterId = classMap.getCounterIdForJumpTrue(eventId);
+		if (jumpTrueCounterId != null) {
+			codeProvider.generateCodeThatSetsJumpCounterIdVariable(
+					nextMethodVisitor, jumpTrueCounterId,
+					lastJumpIdVariableIndex);
+		}
+	}
+
+	/**
+	 * After jump we will increment counterId for the 'false' branch of the JUMP.
+	 * Then we set internal variable to ZERO to avoid fake interpretation (another one incrementation)
+	 */
+	public void afterJump(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor) {
+		logger.debug("After jump:" + currentLine + "(" + eventId + ") to :"
+				+ label);
+		Integer jumpFalseCounterId = classMap.getCounterIdForJumpFalse(eventId);
+		if (jumpFalseCounterId != null) {
+			codeProvider.generateCodeThatIncrementsCoberturaCounter(
+					nextMethodVisitor, jumpFalseCounterId, classMap
+							.getClassName());
+			codeProvider.generateCodeThatZeroJumpCounterIdVariable(
+					nextMethodVisitor, lastJumpIdVariableIndex);
+		}
+	}
+
+	/**
+	 * Before switch we set the internal variable to a special counterId connected with the switch. This counterId is not
+	 * connected with any branch of the switch.
+	 */
+	public void beforeSwitch(int eventId, Label def, Label[] labels,
+			int currentLine, MethodVisitor mv, String conditionType) {
+		Integer switchCounterId = classMap.getCounterIdForSwitch(eventId);
+		if (switchCounterId != null) {
+			codeProvider.generateCodeThatSetsJumpCounterIdVariable(mv,
+					switchCounterId, lastJumpIdVariableIndex);
+		}
+	}
+
+	/**
+	 * <p>If the label is JUMP destination, we will increment the counter stored inside the 'internal variable'. This way we are
+	 * incrementing the 'true' branch of the condition. </p>
+	 * <p/>
+	 * <p>If the label is SWITCH destination, we check all switch instructions that have targets in the label we generate
+	 * code that checks if the 'internal variable' is equal to id of considered switch and if so increments counterId connected to the switch.
+	 */
+	public void afterLabel(int eventId, Label label, int currentLine,
+			MethodVisitor mv) {
+		logger.debug("Looking for jumps going to event(" + eventId + "):"
+				+ label + " ");
+		if (classMap.isJumpDestinationLabel(eventId)) {
+			codeProvider
+					.generateCodeThatIncrementsCoberturaCounterFromInternalVariable(
+							mv, lastJumpIdVariableIndex, classMap
+									.getClassName());
+		}
+
+		Map<Integer, Integer> branchTouchPoints = classMap
+				.getBranchLabelDescriptorsForLabelEvent(eventId);
+		if (branchTouchPoints != null) {
+			/*map of counterId of a switch into counterId of the branch of the switch*/
+			for (Map.Entry<Integer, Integer> entry : branchTouchPoints
+					.entrySet()) {
+				codeProvider
+						.generateCodeThatIncrementsCoberturaCounterIfVariableEqualsAndCleanVariable(
+								mv, entry.getKey(), entry.getValue(),
+								lastJumpIdVariableIndex, classMap
+										.getClassName());
+			}
+		}
+
+		if (classMap.isJumpDestinationLabel(eventId)) {
+			codeProvider.generateCodeThatZeroJumpCounterIdVariable(mv,
+					lastJumpIdVariableIndex);
+		}
+	}
+
+	/**
+	 * After every 'linenumber' instruction we increments counter connected with the line number.
+	 */
+	public void afterLineNumber(int eventId, Label label, int currentLine,
+			MethodVisitor nextMethodVisitor, String methodName,
+			String methodSignature) {
+		Integer lineCounterId = classMap.getCounterIdForLineEventId(eventId);
+		if (lineCounterId != null) {
+			codeProvider.generateCodeThatIncrementsCoberturaCounter(
+					nextMethodVisitor, lineCounterId, classMap.getClassName());
+		}
+	}
+
+	/**
+	 * At the start of every method we initiates the 'internal variable' with zero.
+	 */
+	public void afterMethodStart(MethodVisitor nextMethodVisitor) {
+		codeProvider.generateCodeThatZeroJumpCounterIdVariable(
+				nextMethodVisitor, lastJumpIdVariableIndex);
+	}
+
+	// ------------------- ignored events -------------------------------	
+
+	public void beforeLabel(int eventId, Label label, int currentLine,
+			MethodVisitor mv) {
+	}
+
+	public void ignoreLine(int eventId, int currentLine) {
+	}
+
+	// ------------------- getters and setters --------------------------	
+
+	/**
+	 * Index of 'internal variable'. Should be detected by {@link ShiftVariableMethodAdapter#calculateFirstStackVariable(int, String)}.
+	 */
+	public void setLastJumpIdVariableIndex(int lastJumpIdVariableIndex) {
+		this.lastJumpIdVariableIndex = lastJumpIdVariableIndex;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/ClassMap.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/ClassMap.java
new file mode 100644
index 0000000..f02154d
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/ClassMap.java
@@ -0,0 +1,404 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.tp;
+
+import net.sourceforge.cobertura.coveragedata.ClassData;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.instrument.pass2.BuildClassMapClassVisitor;
+
+import org.objectweb.asm.Label;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * <p>This class is a container for informations gathered during class analyzing done by {@link BuildClassMapClassVisitor}.</p>
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class ClassMap {
+	private static final Logger logger = LoggerFactory
+			.getLogger(ClassMap.class);
+	/**
+	 * Simple name of source-file that was used to generate that value
+	 */
+	private String source;
+
+	/**
+	 * We map every eventId that is connected to instruction that created touch-point to the touch-point
+	 */
+	private final Map<Integer, TouchPointDescriptor> eventId2touchPointDescriptor = new HashMap<Integer, TouchPointDescriptor>();
+
+	/**
+	 * Contains map of label into set of {@link JumpTouchPointDescriptor} or {@link SwitchTouchPointDescriptor} that the label could be destination of
+	 * <p/>
+	 * <p>The labels used here are {@link Label} created during {@link BuildClassMapClassVisitor} pass. Don't try to compare it with labels created by other instrumentation passes.
+	 * Instead you should use eventId and {@link #eventId2label} to get the label created in the first pass and lookup using the label.</p>
+	 */
+	private final Map<Label, Set<TouchPointDescriptor>> label2sourcePoints = new HashMap<Label, Set<TouchPointDescriptor>>();
+
+	/**
+	 * Maps eventId to code label from BuildClassMapClassInstrumenter pass
+	 */
+	private final Map<Integer, Label> eventId2label = new HashMap<Integer, Label>();
+
+	/**
+	 * List of line numbers (not lineIds) of lines that are not allowed to contain touch-point. This
+	 * lines was probably excluded from coverage using 'ignore' stuff.
+	 */
+	private final Set<Integer> blockedLines = new HashSet<Integer>();
+
+	/**
+	 * List of touch-points stored in given line.
+	 */
+	private final SortedMap<Integer, List<TouchPointDescriptor>> line2touchPoints = new TreeMap<Integer, List<TouchPointDescriptor>>();
+
+	/**
+	 * Set of eventIds that has bean already registered.
+	 */
+	private final Set<Integer> alreadyRegisteredEvents = new HashSet<Integer>();
+
+	/*from duplicate to origin*/
+	private final Map<Label, Label> labelDuplicates2orginMap = new HashMap<Label, Label>();
+	private final Map<Label, Set<Label>> labelDuplicates2duplicateMap = new HashMap<Label, Set<Label>>();
+
+	private String className;
+
+	private int maxCounterId = 0;
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public void registerNewJump(int eventId, int currentLine,
+			Label destinationLabel) {
+		if (alreadyRegisteredEvents.add(eventId)) {
+			logger.debug(className + ":" + currentLine + ": Registering JUMP ("
+					+ eventId + ") to " + destinationLabel);
+			JumpTouchPointDescriptor descriptor = new JumpTouchPointDescriptor(
+					eventId, currentLine/*,destinationLabel*/);
+			eventId2touchPointDescriptor.put(eventId, descriptor);
+			getOrCreateSourcePoints(destinationLabel).add(descriptor);
+			getOrCreateLineTouchPoints(currentLine).add(descriptor);
+		} else {
+			logger.debug(className + ":" + currentLine
+					+ ": NOT registering (already done) JUMP (" + eventId
+					+ ") to " + destinationLabel);
+		}
+	}
+
+	private List<TouchPointDescriptor> getOrCreateLineTouchPoints(
+			int currentLine) {
+		List<TouchPointDescriptor> res = line2touchPoints.get(currentLine);
+		if (res == null) {
+			res = new LinkedList<TouchPointDescriptor>();
+			line2touchPoints.put(currentLine, res);
+		}
+		return res;
+	}
+
+	private Set<TouchPointDescriptor> getOrCreateSourcePoints(Label label) {
+		Set<TouchPointDescriptor> res = label2sourcePoints.get(label);
+		if (res == null) {
+			res = new HashSet<TouchPointDescriptor>();
+			label2sourcePoints.put(label, res);
+		}
+		return res;
+	}
+
+	public void registerNewLabel(int eventId, int currentLine, Label label) {
+		logger.debug(className + ":" + currentLine + ": Registering label ("
+				+ eventId + ") " + label);
+		if (alreadyRegisteredEvents.add(eventId)) {
+			eventId2label.put(eventId, label);
+			putIntoDuplicatesMaps(label, label);
+		} else {
+			putIntoDuplicatesMaps(label, eventId2label.get(eventId));
+		}
+	}
+
+	public void putIntoDuplicatesMaps(Label label, Label orgin) {
+		labelDuplicates2orginMap.put(label, orgin); //For coherancy
+		Set<Label> list = labelDuplicates2duplicateMap.get(orgin);
+		if (list == null) {
+			list = new HashSet<Label>();
+			labelDuplicates2duplicateMap.put(orgin, list);
+		}
+		list.add(label);
+	}
+
+	public void registerLineNumber(int eventId, int currentLine, Label label,
+			String methodName, String methodSignature) {
+		logger.debug(className + ":" + currentLine + ": Registering line ("
+				+ eventId + ") " + label);
+		if (alreadyRegisteredEvents.add(eventId)) {
+			if (!blockedLines.contains(currentLine)) {
+				LineTouchPointDescriptor line = new LineTouchPointDescriptor(
+						eventId, currentLine, methodName, methodSignature);
+				eventId2label.put(eventId, label);
+				eventId2touchPointDescriptor.put(eventId, line);
+				getOrCreateLineTouchPoints(currentLine).add(line);
+			}
+		}
+	}
+
+	public void unregisterLine(int eventId, int currentLine) {
+		if (alreadyRegisteredEvents.add(eventId)) {
+			blockedLines.add(currentLine);
+			List<TouchPointDescriptor> res = line2touchPoints.get(currentLine);
+			if (res != null) {
+				Iterator<TouchPointDescriptor> iter = res.iterator();
+				while (iter.hasNext()) {
+					TouchPointDescriptor desc = iter.next();
+					if (desc instanceof LineTouchPointDescriptor) {
+						iter.remove();
+						eventId2touchPointDescriptor.remove(desc.getEventId());
+						eventId2label.remove(desc.getEventId());
+					}
+				}
+			}
+		}
+	}
+
+	public void registerSwitch(int eventId, int currentLine, Label def,
+			Label[] labels, String conditionType) {
+		if (alreadyRegisteredEvents.add(eventId)) {
+			SwitchTouchPointDescriptor swi = new SwitchTouchPointDescriptor(
+					eventId, currentLine, def, labels, conditionType);
+			eventId2touchPointDescriptor.put(eventId, swi);
+			getOrCreateLineTouchPoints(currentLine).add(swi);
+			getOrCreateSourcePoints(def).add(swi);
+			for (Label l : labels) {
+				//				System.out.println("Registering label to switch:"+l);
+				getOrCreateSourcePoints(l).add(swi);
+			}
+		}
+	}
+
+	//======================= data retrieval =====================================================	
+
+	public Integer getCounterIdForJumpTrue(int eventId) {
+		if (eventId2touchPointDescriptor.get(eventId) instanceof JumpTouchPointDescriptor) {
+			JumpTouchPointDescriptor jumpTouchPointDescriptor = (JumpTouchPointDescriptor) eventId2touchPointDescriptor
+					.get(eventId);
+			if (jumpTouchPointDescriptor != null) {
+				return jumpTouchPointDescriptor.getCounterIdForTrue();
+			}
+		}
+		return null;
+	}
+
+	public Integer getCounterIdForJumpFalse(int eventId) {
+		if (eventId2touchPointDescriptor.get(eventId) instanceof JumpTouchPointDescriptor) {
+			JumpTouchPointDescriptor jumpTouchPointDescriptor = (JumpTouchPointDescriptor) eventId2touchPointDescriptor
+					.get(eventId);
+			if (jumpTouchPointDescriptor != null) {
+				return jumpTouchPointDescriptor.getCounterIdForFalse();
+			}
+		}
+		return null;
+	}
+
+	public boolean isJumpDestinationLabel(int eventId) {
+		Label label_local = eventId2label.get(eventId);
+		logger.debug("Label found for eventId:" + eventId + ":" + label_local);
+		if (labelDuplicates2duplicateMap.containsKey(label_local)) {
+			for (Label label : labelDuplicates2duplicateMap.get(label_local)) {
+				if (label != null) {
+					Set<TouchPointDescriptor> res = label2sourcePoints
+							.get(label);
+					logger
+							.debug("label2sourcePoints.get(" + label + "):"
+									+ res);
+					if (res != null) {
+						for (TouchPointDescriptor r : res) {
+							if (r instanceof JumpTouchPointDescriptor) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	public Integer getCounterIdForSwitch(int eventId) {
+		if (eventId2touchPointDescriptor.get(eventId) instanceof SwitchTouchPointDescriptor) {
+			SwitchTouchPointDescriptor point = (SwitchTouchPointDescriptor) eventId2touchPointDescriptor
+					.get(eventId);
+			if (point != null) {
+				return point.getCounterId();
+			}
+		}
+		return null;
+	}
+
+	public Integer getCounterIdForLineEventId(int eventId) {
+		if (eventId2touchPointDescriptor.get(eventId) instanceof LineTouchPointDescriptor) {
+			LineTouchPointDescriptor point = (LineTouchPointDescriptor) eventId2touchPointDescriptor
+					.get(eventId);
+			if (point != null) {
+				return point.getCounterId();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns map:   switchCounterId --> counterId
+	 *
+	 * @param labelEventId
+	 *
+	 * @return
+	 */
+	public Map<Integer, Integer> getBranchLabelDescriptorsForLabelEvent(
+			int labelEventId) {
+		Label label_local = eventId2label.get(labelEventId);
+		if (label_local != null) {
+			if (labelDuplicates2duplicateMap.containsKey(label_local)) {
+				for (Label label : labelDuplicates2duplicateMap
+						.get(label_local)) {
+					Set<TouchPointDescriptor> list = label2sourcePoints
+							.get(label);
+					if (list != null) {
+						Map<Integer, Integer> res = new HashMap<Integer, Integer>();
+						for (TouchPointDescriptor r : list) {
+							if (r instanceof SwitchTouchPointDescriptor) {
+								SwitchTouchPointDescriptor swi = (SwitchTouchPointDescriptor) r;
+								res.put(swi.getCounterId(), swi
+										.getCounterIdForLabel(label));
+							}
+						}
+						return res;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Iterates over all touch-points created during class analysis and assigns
+	 * hit-counter identifiers to each of the touchpoint (some of them needs mode then one
+	 * hit-counter).
+	 * <p/>
+	 * <p>This class assign hit-counter ids to each touch-point and upgrades maxCounterId to
+	 * reflect the greatest assigned Id.
+	 */
+	public void assignCounterIds() {
+		AtomicInteger idGenerator = new AtomicInteger(0);
+		for (List<TouchPointDescriptor> tpd : line2touchPoints.values()) {
+			for (TouchPointDescriptor t : tpd) {
+				t.assignCounters(idGenerator);
+			}
+		}
+		maxCounterId = idGenerator.get();
+	}
+
+	public int getMaxCounterId() {
+		return maxCounterId;
+	}
+
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public List<TouchPointDescriptor> getTouchPointsInLineOrder() {
+		LinkedList<TouchPointDescriptor> res = new LinkedList<TouchPointDescriptor>();
+		for (List<TouchPointDescriptor> tpd : line2touchPoints.values()) {
+			for (TouchPointDescriptor t : tpd) {
+				if (tpd instanceof LineTouchPointDescriptor) {
+					res.add(t);
+				}
+			}
+			for (TouchPointDescriptor t : tpd) {
+				if (!(tpd instanceof LineTouchPointDescriptor)) {
+					res.add(t);
+				}
+			}
+		}
+		return res;
+	}
+
+	/**
+	 * Upgrades {@link ProjectData} to contain all information fount in class during class instrumentation.
+	 * <p/>
+	 * <p>I don't like the idea o creating sar file during the instrumentation, but we need to do it,
+	 * to be compatible with tools that expact that (such a cobertura-maven-plugin)</p>
+	 *
+	 * @param projectData
+	 */
+	public ClassData applyOnProjectData(ProjectData projectData,
+			boolean instrumented) {
+		ClassData classData = projectData.getOrCreateClassData(className
+				.replace('/', '.'));
+		if (source != null) {
+			classData.setSourceFileName(source);
+		}
+		if (instrumented) {
+			classData.setContainsInstrumentationInfo();
+			int lastLine = 0;
+			int jumpsInLine = 0;
+			int toucesInLine = 0;
+
+			for (TouchPointDescriptor tpd : getTouchPointsInLineOrder()) {
+				if (tpd.getLineNumber() != lastLine) {
+					jumpsInLine = 0;
+					toucesInLine = 0;
+					lastLine = tpd.getLineNumber();
+				}
+				if (tpd instanceof LineTouchPointDescriptor) {
+					classData.addLine(tpd.getLineNumber(),
+							((LineTouchPointDescriptor) tpd).getMethodName(),
+							((LineTouchPointDescriptor) tpd)
+									.getMethodSignature());
+				} else if (tpd instanceof JumpTouchPointDescriptor) {
+					classData.addLineJump(tpd.getLineNumber(), jumpsInLine++);
+				} else if (tpd instanceof SwitchTouchPointDescriptor) {
+					int countersCnt = ((SwitchTouchPointDescriptor) tpd)
+							.getCountersForLabelsCnt();
+					//TODO(ptab): instead of Integer.MAX_VALUE should be length of Enum.
+					classData.addLineSwitch(tpd.getLineNumber(),
+							toucesInLine++, 0, countersCnt - 2,
+							Integer.MAX_VALUE);
+				}
+			}
+		}
+		return classData;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/JumpTouchPointDescriptor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/JumpTouchPointDescriptor.java
new file mode 100644
index 0000000..d28aeae
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/JumpTouchPointDescriptor.java
@@ -0,0 +1,72 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.tp;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Class representing a touch-point connected to a JUMP instruction in source-code.
+ * <p/>
+ * <p>A JUMP touch-point have assigned two counters:
+ * <ul>
+ * <li>TRUE - touched in case when jump condition is meet</li>
+ * <li>FALSE - touched when jump condition is not meet</li>
+ * </ul></p>
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class JumpTouchPointDescriptor extends TouchPointDescriptor {
+	private int counterIdForTrue;
+	private int counterIdForFalse;
+
+	public JumpTouchPointDescriptor(int eventId, int currentLine) {
+		super(eventId, currentLine);
+	}
+
+	public int getCounterIdForFalse() {
+		return counterIdForFalse;
+	}
+
+	public int getCounterIdForTrue() {
+		return counterIdForTrue;
+	}
+
+	public void setCounterIdForFalse(int counterIdForFalse) {
+		this.counterIdForFalse = counterIdForFalse;
+	}
+
+	public void setCounterIdForTrue(int counterIdForTrue) {
+		this.counterIdForTrue = counterIdForTrue;
+	}
+
+	@Override
+	public int assignCounters(AtomicInteger idGenerator) {
+		counterIdForFalse = idGenerator.incrementAndGet();
+		counterIdForTrue = idGenerator.incrementAndGet();
+		return 2;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/LineTouchPointDescriptor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/LineTouchPointDescriptor.java
new file mode 100644
index 0000000..120cb48
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/LineTouchPointDescriptor.java
@@ -0,0 +1,79 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.tp;
+
+import net.sourceforge.cobertura.coveragedata.LineData;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Class representing a touch-point connected to a single line of source-code
+ * <p/>
+ * <p>A LINE touch-point have assigned only one counter.</p>
+ * <p/>
+ * <p>We also storing a {@link #methodName} and a {@link #methodSignature} (consider to move this fields into {@link TouchPointDescriptor}).
+ * Those fields are needed to properly create instance of {@link LineData}. </p>
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class LineTouchPointDescriptor extends TouchPointDescriptor {
+	private Integer counterId;
+
+	/**
+	 * Name of a method, the line belongs to
+	 */
+	private String methodName;
+
+	/**
+	 * Signature (description) of a method, the line belongs to.
+	 */
+	private String methodSignature;
+
+	public LineTouchPointDescriptor(int eventId, int lineNumber,
+			String methodName, String methodSignature) {
+		super(eventId, lineNumber);
+		this.methodName = methodName;
+		this.methodSignature = methodSignature;
+	}
+
+	@Override
+	public int assignCounters(AtomicInteger idGenerator) {
+		counterId = idGenerator.incrementAndGet();
+		return 1;
+	}
+
+	public Integer getCounterId() {
+		return counterId;
+	}
+
+	public String getMethodName() {
+		return methodName;
+	}
+
+	public String getMethodSignature() {
+		return methodSignature;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/SwitchTouchPointDescriptor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/SwitchTouchPointDescriptor.java
new file mode 100644
index 0000000..d4612fd
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/SwitchTouchPointDescriptor.java
@@ -0,0 +1,123 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.tp;
+
+import net.sourceforge.cobertura.coveragedata.LineData;
+import org.objectweb.asm.Label;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Class representing a touch-point connected to a a SWITCH instruction in a source-code
+ * <p/>
+ * <p>A SWITCH touch-point uses one more counter then distinct number destination labels ({@link #getCountersForLabelsCnt()}).<br/>
+ * One 'internal' counterId ({@link #counterId}) is a special identifier of SWITCH statement (used in runtime), but in fact we don't expect any
+ * incrementation of the counter. We implemented this to use a counterId because we are storing the value inside 'internal variable' and we need to be sure
+ * that the value is connected to the last seen SWITCH statement.<br/>
+ * <p/>
+ * Or other counterIds represents different branches (different destination labels of the switch).
+ * </p>
+ * <p/>
+ * <p>We also storing a {@link #methodName} and a {@link #methodSignature} (consider to move this fields into {@link TouchPointDescriptor}).
+ * Those fields are needed to properly create instance of {@link LineData}. </p>
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public class SwitchTouchPointDescriptor extends TouchPointDescriptor {
+	private final Label defaultDestinationLabel;
+	private final Label[] labels;
+	/**
+	 * Encoded as: {@link org.objectweb.asm.commons#AnalyzerAdapter#stack}
+	 */
+	private final String enum_type;
+
+	private Integer counterId;
+	private Map<Label, Integer> label2counterId;
+
+	/**
+	 * Creates o new switch-touch point.
+	 *
+	 * @param eventId     - eventId connected to the SWITCH instruction
+	 * @param currentLine - line number of the switch
+	 * @param def         - internal identifier of a default destination label
+	 * @param labels      - table of other destination labels for different values (duplicates allowed)
+	 */
+	public SwitchTouchPointDescriptor(int eventId, int currentLine, Label def,
+			Label[] labels, String enum_type) {
+		super(eventId, currentLine);
+		this.labels = labels;
+		this.defaultDestinationLabel = def;
+		this.enum_type = enum_type;
+	}
+
+	public Integer getCounterId() {
+		return counterId;
+	}
+
+	public void setCounterId(Integer counterId) {
+		this.counterId = counterId;
+	}
+
+	@Override
+	public int assignCounters(AtomicInteger idGenerator) {
+		counterId = idGenerator.incrementAndGet();
+		label2counterId = new HashMap<Label, Integer>();
+		int idp = idGenerator.incrementAndGet();
+		label2counterId.put(defaultDestinationLabel, idp);
+		int i = 0;
+		for (Label l : labels) {
+			i++;
+			idp = idGenerator.incrementAndGet();
+			label2counterId.put(l, idp);
+		}
+		return i + 2;
+	}
+
+	public Integer getCounterIdForLabel(Label label) {
+		return label2counterId.get(label);
+	}
+
+	public Collection<Integer> getCountersForLabels() {
+		return label2counterId.values();
+	}
+
+	/**
+	 * <p>Works before calling 'assignCounters'</p>
+	 *
+	 * @return Number of distinct destination labels of the SWITCH (It's the same as number of branches supported by the switch).
+	 */
+	public int getCountersForLabelsCnt() {
+		Set<Label> l = new HashSet<Label>(Arrays.asList(labels));
+		l.add(defaultDestinationLabel);
+		return l.size();
+	}
+
+	public String getEnumType() {
+		return enum_type;
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/TouchPointDescriptor.java b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/TouchPointDescriptor.java
new file mode 100644
index 0000000..543c3b3
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/instrument/tp/TouchPointDescriptor.java
@@ -0,0 +1,90 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument.tp;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Root class for all touch-points (points in source-code that we want to monitor)
+ *
+ * @author piotr.tabor at gmail.com
+ */
+public abstract class TouchPointDescriptor {
+
+	public TouchPointDescriptor(int eventId, int lineNumber) {
+		this.eventId = eventId;
+		this.lineNumber = lineNumber;
+	}
+
+	/**
+	 * eventId (asm code identifier) of the interesting instruction
+	 */
+	private int eventId;
+
+	/**
+	 * Number of line in which the touch-point is localized
+	 */
+	private int lineNumber;
+
+	/**
+	 * @return eventId (asm code identifier) of the interesting instruction
+	 */
+	public int getEventId() {
+		return eventId;
+	}
+
+	/**
+	 * Sets eventId (asm code identifier) of the interesting instruction
+	 */
+
+	public void setEventId(int eventId) {
+		this.eventId = eventId;
+	}
+
+	/**
+	 * @return number of line in which the touch-point is localized
+	 */
+	public int getLineNumber() {
+		return lineNumber;
+	}
+
+	/**
+	 * Sets number of line in which the touch-point is localized
+	 */
+	public void setLineNumber(int lineNumber) {
+		this.lineNumber = lineNumber;
+	}
+
+	/**
+	 * Every touch-point will have assigned some counters. This methods assigne the ids to the touch-point
+	 * using given idGenerator
+	 *
+	 * @param idGenerator
+	 *
+	 * @return number of used 'ids' for the touch-point.
+	 */
+	public abstract int assignCounters(AtomicInteger idGenerator);
+}
diff --git a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/FunctionMetric.java
similarity index 70%
copy from src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/javancss/FunctionMetric.java
index 325d99c..f76d581 100644
--- a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/FunctionMetric.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Cobertura - http://cobertura.sourceforge.net/
  *
  * This file was taken from JavaNCSS
@@ -20,11 +20,24 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  * USA
  */
-
-package net.sourceforge.cobertura.javancss.test;
-
-public class JavancssTest
-
-{
-
-}
+
+package net.sourceforge.cobertura.javancss;
+
+/**
+ * Basic data class to store all metrics attached to a function.
+ *
+ * @author  Herv Boutemy
+ * @version $Id: FunctionMetric.java 121 2009-01-17 22:19:45Z hboutemy $
+ */
+public class FunctionMetric extends Metric {
+	public int ccn = 0;
+
+	public FunctionMetric() {
+		super();
+	}
+
+	public void clear() {
+		super.clear();
+		ccn = 0;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/javancss/Javancss.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/Javancss.java
new file mode 100644
index 0000000..6e48073
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/Javancss.java
@@ -0,0 +1,508 @@
+/**
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * This file was taken from JavaNCSS
+ * http://www.kclee.com/clemens/java/javancss/
+ * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.javancss;
+
+import net.sourceforge.cobertura.javancss.ccl.Exitable;
+import net.sourceforge.cobertura.javancss.ccl.Init;
+import net.sourceforge.cobertura.javancss.ccl.Util;
+import net.sourceforge.cobertura.javancss.parser.*;
+import net.sourceforge.cobertura.javancss.parser.debug.JavaParserDebug;
+import net.sourceforge.cobertura.javancss.parser.java15.JavaParser15;
+import net.sourceforge.cobertura.javancss.parser.java15.debug.JavaParser15Debug;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * While the Java parser class might be the heart of JavaNCSS,
+ * this class is the brain. This class controls input and output and
+ * invokes the Java parser.
+ *
+ * @author    Chr. Clemens Lee <clemens at kclee.com>
+ *            , recursive feature by Pääkö Hannu
+ *            , additional javadoc metrics by Emilio Gongora <emilio at sms.nl>
+ *            , and Guillermo Rodriguez <guille at sms.nl>.
+ * @version   $Id: Javancss.java 198 2009-09-07 21:43:19Z hboutemy $
+ */
+public class Javancss implements Exitable {
+	private static final String S_INIT__FILE_CONTENT = "[Init]\n"
+			+ "Author=Chr. Clemens Lee\n"
+			+ "\n"
+			+ "[Help]\n"
+			+ "; Please do not edit the Help section\n"
+			+ "HelpUsage=@srcfiles.txt | *.java | <stdin>\n"
+			+ "Options=ncss,package,object,function,all,gui,xml,out,recursive,check,encoding,parser15\n"
+			+ "ncss=b,o,Counts the program NCSS (default).\n"
+			+ "package=b,o,Assembles a statistic on package level.\n"
+			+ "object=b,o,Counts the object NCSS.\n"
+			+ "function=b,o,Counts the function NCSS.\n"
+			+ "all=b,o,The same as '-function -object -package'.\n"
+			+ "gui=b,o,Opens a gui to present the '-all' output in tabbed panels.\n"
+			+ "xml=b,o,Output in xml format.\n"
+			+ "out=s,o,Output file name. By default output goes to standard out.\n"
+			+ "recursive=b,o,Recurse to subdirs.\n"
+			+ "check=b,o,Triggers a javancss self test.\n"
+			+ "encoding=s,o,Encoding used while reading source files (default: platform encoding).\n"
+			+ "parser15=b,o,Use new experimental Java 1.5 parser.\n" + "\n"
+			+ "[Colors]\n" + "UseSystemColors=true\n";
+
+	private boolean _bExit = false;
+
+	private List/*<File>*/_vJavaSourceFiles = null;
+	private String encoding = null;
+
+	private String _sErrorMessage = null;
+	private Throwable _thrwError = null;
+
+	private JavaParserInterface _pJavaParser = null;
+	private int _ncss = 0;
+	private int _loc = 0;
+	private List/*<FunctionMetric>*/_vFunctionMetrics = new ArrayList();
+	private List/*<ObjectMetric>*/_vObjectMetrics = new ArrayList();
+	private List/*<PackageMetric>*/_vPackageMetrics = null;
+	private List _vImports = null;
+	private Map/*<String,PackageMetric>*/_htPackages = null;
+	private Object[] _aoPackage = null;
+
+	/**
+	 * Just used for parseImports.
+	 */
+	private File _sJavaSourceFile = null;
+
+	private Reader createSourceReader(File sSourceFile_) {
+		try {
+			return newReader(sSourceFile_);
+		} catch (IOException pIOException) {
+			if (Util.isEmpty(_sErrorMessage)) {
+				_sErrorMessage = "";
+			} else {
+				_sErrorMessage += "\n";
+			}
+			_sErrorMessage += "File not found: "
+					+ sSourceFile_.getAbsolutePath();
+			_thrwError = pIOException;
+
+			return null;
+		}
+	}
+
+	private void _measureSource(File sSourceFile_) throws IOException,
+			Exception, Error {
+		Reader reader = null;
+
+		// opens the file
+		try {
+			reader = newReader(sSourceFile_);
+		} catch (IOException pIOException) {
+			if (Util.isEmpty(_sErrorMessage)) {
+				_sErrorMessage = "";
+			} else {
+				_sErrorMessage += "\n";
+			}
+			_sErrorMessage += "File not found: "
+					+ sSourceFile_.getAbsolutePath();
+			_thrwError = pIOException;
+
+			throw pIOException;
+		}
+
+		String sTempErrorMessage = _sErrorMessage;
+		try {
+			// the same method but with a Reader
+			_measureSource(reader);
+		} catch (Exception pParseException) {
+			if (sTempErrorMessage == null) {
+				sTempErrorMessage = "";
+			}
+			sTempErrorMessage += "ParseException in "
+					+ sSourceFile_.getAbsolutePath()
+					+ "\nLast useful checkpoint: \""
+					+ _pJavaParser.getLastFunction() + "\"\n";
+			sTempErrorMessage += pParseException.getMessage() + "\n";
+
+			_sErrorMessage = sTempErrorMessage;
+			_thrwError = pParseException;
+
+			throw pParseException;
+		} catch (Error pTokenMgrError) {
+			if (sTempErrorMessage == null) {
+				sTempErrorMessage = "";
+			}
+			sTempErrorMessage += "TokenMgrError in "
+					+ sSourceFile_.getAbsolutePath() + "\n"
+					+ pTokenMgrError.getMessage() + "\n";
+			_sErrorMessage = sTempErrorMessage;
+			_thrwError = pTokenMgrError;
+
+			throw pTokenMgrError;
+		}
+	}
+
+	private void _measureSource(Reader reader) throws IOException, Exception,
+			Error {
+		Util.debug("_measureSource(Reader).ENTER");
+		// Util.debug( "_measureSource(Reader).parser15: -->" + (_pInit.getOptions().get( "parser15" ) + "<--" );
+		// Util.panicIf( _pInit == null );
+		// Util.panicIf( _pInit.getOptions() == null );
+		Util.debug("_measureSource(Reader).ENTER2");
+		try {
+			// create a parser object
+			boolean parser15 = _pInit != null && _pInit.getOptions() != null
+					&& _pInit.getOptions().get("parser15") != null;
+			if (Util.isDebug()) {
+				if (parser15) {
+					Util.debug("creating JavaParser15Debug");
+					_pJavaParser = new JavaParser15Debug(reader);
+				} else {
+					Util.debug("creating JavaParserDebug");
+					_pJavaParser = new JavaParserDebug(reader);
+				}
+			} else {
+				if (parser15) {
+					Util.debug("creating JavaParser15");
+					_pJavaParser = new JavaParser15(reader);
+				} else {
+					Util.debug("creating JavaParser");
+					_pJavaParser = new JavaParser(reader);
+				}
+			}
+
+			// execute the parser
+			_pJavaParser.parse();
+			Util
+					.debug("Javancss._measureSource(DataInputStream).SUCCESSFULLY_PARSED");
+
+			_ncss += _pJavaParser.getNcss(); // increment the ncss
+			_loc += _pJavaParser.getLOC(); // and loc
+			// add new data to global vector
+			_vFunctionMetrics.addAll(_pJavaParser.getFunction());
+			_vObjectMetrics.addAll(_pJavaParser.getObject());
+			Map htNewPackages = _pJavaParser.getPackage();
+
+			/* List vNewPackages = new Vector(); */
+			for (Iterator ePackages = htNewPackages.entrySet().iterator(); ePackages
+					.hasNext();) {
+				String sPackage = (String) ((Map.Entry) ePackages.next())
+						.getKey();
+
+				PackageMetric pckmNext = (PackageMetric) htNewPackages
+						.get(sPackage);
+				pckmNext.name = sPackage;
+
+				PackageMetric pckmPrevious = (PackageMetric) _htPackages
+						.get(sPackage);
+				pckmNext.add(pckmPrevious);
+
+				_htPackages.put(sPackage, pckmNext);
+			}
+		} catch (Exception pParseException) {
+			if (_sErrorMessage == null) {
+				_sErrorMessage = "";
+			}
+			_sErrorMessage += "ParseException in STDIN";
+			if (_pJavaParser != null) {
+				_sErrorMessage += "\nLast useful checkpoint: \""
+						+ _pJavaParser.getLastFunction() + "\"\n";
+			}
+			_sErrorMessage += pParseException.getMessage() + "\n";
+			_thrwError = pParseException;
+
+			throw pParseException;
+		} catch (Error pTokenMgrError) {
+			if (_sErrorMessage == null) {
+				_sErrorMessage = "";
+			}
+			_sErrorMessage += "TokenMgrError in STDIN\n";
+			_sErrorMessage += pTokenMgrError.getMessage() + "\n";
+			_thrwError = pTokenMgrError;
+
+			throw pTokenMgrError;
+		}
+	}
+
+	private void _measureFiles(List/*<File>*/vJavaSourceFiles_)
+			throws IOException, ParseException, TokenMgrError {
+		// for each file
+		for (Iterator e = vJavaSourceFiles_.iterator(); e.hasNext();) {
+			File file = (File) e.next();
+
+			try {
+				_measureSource(file);
+			} catch (Throwable pThrowable) {
+				// hmm, do nothing? Use getLastError() or so to check for details.
+			}
+		}
+	}
+
+	/**
+	 * If arguments were provided, they are used, otherwise
+	 * the input stream is used.
+	 */
+	private void _measureRoot(Reader reader) throws IOException, Exception,
+			Error {
+		_htPackages = new HashMap();
+
+		// either there are argument files, or stdin is used
+		if (_vJavaSourceFiles == null) {
+			_measureSource(reader);
+		} else {
+			// the collection of files get measured
+			_measureFiles(_vJavaSourceFiles);
+		}
+
+		_vPackageMetrics = new ArrayList();
+		for (Iterator ePackages = _htPackages.keySet().iterator(); ePackages
+				.hasNext();) {
+			String sPackage = (String) ePackages.next();
+
+			PackageMetric pckmNext = (PackageMetric) _htPackages.get(sPackage);
+			_vPackageMetrics.add(pckmNext);
+		}
+	}
+
+	public List getImports() {
+		return _vImports;
+	}
+
+	/**
+	 * Return info about package statement.
+	 * First element has name of package,
+	 * then begin of line, etc.
+	 */
+	public Object[] getPackage() {
+		return _aoPackage;
+	}
+
+	/**
+	 * The same as getFunctionMetrics?!
+	 */
+	public List/*<FunctionMetric>*/getFunctions() {
+		return _vFunctionMetrics;
+	}
+
+	public Javancss(List/*<File>*/vJavaSourceFiles_) {
+		_vJavaSourceFiles = vJavaSourceFiles_;
+		try {
+			_measureRoot(newReader(System.in));
+		} catch (Exception e) {
+			e.printStackTrace();
+		} catch (TokenMgrError pError) {
+			pError.printStackTrace();
+		}
+	}
+
+	public Javancss(File sJavaSourceFile_) {
+		Util.debug("Javancss.<init>(String).sJavaSourceFile_: "
+				+ sJavaSourceFile_);
+		_sErrorMessage = null;
+		_vJavaSourceFiles = new ArrayList();
+		_vJavaSourceFiles.add(sJavaSourceFile_);
+		try {
+			_measureRoot(newReader(System.in));
+		} catch (Exception e) {
+			Util.debug("Javancss.<init>(String).e: " + e);
+			e.printStackTrace();
+		} catch (TokenMgrError pError) {
+			Util.debug("Javancss.<init>(String).pError: " + pError);
+			pError.printStackTrace();
+		}
+	}
+
+	/*
+	 * cobertura:  add this next constructor so any input stream can be used.
+	 * 
+	 * It should (more or less) be a copy of the Javancss(File) constructor, but just
+	 * make sure _vJavaSourceFiles is null.   _measureRoot will
+	 * use the input stream if it is null.
+	 */
+	public Javancss(InputStream isJavaSource_, String encoding) {
+		Util.debug("Javancss.<init>(InputStream).sJavaSourceFile_: "
+				+ isJavaSource_);
+		_sErrorMessage = null;
+		_vJavaSourceFiles = null;
+		this.encoding = encoding;
+
+		try {
+			_measureRoot(newReader(isJavaSource_));
+		} catch (Exception e) {
+			Util.debug("Javancss.<init>(InputStream).e: " + e);
+			e.printStackTrace();
+		} catch (TokenMgrError pError) {
+			Util.debug("Javancss.<init>(InputStream).pError: " + pError);
+			pError.printStackTrace();
+		}
+	}
+
+	/**
+	 * Only way to create object that does not immediately
+	 * start to parse.
+	 */
+	public Javancss() {
+		super();
+
+		_sErrorMessage = null;
+		_thrwError = null;
+	}
+
+	public boolean parseImports() {
+		if (_sJavaSourceFile == null) {
+			Util.debug("Javancss.parseImports().NO_FILE");
+
+			return true;
+		}
+		Reader reader = createSourceReader(_sJavaSourceFile);
+		if (reader == null) {
+			Util.debug("Javancss.parseImports().NO_DIS");
+
+			return true;
+		}
+
+		try {
+			Util.debug("Javancss.parseImports().START_PARSING");
+			if (Util.isDebug() == false) {
+				_pJavaParser = (JavaParserInterface) (new JavaParser(reader));
+			} else {
+				_pJavaParser = (JavaParserInterface) (new JavaParserDebug(
+						reader));
+			}
+			_pJavaParser.parseImportUnit();
+			_vImports = _pJavaParser.getImports();
+			_aoPackage = _pJavaParser.getPackageObjects();
+			Util.debug("Javancss.parseImports().END_PARSING");
+		} catch (Exception pParseException) {
+			Util.debug("Javancss.parseImports().PARSE_EXCEPTION");
+			if (_sErrorMessage == null) {
+				_sErrorMessage = "";
+			}
+			_sErrorMessage += "ParseException in STDIN";
+			if (_pJavaParser != null) {
+				_sErrorMessage += "\nLast useful checkpoint: \""
+						+ _pJavaParser.getLastFunction() + "\"\n";
+			}
+			_sErrorMessage += pParseException.getMessage() + "\n";
+			_thrwError = pParseException;
+
+			return true;
+		} catch (Error pTokenMgrError) {
+			Util.debug("Javancss.parseImports().TOKEN_ERROR");
+			if (_sErrorMessage == null) {
+				_sErrorMessage = "";
+			}
+			_sErrorMessage += "TokenMgrError in STDIN\n";
+			_sErrorMessage += pTokenMgrError.getMessage() + "\n";
+			_thrwError = pTokenMgrError;
+
+			return true;
+		}
+
+		return false;
+	}
+
+	public void setSourceFile(File javaSourceFile_) {
+		_sJavaSourceFile = javaSourceFile_;
+		_vJavaSourceFiles = new ArrayList();
+		_vJavaSourceFiles.add(javaSourceFile_);
+	}
+	private Init _pInit = null;
+	public int getNcss() {
+		return _ncss;
+	}
+
+	public int getLOC() {
+		return _loc;
+	}
+
+	// added by SMS
+	public int getJvdc() {
+		return _pJavaParser.getJvdc();
+	}
+
+	/**
+	 * JDCL stands for javadoc comment lines (while jvdc stands
+	 * for number of javadoc comments).
+	 */
+	public int getJdcl() {
+		return JavaParserTokenManager._iFormalComments;
+	}
+
+	public int getSl() {
+		return JavaParserTokenManager._iSingleComments;
+	}
+
+	public int getMl() {
+		return JavaParserTokenManager._iMultiComments;
+	}
+	//
+
+	public List getFunctionMetrics() {
+		return (_vFunctionMetrics);
+	}
+
+	public List/*<ObjectMetric>*/getObjectMetrics() {
+		return (_vObjectMetrics);
+	}
+
+	/**
+	 * Returns list of packages in the form
+	 * PackageMetric objects.
+	 */
+	public List getPackageMetrics() {
+		return (_vPackageMetrics);
+	}
+
+	public String getLastErrorMessage() {
+		if (_sErrorMessage == null) {
+			return null;
+		}
+		return _sErrorMessage;
+	}
+
+	public Throwable getLastError() {
+		return _thrwError;
+	}
+
+	public void setExit() {
+		_bExit = true;
+	}
+
+	public String getEncoding() {
+		return encoding;
+	}
+
+	public void setEncoding(String encoding) {
+		this.encoding = encoding;
+	}
+
+	private Reader newReader(InputStream stream)
+			throws UnsupportedEncodingException {
+		return (encoding == null)
+				? new InputStreamReader(stream)
+				: new InputStreamReader(stream, encoding);
+	}
+
+	private Reader newReader(File file) throws FileNotFoundException,
+			UnsupportedEncodingException {
+		return newReader(new FileInputStream(file));
+	}
+}
diff --git a/src/net/sourceforge/cobertura/coveragedata/HasBeenInstrumented.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/JavancssFactory.java
similarity index 57%
rename from src/net/sourceforge/cobertura/coveragedata/HasBeenInstrumented.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/javancss/JavancssFactory.java
index c92de03..792b8bf 100644
--- a/src/net/sourceforge/cobertura/coveragedata/HasBeenInstrumented.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/JavancssFactory.java
@@ -1,37 +1,43 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-/**
- * Tag interface indicating that a particular class has already been
- * instrumented. This interface should also be implemented by those
- * classes that do not wish to be instrumented.
- */
-public interface HasBeenInstrumented
-{
-	/*
-	 * This class does not need any members.  If a given class implements
-	 * this class, it means the given class does not want to be instrumented
-	 * by Cobertura.
-	 */
+/**
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2014 Kunal Shah
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.javancss;
+
+import java.io.InputStream;
+
+/**
+ * Factory for vending instances of {@link Javancss}.
+ *
+ * @author Kunal Shah
+ */
+public class JavancssFactory {
+
+    /**
+     * Create a new instance of {@link Javancss}.
+     *
+     * @param javaSource the stream of java source
+     * @param encoding the encoding for parsing
+     * @return a new instance of {@link Javancss}
+     */
+    public Javancss newInstance(InputStream javaSource, String encoding) {
+        return new Javancss(javaSource, encoding);
+    }
+
 }
\ No newline at end of file
diff --git a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/Metric.java
similarity index 50%
copy from src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/javancss/Metric.java
index 325d99c..06b314f 100644
--- a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/Metric.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Cobertura - http://cobertura.sourceforge.net/
  *
  * This file was taken from JavaNCSS
@@ -20,11 +20,51 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  * USA
  */
-
-package net.sourceforge.cobertura.javancss.test;
-
-public class JavancssTest
-
-{
-
-}
+
+package net.sourceforge.cobertura.javancss;
+
+/**
+ * Base data class to store all metrics common to packages, objects and functions.
+ *
+ * @author  Herv� Boutemy
+ * @version $Id: Metric.java 195 2009-06-23 21:57:59Z hboutemy $
+ */
+public abstract class Metric implements Comparable {
+	public String name = ".";
+	/** Non Commenting Source Statements (NCSS). */
+	public int ncss = 0;
+	public int firstLine = 0;
+	public int javadocs = 0;
+	public int javadocsLn = 0;
+	public int singleLn = 0;
+	public int multiLn = 0;
+
+	public Metric() {
+		super();
+	}
+
+	public void clear() {
+		name = ".";
+		ncss = 0;
+		javadocs = 0;
+		javadocsLn = 0;
+		singleLn = 0;
+		multiLn = 0;
+	}
+
+	public String toString() {
+		return name;
+	}
+
+	public int compareTo(Object o) {
+		return name.compareTo(((Metric) o).name);
+	}
+
+	public boolean equals(Object o) {
+		return compareTo(o) == 0;
+	}
+
+	public int hashCode() {
+		return name.hashCode();
+	}
+}
diff --git a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ObjectMetric.java
similarity index 64%
copy from src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
copy to cobertura/src/main/java/net/sourceforge/cobertura/javancss/ObjectMetric.java
index 325d99c..79d2f38 100644
--- a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ObjectMetric.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Cobertura - http://cobertura.sourceforge.net/
  *
  * This file was taken from JavaNCSS
@@ -20,11 +20,29 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  * USA
  */
-
-package net.sourceforge.cobertura.javancss.test;
-
-public class JavancssTest
-
-{
-
-}
+
+package net.sourceforge.cobertura.javancss;
+
+/**
+ * Basic data class to store all metrics attached to an object.
+ *
+ * @author  Herv Boutemy
+ * @version $Id: ObjectMetric.java 121 2009-01-17 22:19:45Z hboutemy $
+ */
+public class ObjectMetric extends Metric {
+	/** Cyclomatic Complexity Number (McCabe metric) */
+	public int ccn = 0;
+	public int functions = 0;
+	public int classes = 0;
+
+	public ObjectMetric() {
+		super();
+	}
+
+	public void clear() {
+		super.clear();
+		ccn = 0;
+		functions = 0;
+		classes = 0;
+	}
+}
diff --git a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/PackageMetric.java
similarity index 52%
rename from src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/javancss/PackageMetric.java
index 325d99c..739e057 100644
--- a/src/net/sourceforge/cobertura/javancss/test/JavancssTest.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/PackageMetric.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Cobertura - http://cobertura.sourceforge.net/
  *
  * This file was taken from JavaNCSS
@@ -20,11 +20,40 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  * USA
  */
-
-package net.sourceforge.cobertura.javancss.test;
-
-public class JavancssTest
-
-{
-
-}
+
+package net.sourceforge.cobertura.javancss;
+
+/**
+ * Basic data class to store all metrics attached to a package.
+ *
+ * @author  Chr. Clemens Lee <clemens at kclee.com>
+ * @version $Id: PackageMetric.java 121 2009-01-17 22:19:45Z hboutemy $
+ */
+public class PackageMetric extends Metric {
+	public int classes = 0;
+	public int functions = 0;
+
+	public PackageMetric() {
+		super();
+	}
+
+	public void clear() {
+		super.clear();
+		classes = 0;
+		functions = 0;
+	}
+
+	public void add(PackageMetric pPackageMetric_) {
+		if (pPackageMetric_ == null) {
+			return;
+		}
+		classes += pPackageMetric_.classes;
+		functions += pPackageMetric_.functions;
+		ncss += pPackageMetric_.ncss;
+
+		javadocs += pPackageMetric_.javadocs;
+		javadocsLn += pPackageMetric_.javadocsLn;
+		singleLn += pPackageMetric_.singleLn;
+		multiLn += pPackageMetric_.multiLn;
+	}
+}
diff --git a/src/net/sourceforge/cobertura/javancss/ccl/Exitable.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Exitable.java
similarity index 96%
rename from src/net/sourceforge/cobertura/javancss/ccl/Exitable.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Exitable.java
index cd778d3..ab233b5 100644
--- a/src/net/sourceforge/cobertura/javancss/ccl/Exitable.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Exitable.java
@@ -1,81 +1,79 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- * 
- * Alternatively, the contents may be licensed with:
- * 
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2009 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.javancss.ccl;
-
-
-public interface Exitable
-{
-	public abstract void setExit();
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ * 
+ * Alternatively, the contents may be licensed with:
+ * 
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2009 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.javancss.ccl;
+
+public interface Exitable {
+	public abstract void setExit();
+}
diff --git a/src/net/sourceforge/cobertura/javancss/ccl/FileUtil.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/FileUtil.java
similarity index 71%
rename from src/net/sourceforge/cobertura/javancss/ccl/FileUtil.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/FileUtil.java
index bac28a3..771e951 100644
--- a/src/net/sourceforge/cobertura/javancss/ccl/FileUtil.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/FileUtil.java
@@ -1,236 +1,212 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the reusable ccl java library
- * (http://www.kclee.com/clemens/java/ccl/).
- *
- * The Initial Developer of the Original Code is
- * Chr. Clemens Lee.
- * Portions created by Chr. Clemens Lee are Copyright (C) 2002
- * Chr. Clemens Lee. All Rights Reserved.
- *
- * Contributor(s): Chr. Clemens Lee <clemens at kclee.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package net.sourceforge.cobertura.javancss.ccl;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-
-/**
- * Utility class for file operations.<p>
- *
- * Simple but most commonly used methods of this class are:<br>
- * - {@link #readFile(java.lang.String) readFile}<br>
- * - {@link #concatPath(java.lang.String, java.lang.String) concatPath}<br>
- *
- * Other less frequently used but still handy methods are:<br>
- * - {@link #normalizeFileName(java.lang.String) normalizeFileName} to take the current user directory into account via the 'user.dir' system property<br>
- *
- * @version  $Id: FileUtil.java 384 2006-03-17 20:10:49Z thekingant $
- * @author <a href="http://www.kclee.com/clemens/">
- *         Chr. Clemens Lee</a>
- *         <<a href="mailto:clemens at kclee.com">
- *         clemens at kclee.com
- *         </a>>
- */
-/*
- * cobertura - this file was moved from net.sourceforge.cobertura.javancss package.
- * Mark Doliner apparently got the source from somewhere, but it is not available now.
- */
-public class FileUtil
-{
-
-	/**
-	 * Utility class which should never instanciate itself.
-	 */
-	private FileUtil()
-	{
-		super();
-	}
-
-	/**
-	 * Concatenates a file path with the file name. If 
-	 * necessary it adds a File.separator between the path
-	 * and file name. For example "/home" or "/home/" and "clemens" both
-	 * become "/home/clemens".<p>
-	 *
-	 * This method is inspired from the FrIJDE project out
-	 * of the gCollins.File.FileTools class.<p>
-	 *
-	 * FrIJDE Homepage:
-	 * http://amber.wpi.edu/~thethe/Document/Besiex/Java/FrIJDE/
-	 *
-	 * @param    sPath_   a directory path. Is not allowed to be null.
-	 * @param    sFile_   the base name of a file.
-	 *
-	 * @return            sPath_ if sFile_ is empty.
-	 */
-	public static String concatPath(String sPath_, String sFile_)
-	{
-		Util.panicIf(sPath_ == null);
-		//System.out.println("ccl.util.FileUtil.concatPath(..).sPath_: --->" + sPath_ + "<---");
-		//System.out.println("ccl.util.FileUtil.concatPath(..).sFile_: " + sFile_);
-
-		String sRetVal = sPath_;
-
-		if (!Util.isEmpty(sFile_))
-		{
-			if (sPath_.length() > 0 && !sPath_.endsWith(File.separator))
-			{
-				sRetVal += File.separator;
-			}
-
-			sRetVal += sFile_;
-		}
-
-		return sRetVal;
-	}
-
-	/**
-	 * Reads a File and returns the content in a String.
-	 * CRLF -> LF conversion takes place. This is a convenience method so you don't
-	 * need to bother creating a file reader object and closing it after it has
-	 * been used.
-	 *
-	 * @param    sFileName_   the name of the file to read.
-	 *
-	 * @return                a string with the content of the file but without 
-	 *                        any CR characters.
-	 *
-	 * @throws   FileNotFoundException   if file does not exist.
-	 * @throws   IOException             if any file operation fails.
-	 */
-	public static String readFile(String sFileName_) throws IOException, FileNotFoundException
-	{
-		StringBuffer sFileContent = new StringBuffer(100000);
-
-		try
-		{
-			FileReader frIni = new FileReader(sFileName_);
-			if (frIni != null)
-			{
-				BufferedReader brIni = new BufferedReader(frIni);
-				if (brIni != null)
-				{
-					while (brIni.ready())
-					{
-						String sLine = brIni.readLine();
-						if (sLine == null)
-						{
-							break;
-						}
-						sFileContent.append(sLine).append('\n');
-					}
-					brIni.close();
-				}
-				frIni.close();
-			}
-		}
-		catch (FileNotFoundException fileNotFoundException)
-		{
-			throw new FileNotFoundException("No such file: '" + sFileName_ + "'");
-		}
-
-		return sFileContent.toString();
-	}
-
-	/**
-	 * @return It's the canonical path of sFileName_.
-	 */
-	public static String getAbsoluteFileName(String sFileName_)
-	{
-		String sRetVal = null;
-
-		try
-		{
-			File pFile = new File(sFileName_);
-			sRetVal = pFile.getCanonicalPath();
-		}
-		catch (Exception e)
-		{
-			return null;
-		}
-
-		return sRetVal;
-	}
-
-	/**
-	 * This method returns an absolute (canonical)
-	 * file name. The difference to getAbsoluteFileName
-	 * is that this method uses the system property
-	 * "user.dir" instead of the native system's current 
-	 * directory. This way you get a chance of changing
-	 * the current directory inside Java and let your 
-	 * program reflect that change.
-	 */
-	public static String normalizeFileName(String sFile)
-	{
-		return normalizeFileName(sFile, (String)System.getProperties().get("user.dir"));
-	}
-
-	/**
-	 * This method returns an absolute (canonical)
-	 * file name. The difference to getAbsoluteFileName
-	 * is that this method uses the system property
-	 * sUserDir instead of the native system's current 
-	 * directory. This way you get a chance of changing
-	 * the current directory inside Java and let your 
-	 * program reflect that change.
-	 */
-	private static String normalizeFileName(String sFile, String sUserDir)
-	{
-		sFile = sFile.trim();
-		if (Util.isEmpty(sFile) || sFile.equals("."))
-		{
-			sFile = sUserDir;
-		}
-		else if (!FileUtil.isAbsolute(sFile))
-		{
-			sFile = FileUtil.concatPath(sUserDir, sFile);
-		}
-		sFile = FileUtil.getAbsoluteFileName(sFile);
-
-		return sFile;
-	}
-
-	/**
-	 * Tests if the file represented by this File object is an absolute 
-	 * pathname. The definition of an absolute pathname is system
-	 * dependent. For example, on UNIX, a pathname is absolute if its first
-	 * character is the separator character. On Windows
-	 * platforms, a pathname is absolute if its first character is an 
-	 * ASCII '\' or '/', or if it begins with a letter followed by a colon. 
-	 */
-	private static boolean isAbsolute(String sFileName_)
-	{
-		return new File(sFileName_).isAbsolute();
-	}
-
-}
+/**
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the reusable ccl java library
+ * (http://www.kclee.com/clemens/java/ccl/).
+ *
+ * The Initial Developer of the Original Code is
+ * Chr. Clemens Lee.
+ * Portions created by Chr. Clemens Lee are Copyright (C) 2002
+ * Chr. Clemens Lee. All Rights Reserved.
+ *
+ * Contributor(s): Chr. Clemens Lee <clemens at kclee.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ **/
+
+package net.sourceforge.cobertura.javancss.ccl;
+
+import java.io.*;
+
+/**
+ * Utility class for file operations.<p>
+ * <p/>
+ * Simple but most commonly used methods of this class are:<br>
+ * - {@link #readFile(java.lang.String) readFile}<br>
+ * - {@link #concatPath(java.lang.String, java.lang.String) concatPath}<br>
+ * <p/>
+ * Other less frequently used but still handy methods are:<br>
+ * - {@link #normalizeFileName(java.lang.String) normalizeFileName} to take the current user directory into account via the 'user.dir' system property<br>
+ *
+ * @author <a href="http://www.kclee.com/clemens/">
+ *         Chr. Clemens Lee</a>
+ *         <<a href="mailto:clemens at kclee.com">
+ *         clemens at kclee.com
+ *         </a>>
+ * @version $Id: FileUtil.java 384 2006-03-17 20:10:49Z thekingant $
+ */
+/*
+ * cobertura - this file was moved from net.sourceforge.cobertura.javancss package.
+ * Mark Doliner apparently got the source from somewhere, but it is not available now.
+ */
+public class FileUtil {
+
+	/**
+	 * Utility class which should never instanciate itself.
+	 */
+	private FileUtil() {
+		super();
+	}
+
+	/**
+	 * Concatenates a file path with the file name. If
+	 * necessary it adds a File.separator between the path
+	 * and file name. For example "/home" or "/home/" and "clemens" both
+	 * become "/home/clemens".<p>
+	 * <p/>
+	 * This method is inspired from the FrIJDE project out
+	 * of the gCollins.File.FileTools class.<p>
+	 * <p/>
+	 * FrIJDE Homepage:
+	 * http://amber.wpi.edu/~thethe/Document/Besiex/Java/FrIJDE/
+	 *
+	 * @param sPath_ a directory path. Is not allowed to be null.
+	 * @param sFile_ the base name of a file.
+	 *
+	 * @return sPath_ if sFile_ is empty.
+	 */
+	public static String concatPath(String sPath_, String sFile_) {
+		Util.panicIf(sPath_ == null);
+		//System.out.println("ccl.util.FileUtil.concatPath(..).sPath_: --->" + sPath_ + "<---");
+		//System.out.println("ccl.util.FileUtil.concatPath(..).sFile_: " + sFile_);
+
+		String sRetVal = sPath_;
+
+		if (!Util.isEmpty(sFile_)) {
+			if (sPath_.length() > 0 && !sPath_.endsWith(File.separator)) {
+				sRetVal += File.separator;
+			}
+
+			sRetVal += sFile_;
+		}
+
+		return sRetVal;
+	}
+
+	/**
+	 * Reads a File and returns the content in a String.
+	 * CRLF -> LF conversion takes place. This is a convenience method so you don't
+	 * need to bother creating a file reader object and closing it after it has
+	 * been used.
+	 *
+	 * @param sFileName_ the name of the file to read.
+	 *
+	 * @return a string with the content of the file but without
+	 *         any CR characters.
+	 *
+	 * @throws FileNotFoundException if file does not exist.
+	 * @throws IOException           if any file operation fails.
+	 */
+	public static String readFile(String sFileName_) throws IOException,
+			FileNotFoundException {
+		StringBuffer sFileContent = new StringBuffer(100000);
+
+		try {
+			FileReader frIni = new FileReader(sFileName_);
+			if (frIni != null) {
+				BufferedReader brIni = new BufferedReader(frIni);
+				if (brIni != null) {
+					while (brIni.ready()) {
+						String sLine = brIni.readLine();
+						if (sLine == null) {
+							break;
+						}
+						sFileContent.append(sLine).append('\n');
+					}
+					brIni.close();
+				}
+				frIni.close();
+			}
+		} catch (FileNotFoundException fileNotFoundException) {
+			throw new FileNotFoundException("No such file: '" + sFileName_
+					+ "'");
+		}
+
+		return sFileContent.toString();
+	}
+
+	/**
+	 * @return It's the canonical path of sFileName_.
+	 */
+	public static String getAbsoluteFileName(String sFileName_) {
+		String sRetVal = null;
+
+		try {
+			File pFile = new File(sFileName_);
+			sRetVal = pFile.getCanonicalPath();
+		} catch (Exception e) {
+			return null;
+		}
+
+		return sRetVal;
+	}
+
+	/**
+	 * This method returns an absolute (canonical)
+	 * file name. The difference to getAbsoluteFileName
+	 * is that this method uses the system property
+	 * "user.dir" instead of the native system's current
+	 * directory. This way you get a chance of changing
+	 * the current directory inside Java and let your
+	 * program reflect that change.
+	 */
+	public static String normalizeFileName(String sFile) {
+		return normalizeFileName(sFile, (String) System.getProperties().get(
+				"user.dir"));
+	}
+
+	/**
+	 * This method returns an absolute (canonical)
+	 * file name. The difference to getAbsoluteFileName
+	 * is that this method uses the system property
+	 * sUserDir instead of the native system's current
+	 * directory. This way you get a chance of changing
+	 * the current directory inside Java and let your
+	 * program reflect that change.
+	 */
+	private static String normalizeFileName(String sFile, String sUserDir) {
+		sFile = sFile.trim();
+		if (Util.isEmpty(sFile) || sFile.equals(".")) {
+			sFile = sUserDir;
+		} else if (!FileUtil.isAbsolute(sFile)) {
+			sFile = FileUtil.concatPath(sUserDir, sFile);
+		}
+		sFile = FileUtil.getAbsoluteFileName(sFile);
+
+		return sFile;
+	}
+
+	/**
+	 * Tests if the file represented by this File object is an absolute
+	 * pathname. The definition of an absolute pathname is system
+	 * dependent. For example, on UNIX, a pathname is absolute if its first
+	 * character is the separator character. On Windows
+	 * platforms, a pathname is absolute if its first character is an
+	 * ASCII '\' or '/', or if it begins with a letter followed by a colon.
+	 */
+	private static boolean isAbsolute(String sFileName_) {
+		return new File(sFileName_).isAbsolute();
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/javancss/ccl/Init.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Init.java
similarity index 89%
rename from src/net/sourceforge/cobertura/javancss/ccl/Init.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Init.java
index 9850be8..525b910 100644
--- a/src/net/sourceforge/cobertura/javancss/ccl/Init.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Init.java
@@ -1,53 +1,49 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the reusable ccl java library
- * (http://www.kclee.com/clemens/java/ccl/).
- *
- * The Initial Developer of the Original Code is
- * Chr. Clemens Lee.
- * Portions created by Chr. Clemens Lee are Copyright (C) 2002
- * Chr. Clemens Lee. All Rights Reserved.
- *
- * Contributor(s): Chr. Clemens Lee <clemens at kclee.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package net.sourceforge.cobertura.javancss.ccl;
-
-import java.util.Hashtable;
-
-//cobertura - most of this class was removed - unused for the most part.
-public class Init
-{
-
-    public Hashtable getOptions()
-    {
-        return null;
-    }
-
-
-
-}
+/**
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the reusable ccl java library
+ * (http://www.kclee.com/clemens/java/ccl/).
+ *
+ * The Initial Developer of the Original Code is
+ * Chr. Clemens Lee.
+ * Portions created by Chr. Clemens Lee are Copyright (C) 2002
+ * Chr. Clemens Lee. All Rights Reserved.
+ *
+ * Contributor(s): Chr. Clemens Lee <clemens at kclee.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ **/
+
+package net.sourceforge.cobertura.javancss.ccl;
+
+import java.util.Hashtable;
+
+//cobertura - most of this class was removed - unused for the most part.
+public class Init {
+
+	public Hashtable getOptions() {
+		return null;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/javancss/ccl/Util.java b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Util.java
similarity index 69%
rename from src/net/sourceforge/cobertura/javancss/ccl/Util.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Util.java
index a529b41..7225288 100644
--- a/src/net/sourceforge/cobertura/javancss/ccl/Util.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/javancss/ccl/Util.java
@@ -1,297 +1,262 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the reusable ccl java library
- * (http://www.kclee.com/clemens/java/ccl/).
- *
- * The Initial Developer of the Original Code is
- * Chr. Clemens Lee.
- * Portions created by Chr. Clemens Lee are Copyright (C) 2002
- * Chr. Clemens Lee. All Rights Reserved.
- *
- * Contributor(s): Chr. Clemens Lee <clemens at kclee.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package net.sourceforge.cobertura.javancss.ccl;
-
-import java.util.Vector;
-
-/**
- * A general purpose class with a variety of support and convenience methods.
- *
- * <p> There are different groups of methods in this class:
- * <br>
- * <br><a href="#print(char)">print methods</a> - convenience methods for System.out.print etc. that additionally make sure output is gets flushed immediately.
- * <br><a href="#isEmpty(java.lang.String)">string methods</a>
- * <br><a href="#concat(java.util.Vector)">string/vector converter methods</a>
- * <br><a href="#getConstantObject()">miscellaneous methods</a>
- * <p>
- *
- * Some basic but none the less the most used methods by myself are:<br>
- * - {@link #isEmpty(java.lang.String) isEmpty}<br>
- * - {@link #stringToLines(java.lang.String) stringToLines}<br>
- * - {@link #sleep(int) sleep}<br>
- * <p>
- *
- * @author <a href="http://www.kclee.com/clemens/">
- *         Chr. Clemens Lee</a>
- *         <<a href="mailto:clemens at kclee.com">
- *         clemens at kclee.com
- *         </a>>
- */
-
-
-
-/*
- * cobertura - this file was moved from net.sourceforge.cobertura.javancss package.
- * 
- * Mark Doliner apparently got the source from somewhere, but it is not available now.
- */
-
-public class Util
-{
-
-	public static final Object CONSTANT_OBJECT = new Object();
-
-	/**
-	 * This is an utility class, there is (should be) no need
-	 * for an instance of this class.
-	 */
-	private Util()
-	{
-		super();
-	}
-	
-	// -----------------------------------------------------
-	// debug methods and assertion stuff
-	// -----------------------------------------------------
-/**
-	 * panicIf <=> not assert. Throws ApplicationException if true.
-	 * It's not necessary to catch this exception.
-	 */
-	public static void panicIf(boolean bPanic_)
-	{
-		if (bPanic_)
-		{
-			throw (new RuntimeException());
-		}
-	}
-
-	/**
-	 * panicIf <=> not assert. Throws ApplicationException if true.
-	 * It's not necessary to catch this exception.
-	 *
-	 * @param sMessage_ The error message for the Exception.
-	 */
-	public static void panicIf(boolean bPanic_, String sMessage_)
-	{
-		if (bPanic_)
-		{
-			throw (new RuntimeException(sMessage_));
-		}
-	}
-
-	/**
-	 * Tests, if a given String equals null or "".
-	 */
-	public static boolean isEmpty(String sTest_)
-	{
-		if (sTest_ == null || sTest_.equals(""))
-		{
-			return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * This function takes a String and separates it into different
-	 * lines. The last line does not need to have a separator character.
-	 *
-	 * @param lines_   The number of lines that should be extracted.
-	 *                 Zero if maximum number of lines is requested.
-	 * @param cCutter_ The character that separates pString_ into
-	 *                 different lines
-	 *
-	 * @return         The single lines do not contain the cCutter_
-	 *                 character at the end.
-	 */
-	private static Vector stringToLines(int lines_, String pString_, char cCutter_)
-	{
-		int maxLines = Integer.MAX_VALUE;
-		if (lines_ > 0)
-		{
-			maxLines = lines_;
-		}
-
-		Vector vRetVal = new Vector();
-		if (pString_ == null)
-		{
-			return vRetVal;
-		}
-
-		int startIndex = 0;
-		for (; maxLines > 0; maxLines--)
-		{
-			int endIndex = pString_.indexOf(cCutter_, startIndex);
-			if (endIndex == -1)
-			{
-				if (startIndex < pString_.length())
-				{
-					endIndex = pString_.length();
-				}
-				else
-				{
-					break;
-				}
-			}
-			String sLine = pString_.substring(startIndex, endIndex);
-			vRetVal.addElement(sLine);
-			startIndex = endIndex + 1;
-		}
-
-		return vRetVal;
-	}
-
-	/**
-	 * This function takes a String and separates it into different
-	 * lines. The last line does not need to have a separator character.
-	 *
-	 * @param cCutter_ The character that separates pString_ into
-	 *                 different lines
-	 *
-	 * @return The single lines do not contain the cCutter_ character
-	 *         at the end.
-	 */
-	public static Vector stringToLines(String pString_, char cCutter_)
-	{
-		return stringToLines(0, pString_, cCutter_);
-	}
-
-	/**
-	 * This function takes a String and separates it into different
-	 * lines. The last line does not need to have a '\n'. The function
-	 * can't handle dos carriage returns.
-	 *
-	 * @return The single lines do not contain the '\n' character
-	 *         at the end.
-	 */
-	public static Vector stringToLines(String pString_)
-	{
-		return stringToLines(pString_, '\n');
-	}
-
-	/**
-	 * Current thread sleeps in seconds.
-	 */
-	private static void sleep(int seconds_)
-	{
-		try
-		{
-			Thread.sleep(seconds_ * 1000);
-		}
-		catch (Exception pException)
-		{
-		}
-	}
-	
-	public static Vector concat(Vector vFirst_, Vector vSecond_)
-	{
-		//cobertura Mark Doliner appears to have simplified this.
-		vFirst_.addAll(vSecond_);
-		return vFirst_;
-	}
-
-
-	public static Vector<Object> sort(Vector<Object> input)
-	{
-		//cobertura - apparently Mark Doliner didn't think we need to sort.
-		return input;
-	}
-	
-	// cobertura - gotten from decompile of ccl.jar.
-    public static void debug(Object oMessage_)
-    {
-        if(_bDebug)
-            printlnErr(oMessage_.toString());
-    }
-
-	
-	public static Object getConstantObject()
-	{
-		return CONSTANT_OBJECT;
-	}
-	
-	// cobertura - gotten from decompile of ccl.jar.
-    public static void setDebug(boolean bDebug_)
-    {
-        _bDebug = bDebug_;
-    }
-
-    // cobertura = gotten from decompile of ccl.jar.
-    public static boolean isDebug()
-    {
-        return _bDebug;
-    }
-    
-    // cobertura = gotten from decompile of ccl.jar.
-    public static void println(String pString_)
-    {
-        System.out.println(pString_);
-        System.out.flush();
-    }
-
-    // cobertura = gotten from decompile of ccl.jar.
-    public static void printErr(char c_)
-    {
-        System.err.print(c_);
-        System.err.flush();
-    }
-
-    // cobertura = gotten from decompile of ccl.jar.
-    public static void printErr(String pString_)
-    {
-        System.err.print(pString_);
-        System.err.flush();
-    }
-
-    // cobertura = gotten from decompile of ccl.jar.
-    public static void printlnErr()
-    {
-        printErr('\n');
-    }
-
-    // cobertura = gotten from decompile of ccl.jar.
-    public static void printlnErr(String sMessage_)
-    {
-        printErr(sMessage_);
-        printlnErr();
-    }
-
-    // cobertura = gotten from decompile of ccl.jar.
-    private static boolean _bDebug = false;
-
-}
\ No newline at end of file
+/**
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the reusable ccl java library
+ * (http://www.kclee.com/clemens/java/ccl/).
+ *
+ * The Initial Developer of the Original Code is
+ * Chr. Clemens Lee.
+ * Portions created by Chr. Clemens Lee are Copyright (C) 2002
+ * Chr. Clemens Lee. All Rights Reserved.
+ *
+ * Contributor(s): Chr. Clemens Lee <clemens at kclee.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ **/
+
+package net.sourceforge.cobertura.javancss.ccl;
+
+import java.util.Vector;
+
+/**
+ * A general purpose class with a variety of support and convenience methods.
+ * <p/>
+ * <p> There are different groups of methods in this class:
+ * <br>
+ * <br><a href="#print(char)">print methods</a> - convenience methods for System.out.print etc. that additionally make sure output is gets flushed immediately.
+ * <br><a href="#isEmpty(java.lang.String)">string methods</a>
+ * <br><a href="#concat(java.util.Vector)">string/vector converter methods</a>
+ * <br><a href="#getConstantObject()">miscellaneous methods</a>
+ * <p/>
+ * <p/>
+ * Some basic but none the less the most used methods by myself are:<br>
+ * - {@link #isEmpty(java.lang.String) isEmpty}<br>
+ * - {@link #stringToLines(java.lang.String) stringToLines}<br>
+ * - {@link #sleep(int) sleep}<br>
+ * <p/>
+ *
+ * @author <a href="http://www.kclee.com/clemens/">
+ *         Chr. Clemens Lee</a>
+ *         <<a href="mailto:clemens at kclee.com">
+ *         clemens at kclee.com
+ *         </a>>
+ */
+
+/*
+ * cobertura - this file was moved from net.sourceforge.cobertura.javancss package.
+ * 
+ * Mark Doliner apparently got the source from somewhere, but it is not available now.
+ */
+
+public class Util {
+
+	public static final Object CONSTANT_OBJECT = new Object();
+
+	/**
+	 * This is an utility class, there is (should be) no need
+	 * for an instance of this class.
+	 */
+	private Util() {
+		super();
+	}
+
+	// -----------------------------------------------------
+	// debug methods and assertion stuff
+	// -----------------------------------------------------
+
+	/**
+	 * panicIf <=> not assert. Throws ApplicationException if true.
+	 * It's not necessary to catch this exception.
+	 */
+	public static void panicIf(boolean bPanic_) {
+		if (bPanic_) {
+			throw (new RuntimeException());
+		}
+	}
+
+	/**
+	 * panicIf <=> not assert. Throws ApplicationException if true.
+	 * It's not necessary to catch this exception.
+	 *
+	 * @param sMessage_ The error message for the Exception.
+	 */
+	public static void panicIf(boolean bPanic_, String sMessage_) {
+		if (bPanic_) {
+			throw (new RuntimeException(sMessage_));
+		}
+	}
+
+	/**
+	 * Tests, if a given String equals null or "".
+	 */
+	public static boolean isEmpty(String sTest_) {
+		if (sTest_ == null || sTest_.equals("")) {
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * This function takes a String and separates it into different
+	 * lines. The last line does not need to have a separator character.
+	 *
+	 * @param lines_   The number of lines that should be extracted.
+	 *                 Zero if maximum number of lines is requested.
+	 * @param cCutter_ The character that separates pString_ into
+	 *                 different lines
+	 *
+	 * @return The single lines do not contain the cCutter_
+	 *         character at the end.
+	 */
+	private static Vector stringToLines(int lines_, String pString_,
+			char cCutter_) {
+		int maxLines = Integer.MAX_VALUE;
+		if (lines_ > 0) {
+			maxLines = lines_;
+		}
+
+		Vector vRetVal = new Vector();
+		if (pString_ == null) {
+			return vRetVal;
+		}
+
+		int startIndex = 0;
+		for (; maxLines > 0; maxLines--) {
+			int endIndex = pString_.indexOf(cCutter_, startIndex);
+			if (endIndex == -1) {
+				if (startIndex < pString_.length()) {
+					endIndex = pString_.length();
+				} else {
+					break;
+				}
+			}
+			String sLine = pString_.substring(startIndex, endIndex);
+			vRetVal.addElement(sLine);
+			startIndex = endIndex + 1;
+		}
+
+		return vRetVal;
+	}
+
+	/**
+	 * This function takes a String and separates it into different
+	 * lines. The last line does not need to have a separator character.
+	 *
+	 * @param cCutter_ The character that separates pString_ into
+	 *                 different lines
+	 *
+	 * @return The single lines do not contain the cCutter_ character
+	 *         at the end.
+	 */
+	public static Vector stringToLines(String pString_, char cCutter_) {
+		return stringToLines(0, pString_, cCutter_);
+	}
+
+	/**
+	 * This function takes a String and separates it into different
+	 * lines. The last line does not need to have a '\n'. The function
+	 * can't handle dos carriage returns.
+	 *
+	 * @return The single lines do not contain the '\n' character
+	 *         at the end.
+	 */
+	public static Vector stringToLines(String pString_) {
+		return stringToLines(pString_, '\n');
+	}
+
+	/**
+	 * Current thread sleeps in seconds.
+	 */
+	private static void sleep(int seconds_) {
+		try {
+			Thread.sleep(seconds_ * 1000);
+		} catch (Exception pException) {
+		}
+	}
+
+	public static Vector concat(Vector vFirst_, Vector vSecond_) {
+		//cobertura Mark Doliner appears to have simplified this.
+		vFirst_.addAll(vSecond_);
+		return vFirst_;
+	}
+
+	public static Vector<Object> sort(Vector<Object> input) {
+		//cobertura - apparently Mark Doliner didn't think we need to sort.
+		return input;
+	}
+
+	// cobertura - gotten from decompile of ccl.jar.
+	public static void debug(Object oMessage_) {
+		if (_bDebug)
+			printlnErr(oMessage_.toString());
+	}
+
+	public static Object getConstantObject() {
+		return CONSTANT_OBJECT;
+	}
+
+	// cobertura - gotten from decompile of ccl.jar.
+	public static void setDebug(boolean bDebug_) {
+		_bDebug = bDebug_;
+	}
+
+	// cobertura = gotten from decompile of ccl.jar.
+	public static boolean isDebug() {
+		return _bDebug;
+	}
+
+	// cobertura = gotten from decompile of ccl.jar.
+	public static void println(String pString_) {
+		System.out.println(pString_);
+		System.out.flush();
+	}
+
+	// cobertura = gotten from decompile of ccl.jar.
+	public static void printErr(char c_) {
+		System.err.print(c_);
+		System.err.flush();
+	}
+
+	// cobertura = gotten from decompile of ccl.jar.
+	public static void printErr(String pString_) {
+		System.err.print(pString_);
+		System.err.flush();
+	}
+
+	// cobertura = gotten from decompile of ccl.jar.
+	public static void printlnErr() {
+		printErr('\n');
+	}
+
+	// cobertura = gotten from decompile of ccl.jar.
+	public static void printlnErr(String sMessage_) {
+		printErr(sMessage_);
+		printlnErr();
+	}
+
+	// cobertura = gotten from decompile of ccl.jar.
+	private static boolean _bDebug = false;
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/merge/Main.java b/cobertura/src/main/java/net/sourceforge/cobertura/merge/Main.java
new file mode 100644
index 0000000..79ad1e2
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/merge/Main.java
@@ -0,0 +1,49 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Joakim Erdfelt
+ * Copyright (C) 2005 Mark Sinke
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.merge;
+
+/**
+ * Deprecated wrapper class for the new CheckCoverageMain class.  It is only
+ * here to facilitate an orderly transition to the new class and will go
+ * away in a few releases
+ *
+ * @author Steven C. Saliman
+ */
+ at Deprecated
+public class Main {
+
+	public Main(String[] args) {
+		System.err.println("net.sourceforge.cobertura.merge.Main is a deprecated class.");
+		System.err.println("Please use net.sourceforge.cobertura.merge.MergeMain instead");
+		new MergeMain(args);
+	}
+
+	public static void main(String[] args) {
+		System.err.println("net.sourceforge.cobertura.merge.Main is a deprecated class.");
+		System.err.println("Please use net.sourceforge.cobertura.merge.MergeMain instead");
+		MergeMain.main(args);
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/merge/MergeMain.java b/cobertura/src/main/java/net/sourceforge/cobertura/merge/MergeMain.java
new file mode 100644
index 0000000..4c2754b
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/merge/MergeMain.java
@@ -0,0 +1,83 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Joakim Erdfelt
+ * Copyright (C) 2005 Mark Sinke
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.merge;
+
+import net.sourceforge.cobertura.dsl.ArgumentsBuilder;
+import net.sourceforge.cobertura.dsl.Cobertura;
+import net.sourceforge.cobertura.util.CommandLineBuilder;
+import net.sourceforge.cobertura.util.Header;
+
+import java.io.File;
+
+public class MergeMain {
+
+	public MergeMain(String[] args) {
+		ArgumentsBuilder builder = new ArgumentsBuilder();
+
+		String baseDir = null;
+
+		// Go through all the parameters
+		for (int i = 0; i < args.length; i++) {
+			if (args[i].equals("--datafile")) {
+				builder.setDataFile(args[++i]);
+			} else if (args[i].equals("--basedir")) {
+				baseDir = args[++i];
+				builder.setBaseDirectory(baseDir);
+			} else {
+				if (baseDir != null) {
+					builder.addFileToMerge(new File(baseDir, args[i])
+							.getAbsolutePath());
+				} else {
+					builder.addFileToMerge(new File(args[i]).getAbsolutePath());
+				}
+			}
+		}
+
+		new Cobertura(builder.build()).merge().saveProjectData();
+	}
+
+	public static int merge(String[] args) {
+		Header.print(System.out);
+
+		try {
+			args = CommandLineBuilder.preprocessCommandLineArguments(args);
+		} catch (Exception ex) {
+			System.err.println("Error: Cannot process arguments: "
+					+ ex.getMessage());
+			return 1;
+		}
+		new MergeMain(args);
+		return 0;
+	}
+
+	public static void main(String[] args) {
+		int returnValue = merge(args);
+		if ( returnValue != 0 ) {
+			System.exit(returnValue);
+		}
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/merge/MergeProjectDataFilesTask.java b/cobertura/src/main/java/net/sourceforge/cobertura/merge/MergeProjectDataFilesTask.java
new file mode 100644
index 0000000..34f7430
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/merge/MergeProjectDataFilesTask.java
@@ -0,0 +1,33 @@
+package net.sourceforge.cobertura.merge;
+
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.dsl.Arguments;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.util.Set;
+
+public class MergeProjectDataFilesTask {
+	private static final Logger logger = LoggerFactory
+			.getLogger(MergeProjectDataFilesTask.class);
+
+	public void mergeProjectDataFiles(Arguments arguments,
+			ProjectData projectData) {
+		Set<File> filesToMerge = arguments.getFilesToMerge();
+
+		if (filesToMerge.isEmpty()) {
+			logger.error("No files were specified for merging.");
+		}
+
+		// Merge everything
+		for (File newDataFile : filesToMerge) {
+			ProjectData projectDataNew = CoverageDataFileHandler
+					.loadCoverageData(newDataFile);
+
+			if (projectDataNew != null)
+				projectData.merge(projectDataNew);
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ComplexityCalculator.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ComplexityCalculator.java
new file mode 100644
index 0000000..6a86533
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ComplexityCalculator.java
@@ -0,0 +1,552 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2008 Tri Bao Ho
+ * Copyright (C) 2009 John Lewis
+ * Copyright (C) 2014 Kunal Shah
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.coveragedata.ClassData;
+import net.sourceforge.cobertura.coveragedata.PackageData;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.coveragedata.SourceFileData;
+import net.sourceforge.cobertura.javancss.FunctionMetric;
+import net.sourceforge.cobertura.javancss.Javancss;
+import net.sourceforge.cobertura.javancss.JavancssFactory;
+
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.util.Source;
+
+import org.apache.commons.lang3.ClassUtils;
+import org.apache.commons.lang3.Validate;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.signature.SignatureReader;
+import org.objectweb.asm.util.TraceSignatureVisitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
+
+/**
+ * Allows complexity computing for source files, packages and a whole project. Average
+ * McCabe's number for methods contained in the specified entity is returned. This class
+ * depends on FileFinder which is used to map source file names to existing files.
+ * <p/>
+ * <p>One instance of this class should be used for the same set of source files - an
+ * object of this class can cache computed results.</p>
+ *
+ * @author Grzegorz Lukasik
+ */
+public class ComplexityCalculator {
+	private static final Logger logger = LoggerFactory
+			.getLogger(ComplexityCalculator.class);
+
+	public static final Complexity ZERO_COMPLEXITY = new Complexity();
+
+	// Finder used to map source file names to existing files
+	private final FileFinder finder;
+
+	// Factory use to get instances of {@code Javancss}
+	private final JavancssFactory javancssFactory;
+
+	// Contains pairs (String sourceFileName, Complexity complexity)
+	private Map sourceFileCNNCache = new HashMap();
+
+	// Contains pairs (String packageName, Complexity complexity)
+	private Map packageCNNCache = new HashMap();
+
+	// Cache for source file name to its function metrics parsed by {@link Javancss}
+	private static final int FILE_FUNCTION_METRIC_CACHE_SIZE = 6;
+	private Map<String, List<FunctionMetric>> sourceFileFunctionMetricCache = new LinkedHashMap<String, List<FunctionMetric>>(
+		FILE_FUNCTION_METRIC_CACHE_SIZE, 0.75f, true) {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected boolean removeEldestEntry(Entry<String, List<FunctionMetric>> arg0) {
+			return size() > FILE_FUNCTION_METRIC_CACHE_SIZE;
+		}
+	};
+
+	private boolean calculateMethodComplexity;
+
+	private String encoding;
+
+	/**
+	 * Creates new calculator. Passed {@link FileFinder} will be used to
+	 * map source file names to existing files when needed.
+	 *
+	 * @param finder {@link FileFinder} that allows to find source files
+	 *
+	 * @throws NullPointerException if finder is null
+	 */
+	public ComplexityCalculator(FileFinder finder) {
+		this(finder, new JavancssFactory());
+	}
+
+	/**
+	 * Creates new calculator. Passed {@link FileFinder} will be used to
+	 * map source file names to existing files when needed.
+	 *
+	 * @param finder          {@link FileFinder} that allows to find source files
+	 * @param javancssFactory factory to get instances of {@link Javancss}
+	 * @throws NullPointerException if finder or javancssFactory is null
+	 */
+	public ComplexityCalculator(FileFinder finder, JavancssFactory javancssFactory) {
+		this.finder = Validate.notNull(finder, "finder should not be null");
+		this.javancssFactory = Validate.notNull(javancssFactory, "javancssFactory should not be null");
+	}
+
+	/**
+	 * Calculates the code complexity number for single source file.
+	 * "CCN" stands for "code complexity number."  This is
+	 * sometimes referred to as McCabe's number.  This method
+	 * calculates the average cyclomatic code complexity of all
+	 * methods of all classes in a given directory.
+	 *
+	 * @param sourceFileName the name of the source file for which you want to calculate the complexity
+	 * @return average complexity for the specified source file
+	 * @throws IOException
+	 */
+	private Complexity getAccumlatedCCNForSingleFile(String sourceFileName)
+		throws IOException {
+		List methodMetrics = getFunctionMetricsForSingleFile(sourceFileName);
+		if (methodMetrics.isEmpty()) {
+			return ZERO_COMPLEXITY;
+		}
+
+		int classCcn = 0;
+		for (Iterator method = methodMetrics.iterator(); method.hasNext(); ) {
+			FunctionMetric singleMethodMetrics = (FunctionMetric) method.next();
+			classCcn += singleMethodMetrics.ccn;
+		}
+
+		return new Complexity(classCcn, methodMetrics.size());
+	}
+
+	/**
+	 * Computes CCN for all sources contained in the project.
+	 * CCN for whole project is an average CCN for source files.
+	 * All source files for which CCN cannot be computed are ignored.
+	 *
+	 * @param projectData project to compute CCN for
+	 *
+	 * @return CCN for project or 0 if no source files were found
+	 *
+	 * @throws NullPointerException if projectData is null
+	 */
+	public double getCCNForProject(ProjectData projectData) {
+		// Sum complexity for all packages
+		Complexity act = new Complexity();
+
+		for (Object pkg : projectData.getPackages()) {
+			PackageData packageData = (PackageData) pkg;
+			act.add(getCCNForPackageInternal(packageData));
+		}
+
+		// Return average CCN for source files
+		return act.averageCCN();
+	}
+
+	/**
+	 * Computes CCN for all sources contained in the specified package.
+	 * All source files that cannot be mapped to existing files are ignored.
+	 *
+	 * @param packageData package to compute CCN for
+	 *
+	 * @return CCN for the specified package or 0 if no source files were found
+	 *
+	 * @throws NullPointerException if <code>packageData</code> is <code>null</code>
+	 */
+	public double getCCNForPackage(PackageData packageData) {
+		return getCCNForPackageInternal(packageData).averageCCN();
+	}
+
+	private Complexity getCCNForPackageInternal(PackageData packageData) {
+		// Return CCN if computed earlier
+		Complexity cachedCCN = (Complexity) packageCNNCache.get(packageData
+				.getName());
+		if (cachedCCN != null) {
+			return cachedCCN;
+		}
+
+		// Compute CCN for all source files inside package
+		Complexity act = new Complexity();
+		for (Iterator it = packageData.getSourceFiles().iterator(); it
+				.hasNext();) {
+			SourceFileData sourceData = (SourceFileData) it.next();
+			act.add(getCCNForSourceFileNameInternal(sourceData.getName()));
+		}
+
+		// Cache result and return it
+		packageCNNCache.put(packageData.getName(), act);
+		return act;
+	}
+
+	/**
+	 * Computes CCN for single source file.
+	 *
+	 * @param sourceFile source file to compute CCN for
+	 *
+	 * @return CCN for the specified source file, 0 if cannot map <code>sourceFile</code> to existing file
+	 *
+	 * @throws NullPointerException if <code>sourceFile</code> is <code>null</code>
+	 */
+	public double getCCNForSourceFile(SourceFileData sourceFile) {
+		return getCCNForSourceFileNameInternal(sourceFile.getName())
+				.averageCCN();
+	}
+
+	/**
+	 * Get the function metrics for the given source file. Use this over the {@link #sourceFileFunctionMetricCache} field.
+	 *
+	 * @param sourceFileName the name of the source file
+	 * @return the function metrics for the given source file (parsed by {@link Javancss})
+	 */
+	private List<FunctionMetric> getFunctionMetricsForSingleFile(String sourceFileName) {
+		List<FunctionMetric> functionMetrics = Collections.emptyList();
+		if (!sourceFileFunctionMetricCache.containsKey(sourceFileName)) {
+			Source source = null;
+			try {
+				source = finder.getSource(sourceFileName);
+				if (source != null && sourceFileName.endsWith(".java")) {
+					Javancss javancss = javancssFactory.newInstance(source.getInputStream(), encoding);
+					if (javancss.getLastErrorMessage() != null) {
+						//there is an error while parsing the java file. log it
+						logger.warn("JavaNCSS got an error while parsing the java "
+							+ source.getOriginDesc() + "\n"
+							+ javancss.getLastErrorMessage());
+					}
+					functionMetrics = javancss.getFunctionMetrics();
+				}
+			} finally {
+				if (source != null) {
+					source.close();
+				}
+			}
+			sourceFileFunctionMetricCache.put(sourceFileName, functionMetrics);
+		}
+		return sourceFileFunctionMetricCache.get(sourceFileName);
+	}
+
+	private Complexity getCCNForSourceFileNameInternal(String sourceFileName) {
+		// Return CCN if computed earlier
+		Complexity cachedCCN = (Complexity) sourceFileCNNCache
+				.get(sourceFileName);
+		if (cachedCCN != null) {
+			return cachedCCN;
+		}
+
+		// Compute CCN and cache it for further use
+		Complexity result = ZERO_COMPLEXITY;
+		try {
+			result = getAccumlatedCCNForSingleFile(sourceFileName);
+		} catch (IOException ex) {
+			logger
+					.info("Cannot find source file during CCN computation, source=["
+							+ sourceFileName + "]");
+		}
+		sourceFileCNNCache.put(sourceFileName, result);
+		return result;
+	}
+
+	/**
+	 * Computes CCN for source file the specified class belongs to.
+	 *
+	 * @param classData package to compute CCN for
+	 *
+	 * @return CCN for source file the specified class belongs to
+	 *
+	 * @throws NullPointerException if <code>classData</code> is <code>null</code>
+	 */
+	public double getCCNForClass(ClassData classData) {
+		return getCCNForSourceFileNameInternal(classData.getSourceFileName())
+				.averageCCN();
+	}
+
+	/**
+	 * Computes CCN for a method.
+	 *
+	 * @param classData        class data for the class which contains the method to compute CCN for
+	 * @param methodName       the name of the method to compute CCN for
+	 * @param methodDescriptor the descriptor of the method to compute CCN for
+	 * @return CCN for the method
+	 * @throws NullPointerException if <code>classData</code> is <code>null</code>
+	 */
+	public int getCCNForMethod(ClassData classData, String methodName, String methodDescriptor) {
+		if(!calculateMethodComplexity) {
+			return 0;
+		}
+
+		Validate.notNull(classData, "classData must not be null");
+		Validate.notNull(methodName, "methodName must not be null");
+		Validate.notNull(methodDescriptor, "methodDescriptor must not be null");
+
+		int complexity = 0;
+		List<FunctionMetric> methodMetrics = getFunctionMetricsForSingleFile(classData.getSourceFileName());
+
+		// golden method = method for which we need ccn
+		String goldenMethodName = methodName;
+		boolean isConstructor = false;
+		if (goldenMethodName.equals("<init>")) {
+			isConstructor = true;
+			goldenMethodName = classData.getBaseName();
+		}
+		// fully-qualify the method
+		goldenMethodName = classData.getName() + "." + goldenMethodName;
+		// replace nested class separator $ by .
+		goldenMethodName = goldenMethodName.replaceAll(Pattern.quote("$"), ".");
+
+		TraceSignatureVisitor v = new TraceSignatureVisitor(Opcodes.ACC_PUBLIC);
+		SignatureReader r = new SignatureReader(methodDescriptor);
+		r.accept(v);
+
+		// for the scope of this method, signature = signature of the method excluding the method name
+		String goldenSignature = v.getDeclaration();
+		// get parameter type list string which is enclosed by round brackets ()
+		goldenSignature = goldenSignature.substring(1, goldenSignature.length() - 1);
+
+		// collect all the signatures with the same method name as golden method
+		Map<String, Integer> candidateSignatureToCcn = new HashMap<String, Integer>();
+		for (FunctionMetric singleMethodMetrics : methodMetrics) {
+			String candidateMethodName = singleMethodMetrics.name.substring(0, singleMethodMetrics.name.indexOf('('));
+			String candidateSignature = stripTypeParameters(singleMethodMetrics.name.substring(singleMethodMetrics.name.indexOf('(') + 1,
+				singleMethodMetrics.name.length() - 1));
+			if (goldenMethodName.equals(candidateMethodName)) {
+				candidateSignatureToCcn.put(candidateSignature, singleMethodMetrics.ccn);
+			}
+		}
+
+		// if only one signature, no signature matching needed
+		if (candidateSignatureToCcn.size() == 1) {
+			return candidateSignatureToCcn.values().iterator().next();
+		}
+
+		// else, do signature matching and find the best match
+
+		// update golden signature using reflection
+		if (!goldenSignature.isEmpty()) {
+			try {
+				String[] goldenParameterTypeStrings = goldenSignature.split(",");
+				Class<?>[] goldenParameterTypes = new Class[goldenParameterTypeStrings.length];
+				for (int i = 0; i < goldenParameterTypeStrings.length; i++) {
+					goldenParameterTypes[i] = ClassUtils.getClass(goldenParameterTypeStrings[i].trim(), false);
+				}
+				Class<?> klass = ClassUtils.getClass(classData.getName(), false);
+				if (isConstructor) {
+					Constructor<?> realMethod = klass.getDeclaredConstructor(goldenParameterTypes);
+					goldenSignature = realMethod.toGenericString();
+				} else {
+					Method realMethod = klass.getDeclaredMethod(methodName, goldenParameterTypes);
+					goldenSignature = realMethod.toGenericString();
+				}
+				// replace varargs ellipsis with array notation
+				goldenSignature = goldenSignature.replaceAll("\\.\\.\\.", "[]");
+				// extract the parameter type list string
+				goldenSignature = goldenSignature.substring(goldenSignature.indexOf("(") + 1, goldenSignature.length() - 1);
+				// strip the type parameters to get raw types
+				goldenSignature = stripTypeParameters(goldenSignature);
+			} catch (Exception e) {
+				logger.error("Error while getting method CC for " + goldenMethodName, e);
+				return 0;
+			}
+		}
+		// replace nested class separator $ by .
+		goldenSignature = goldenSignature.replaceAll(Pattern.quote("$"), ".");
+
+		// signature matching - due to loss of fully qualified parameter types from JavaCC, get ccn for the closest match
+		double signatureMatchPercentTillNow = 0;
+		for (Entry<String, Integer> candidateSignatureToCcnEntry : candidateSignatureToCcn.entrySet()) {
+			String candidateSignature = candidateSignatureToCcnEntry.getKey();
+			double currentMatchPercent = matchSignatures(candidateSignature, goldenSignature);
+			if (currentMatchPercent == 1) {
+				return candidateSignatureToCcnEntry.getValue();
+			}
+			if (currentMatchPercent > signatureMatchPercentTillNow) {
+				complexity = candidateSignatureToCcnEntry.getValue();
+				signatureMatchPercentTillNow = currentMatchPercent;
+			}
+		}
+
+		return complexity;
+	}
+
+	/**
+	 * Strip the type parameters from the signature with parameterized types. Spaces are preserved.
+	 * <p/>
+	 * E.g. {@code stripTypeParamaters("List<String> a, Map<String, List<? extends Person>> b, int c")} returns {@code "List, Map, int"}.
+	 *
+	 * @param signature the signature with parameterized types which needs to be stripped
+	 * @return the stripped signature
+	 */
+	private static final String stripTypeParameters(String signature) {
+		StringBuilder strippedSignature = new StringBuilder();
+		int openIndex = -1;
+		int openCount = 0;
+		final char open = '<';
+		final char close = '>';
+		while ((openIndex = signature.indexOf(open)) > -1) {
+			strippedSignature.append(signature.substring(0, openIndex));
+			for (int i = openIndex + 1; i < signature.length(); i++) {
+				if (signature.charAt(i) == close) {
+					if (openCount == 0) {
+						signature = signature.substring(i + 1);
+						break;
+					}
+					openCount--;
+				} else if (signature.charAt(i) == open) {
+					openCount++;
+				}
+			}
+		}
+		strippedSignature.append(signature);
+		return strippedSignature.toString();
+	}
+
+	/**
+	 * Match the {@code candidate} signature against the {@code golden} signature and return the match confidence.
+	 * A signature, for the scope of this method, is just the string of method parameter types; for e.g. signature for method
+	 * {@code public void process(List<String> names, int[] scores)} is {@code java.util.List, int[]}.
+	 * <p/>
+	 * Formula for calculating the return value is:<br/>
+	 * Match Confidence = Average of Individual Parameter Type Match Percents<br/>
+	 * <p/>
+	 * Important: As indicated by the formula, do not compare the confidences across different golden signatures since the confidence values are not
+	 * absolute.
+	 *
+	 * @param candidate signature which is to be matched; can have types which are not fully qualified
+	 * @param golden    signature against which {@code candidate} is matched; should have only fully qualified types
+	 * @return a value denoting the confidence that the given {@code candidate} signature matches the {@code golden} signature; between 0 and 1; 0
+	 * means guaranteed mismatch and a 1 means that guaranteed match.
+	 */
+	private static final double matchSignatures(String candidate, String golden) {
+
+		// assumption: golden is assumed to have fully qualified types and candidate may have types which are not fully qualified
+
+		String[] candidateParamTypes = candidate.split(",");
+		String[] goldenParamTypes = golden.split(",");
+
+		// mismatch: if count of parameters are not same
+		if (goldenParamTypes.length != candidateParamTypes.length) {
+			return 0;
+		}
+
+		int totalParamTypes = goldenParamTypes.length;
+
+		// complete match: if no parameters
+		if (totalParamTypes == 0) {
+			return 1;
+		}
+
+		double totalMatchPercent = 0;
+
+		for (int i = 0; i < totalParamTypes; i++) {
+			String goldenParamType = goldenParamTypes[i].trim();
+			String candidateParamType = candidateParamTypes[i].trim();
+
+			// mismatch: if golden parameter type is smaller than candidate parameter type
+			if (goldenParamType.length() < candidateParamType.length()) {
+				return 0;
+			}
+
+			if (goldenParamType.equals(candidateParamType)) {
+				// complete match
+				totalMatchPercent += 1;
+			} else {
+				int partialMatchIndex = goldenParamType.lastIndexOf(candidateParamType);
+				// package separator '.' cannot be before position 1; e.g. a.type
+				if (partialMatchIndex > 1 &&
+					goldenParamType.length() == (partialMatchIndex + candidateParamType.length()) &&
+					goldenParamType.charAt(partialMatchIndex - 1) == '.') {
+					// partial match
+					totalMatchPercent += (1 - (double) partialMatchIndex / goldenParamType.length());
+				} else {
+					// mismatch
+					return 0;
+				}
+			}
+		}
+
+		return totalMatchPercent / totalParamTypes;
+	}
+
+	/**
+	 * Indicate whether complexity should be calculated for methods.
+	 *
+	 * @param calculateMethodComplexity Whether to calculate method complexity
+	 */
+	public void setCalculateMethodComplexity(boolean calculateMethodComplexity)
+	{
+		this.calculateMethodComplexity = calculateMethodComplexity;
+	}
+
+	/**
+	 * Set the encoding to be used when reading input streams.
+	 * 
+	 * @param encoding
+	 *            The encoding to use
+	 */
+	public void setEncoding(String encoding) {
+		this.encoding = encoding;
+	}
+
+	/**
+	 * Represents complexity of source file, package or project. Stores the number of
+	 * methods inside entity and accumlated complexity for these methods.
+	 */
+	private static class Complexity {
+		private double accumlatedCCN;
+		private int methodsNum;
+
+		public Complexity(double accumlatedCCN, int methodsNum) {
+			this.accumlatedCCN = accumlatedCCN;
+			this.methodsNum = methodsNum;
+		}
+
+		public Complexity() {
+			this(0, 0);
+		}
+
+		public double averageCCN() {
+			if (methodsNum == 0) {
+				return 0;
+			}
+			return accumlatedCCN / methodsNum;
+		}
+
+		public void add(Complexity second) {
+			accumlatedCCN += second.accumlatedCCN;
+			methodsNum += second.methodsNum;
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/CompositeReport.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/CompositeReport.java
new file mode 100644
index 0000000..3e97268
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/CompositeReport.java
@@ -0,0 +1,42 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class CompositeReport implements Report {
+
+	private Set<Report> reports;
+
+	public CompositeReport() {
+		reports = new HashSet<Report>();
+		reports.add(new NullReport());
+	}
+
+	public void export(ReportFormat reportFormat) {
+		for (Report report : reports) {
+			report.export(reportFormat);
+		}
+	}
+
+	public ReportName getName() {
+		return ReportName.COMPOSITE_REPORT;
+	}
+
+	public Report getByName(ReportName name) {
+		if (ReportName.COMPOSITE_REPORT.equals(name)) {
+			return this;
+		}
+		for (Report report : reports) {
+			if (report.getName().equals(name)) {
+				return report;
+			}
+		}
+		return getByName(ReportName.NULL_REPORT);
+	}
+
+	public void addReport(Report report) {
+		reports.add(report);
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/CoverageThresholdsReport.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/CoverageThresholdsReport.java
new file mode 100644
index 0000000..9ef8a83
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/CoverageThresholdsReport.java
@@ -0,0 +1,41 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.check.CoverageResultEntry;
+import net.sourceforge.cobertura.dsl.ReportFormat;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Contains coverage data.
+ */
+public class CoverageThresholdsReport implements Report {
+	private List<CoverageResultEntry> coverageResultEntries;
+	private NullReport nullReport;
+
+	public CoverageThresholdsReport(
+			List<CoverageResultEntry> coverageResultEntries) {
+		this.coverageResultEntries = Collections
+				.unmodifiableList(coverageResultEntries);
+		this.nullReport = new NullReport();
+	}
+
+	public void export(ReportFormat reportFormat) {
+		//TODO left for future implementations
+	}
+
+	public ReportName getName() {
+		return ReportName.THRESHOLDS_REPORT;
+	}
+
+	public Report getByName(ReportName name) {
+		if (getName().equals(name)) {
+			return this;
+		}
+		return nullReport;
+	}
+
+	public List<CoverageResultEntry> getCoverageResultEntries() {
+		return coverageResultEntries;
+	}
+}
diff --git a/test/SomeOtherClassTest.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/Main.java
similarity index 53%
rename from test/SomeOtherClassTest.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/reporting/Main.java
index 60ad7cd..6571845 100644
--- a/test/SomeOtherClassTest.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/Main.java
@@ -1,40 +1,42 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Jeremy Thomerson
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-import someotherpackage.SomeOtherClass;
-import junit.framework.TestCase;
-
-public class SomeOtherClassTest extends TestCase {
-
-	public void testFoo() {
-		SomeOtherClass obj = new SomeOtherClass();
-		obj.incrementCounter();
-		obj.incrementCounter();
-		obj.incrementCounter();
-		obj.decrementCounter();
-		obj.decrementCounter();
-		obj.decrementCounter();
-		obj.decrementCounter();
-		obj.getCounter();
-        
-        assertNotNull(obj); // obviously a no-op assertion 
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 Dan Godfrey
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting;
+
+/**
+ * Deprecated wrapper class for the new CheckCoverageMain class.  It is only
+ * here to facilitate an orderly transition to the new class and will go
+ * away in a few releases
+ *
+ * @author Steven C. Saliman
+ */
+ at Deprecated
+public class Main {
+	public static void main(String[] args) throws Exception {
+		System.err.println("net.sourceforge.cobertura.reporting.Main is a deprecated class.");
+		System.err.println("Please use net.sourceforge.cobertura.reporting.ReportMain instead");
+		ReportMain.main(args);
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/NativeReport.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/NativeReport.java
new file mode 100644
index 0000000..bd63ae2
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/NativeReport.java
@@ -0,0 +1,64 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.dsl.ReportFormat;
+import net.sourceforge.cobertura.util.FileFinder;
+
+import java.io.File;
+
+public class NativeReport implements Report {
+	private NullReport nullReport;
+	private ProjectData projectData;
+	private File destinationDir;
+	private FileFinder finder;
+	private ComplexityCalculator complexity;
+	private String encoding;
+	private ReportFormatStrategyRegistry formatStrategyRegistry;
+
+	public NativeReport(ProjectData projectData, File destinationDir,
+			FileFinder finder, ComplexityCalculator complexity, String encoding) {
+		this.nullReport = new NullReport();
+		this.projectData = projectData;
+		this.destinationDir = destinationDir;
+		this.finder = finder;
+		this.complexity = complexity;
+		this.destinationDir = destinationDir;
+		this.encoding = encoding;
+		formatStrategyRegistry = ReportFormatStrategyRegistry.getInstance();
+	}
+
+	public void export(ReportFormat reportFormat) {
+		formatStrategyRegistry.getReportFormatStrategy(reportFormat).save(this);
+	}
+
+	public ReportName getName() {
+		return ReportName.COVERAGE_REPORT;
+	}
+
+	public Report getByName(ReportName name) {
+		if (getName().equals(name)) {
+			return this;
+		}
+		return nullReport;
+	}
+
+	public ProjectData getProjectData() {
+		return projectData;
+	}
+
+	public File getDestinationDir() {
+		return destinationDir;
+	}
+
+	public FileFinder getFinder() {
+		return finder;
+	}
+
+	public ComplexityCalculator getComplexity() {
+		return complexity;
+	}
+
+	public String getEncoding() {
+		return encoding;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/NullReport.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/NullReport.java
new file mode 100644
index 0000000..a865192
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/NullReport.java
@@ -0,0 +1,18 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+
+public class NullReport implements Report {
+
+	public void export(ReportFormat reportFormat) {
+		//no action performed
+	}
+
+	public ReportName getName() {
+		return ReportName.NULL_REPORT;
+	}
+
+	public Report getByName(ReportName name) {
+		return this;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/Report.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/Report.java
new file mode 100644
index 0000000..d67f2da
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/Report.java
@@ -0,0 +1,26 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+
+/**
+ * Report that contains metrics calculated on data.
+ */
+public interface Report {
+
+	/**
+	 * Uses the given ReportFormatStrategy to export report data.
+	 * @param reportFormat - a report format value,
+	 *                             never <code>null</code>
+	 */
+	void export(ReportFormat reportFormat);
+
+	ReportName getName();
+
+	/**
+	 * Returns a given report or a NullReport instance if no report is found.
+	 * @param name
+	 * @return
+	 */
+	Report getByName(ReportName name);
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportFormatStrategy.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportFormatStrategy.java
new file mode 100644
index 0000000..3880d39
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportFormatStrategy.java
@@ -0,0 +1,20 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+
+/**
+ * Strategy to export Report data into a specific format.
+ */
+public interface ReportFormatStrategy {
+	/**
+	 * Exports Report information to a given format
+	 * @param report - Report object which contains coverage information.
+	 */
+	void save(Report report);
+
+	/**
+	 * Returns name of report format strategy
+	 * @return ReportFormat - some report format value.
+	 */
+	ReportFormat getName();
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportFormatStrategyRegistry.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportFormatStrategyRegistry.java
new file mode 100644
index 0000000..c03f199
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportFormatStrategyRegistry.java
@@ -0,0 +1,44 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+import net.sourceforge.cobertura.reporting.html.HTMLReportFormatStrategy;
+import net.sourceforge.cobertura.reporting.xml.SummaryXMLReportStrategy;
+import net.sourceforge.cobertura.reporting.xml.XMLReportFormatStrategy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ReportFormatStrategyRegistry {
+	private static ReportFormatStrategyRegistry instance = null;
+	private Map<ReportFormat, ReportFormatStrategy> reportFormatsRegistry;
+
+	private ReportFormatStrategyRegistry() {
+		reportFormatsRegistry = new HashMap<ReportFormat, ReportFormatStrategy>();
+		registerReportFormatStrategies();
+	}
+
+	public ReportFormatStrategy getReportFormatStrategy(
+			ReportFormat reportFormat) {
+		return reportFormatsRegistry.get(reportFormat);
+	}
+
+	private void registerReportFormatStrategies() {
+		reportFormatsRegistry = new HashMap<ReportFormat, ReportFormatStrategy>();
+		registerReportFormatStrategy(new SummaryXMLReportStrategy());
+		registerReportFormatStrategy(new XMLReportFormatStrategy());
+		registerReportFormatStrategy(new HTMLReportFormatStrategy());
+	}
+
+	private void registerReportFormatStrategy(
+			ReportFormatStrategy reportFormatStrategy) {
+		reportFormatsRegistry.put(reportFormatStrategy.getName(),
+				reportFormatStrategy);
+	}
+
+	public static ReportFormatStrategyRegistry getInstance() {
+		if (instance == null) {
+			instance = new ReportFormatStrategyRegistry();
+		}
+		return instance;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportMain.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportMain.java
new file mode 100644
index 0000000..b85ff98
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportMain.java
@@ -0,0 +1,160 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 Dan Godfrey
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.dsl.Arguments;
+import net.sourceforge.cobertura.dsl.ArgumentsBuilder;
+import net.sourceforge.cobertura.dsl.Cobertura;
+import net.sourceforge.cobertura.dsl.ReportFormat;
+import net.sourceforge.cobertura.util.CommandLineBuilder;
+import net.sourceforge.cobertura.util.Header;
+
+import java.io.File;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ReportMain {
+
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(ReportMain.class);
+
+	private static void parseArgumentsAndReport(String[] args) throws Exception {
+		ArgumentsBuilder builder = new ArgumentsBuilder();
+
+		String baseDir = null;
+		String format = null;
+		boolean sourcesParam = false;
+		for (int i = 0; i < args.length; i++) {
+			if (args[i].equals("--basedir")) {
+				baseDir = args[++i];
+				builder.setBaseDirectory(baseDir);
+			} else if (args[i].equals("--datafile")) {
+				String datafile = args[++i];
+				validateDataFile(datafile);
+				builder.setDataFile(datafile);
+			} else if (args[i].equals("--destination")) {
+				String destination = args[++i];
+				builder.setDestinationDirectory(destination);
+				validateAndCreateDestinationDirectory(destination);
+			} else if (args[i].equals("--format")) {
+				format = args[++i];
+				validateFormat(format);
+			} else if (args[i].equals("--encoding")) {
+				builder.setEncoding(args[++i]);
+			} else if (args[i].equals("--calculateMethodComplexity")) {
+				builder.calculateMethodComplexity(true);
+			} else {
+				builder.addSources(args[i], baseDir == null);
+			}
+		}
+
+		Arguments arguments = builder.build();
+
+		if (arguments.getDestinationDirectory() == null) {
+			System.err.println("Error: destination directory must be set");
+			System.exit(1);
+		}
+
+		if (LOGGER.isDebugEnabled()) {
+			LOGGER.debug(String.format("format is %s encoding is %s", format,
+					arguments.getEncoding()));
+			LOGGER.debug("dataFile is "
+					+ arguments.getDataFile().getAbsolutePath());
+			LOGGER.debug("destinationDir is "
+					+ arguments.getDestinationDirectory().getAbsolutePath());
+		}
+
+		new Cobertura(arguments).report().export(
+				ReportFormat.getFromString(format));
+	}
+
+	private static void validateFormat(String format) {
+		if (!format.equalsIgnoreCase("html") && !format.equalsIgnoreCase("xml")
+				&& !format.equalsIgnoreCase("summaryXml")) {
+			System.err.println("" + "Error: format \"" + format
+					+ "\" is invalid. Must be either html, xml or summaryXml");
+			System.exit(1);
+		}
+	}
+
+	private static void validateDataFile(String value) {
+		File dataFile = new File(value);
+		if (!dataFile.exists()) {
+			System.err.println("Error: data file " + dataFile.getAbsolutePath()
+					+ " does not exist");
+			System.exit(1);
+		}
+		if (!dataFile.isFile()) {
+			System.err.println("Error: data file " + dataFile.getAbsolutePath()
+					+ " must be a regular file");
+			System.exit(1);
+		}
+	}
+
+	private static void validateAndCreateDestinationDirectory(String value) {
+		File destinationDir = new File(value);
+		if (destinationDir.exists() && !destinationDir.isDirectory()) {
+			System.err.println("Error: destination directory " + destinationDir
+					+ " already exists but is not a directory");
+			System.exit(1);
+		}
+		destinationDir.mkdirs();
+	}
+
+	public static int generateReport(String[] args) throws Exception {
+		Header.print(System.out);
+
+		long startTime = System.currentTimeMillis();
+
+		try {
+			args = CommandLineBuilder.preprocessCommandLineArguments(args);
+		} catch (Exception ex) {
+			System.err.println("Error: Cannot process arguments: "
+					+ ex.getMessage());
+			return 1;
+		}
+
+		parseArgumentsAndReport(args);
+
+		long stopTime = System.currentTimeMillis();
+		System.out.println("Report time: " + (stopTime - startTime) + "ms");
+		return 0;
+	}
+
+	public static void main(String[] args) throws Exception {
+		int returnValue;
+		try {
+			returnValue = generateReport(args);
+		} catch (Exception e) {
+			returnValue = 1;
+		}
+		if ( returnValue != 0 ) {
+			System.exit(returnValue);
+		}
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportName.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportName.java
new file mode 100644
index 0000000..e0411de
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/ReportName.java
@@ -0,0 +1,5 @@
+package net.sourceforge.cobertura.reporting;
+
+public enum ReportName {
+	COVERAGE_REPORT, THRESHOLDS_REPORT, COMPLEXITY_REPORT, COMPOSITE_REPORT, NULL_REPORT
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/HTMLReport.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/HTMLReport.java
similarity index 72%
rename from src/net/sourceforge/cobertura/reporting/html/HTMLReport.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/HTMLReport.java
index 22660ee..ea243fa 100644
--- a/src/net/sourceforge/cobertura/reporting/html/HTMLReport.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/HTMLReport.java
@@ -1,845 +1,743 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2006 Naoki Iwami
- * Copyright (C) 2009 Charlie Squires
- * Copyright (C) 2009 John Lewis
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.html;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.Vector;
-
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.CoverageData;
-import net.sourceforge.cobertura.coveragedata.LineData;
-import net.sourceforge.cobertura.coveragedata.PackageData;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.coveragedata.SourceFileData;
-import net.sourceforge.cobertura.reporting.ComplexityCalculator;
-import net.sourceforge.cobertura.reporting.html.files.CopyFiles;
-import net.sourceforge.cobertura.util.FileFinder;
-import net.sourceforge.cobertura.util.Header;
-import net.sourceforge.cobertura.util.IOUtil;
-import net.sourceforge.cobertura.util.Source;
-import net.sourceforge.cobertura.util.StringUtil;
-
-import org.apache.log4j.Logger;
-
-public class HTMLReport
-{
-
-	private static final Logger LOGGER = Logger.getLogger(HTMLReport.class);
-
-	private File destinationDir;
-
-	private FileFinder finder;
-
-	private ComplexityCalculator complexity;
-
-	private ProjectData projectData;
-
-	private String encoding;
-
-	/**
-	 * Create a coverage report
-	 * @param encoding 
-	 */
-	public HTMLReport(ProjectData projectData, File outputDir,
-			FileFinder finder, ComplexityCalculator complexity, String encoding)
-			throws Exception
-	{
-		this.destinationDir = outputDir;
-		this.finder = finder;
-		this.complexity = complexity;
-		this.projectData = projectData;
-		this.encoding = encoding;
-
-		CopyFiles.copy(outputDir);
-		generatePackageList();
-		generateSourceFileLists();
-		generateOverviews();
-		generateSourceFiles();
-	}
-
-	private String generatePackageName(PackageData packageData)
-	{
-		if (packageData.getName().equals(""))
-			return "(default)";
-		return packageData.getName();
-	}
-
-	private void generatePackageList() throws IOException
-	{
-		File file = new File(destinationDir, "frame-packages.html");
-		PrintWriter out = null;
-
-		try
-		{
-			out = IOUtil.getPrintWriter(file);
-
-			out
-					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
-			out
-					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
-
-			out
-					.println("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">");
-			out.println("<head>");
-			out
-					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
-			out.println("<title>Coverage Report</title>");
-			out
-					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\" />");
-			out.println("</head>");
-			out.println("<body>");
-			out.println("<h5>Packages</h5>");
-			out.println("<table width=\"100%\">");
-			out.println("<tr>");
-			out
-					.println("<td nowrap=\"nowrap\"><a href=\"frame-summary.html\" onclick='parent.sourceFileList.location.href=\"frame-sourcefiles.html\"' target=\"summary\">All</a></td>");
-			out.println("</tr>");
-
-			Iterator iter = projectData.getPackages().iterator();
-			while (iter.hasNext())
-			{
-				PackageData packageData = (PackageData)iter.next();
-				String url1 = "frame-summary-" + packageData.getName()
-						+ ".html";
-				String url2 = "frame-sourcefiles-" + packageData.getName()
-						+ ".html";
-				out.println("<tr>");
-				out.println("<td nowrap=\"nowrap\"><a href=\"" + url1
-						+ "\" onclick='parent.sourceFileList.location.href=\""
-						+ url2 + "\"' target=\"summary\">"
-						+ generatePackageName(packageData) + "</a></td>");
-				out.println("</tr>");
-			}
-			out.println("</table>");
-			out.println("</body>");
-			out.println("</html>");
-		}
-		finally
-		{
-			if (out != null)
-			{
-				out.close();
-			}
-		}
-	}
-
-	private void generateSourceFileLists() throws IOException
-	{
-		generateSourceFileList(null);
-		Iterator iter = projectData.getPackages().iterator();
-		while (iter.hasNext())
-		{
-			PackageData packageData = (PackageData)iter.next();
-			generateSourceFileList(packageData);
-		}
-	}
-
-	private void generateSourceFileList(PackageData packageData)
-			throws IOException
-	{
-		String filename;
-		Collection sourceFiles;
-		if (packageData == null)
-		{
-			filename = "frame-sourcefiles.html";
-			sourceFiles = projectData.getSourceFiles();
-		}
-		else
-		{
-			filename = "frame-sourcefiles-" + packageData.getName() + ".html";
-			sourceFiles = packageData.getSourceFiles();
-		}
-
-		// sourceFiles may be sorted, but if so it's sorted by
-		// the full path to the file, and we only want to sort
-		// based on the file's basename.
-		Vector sortedSourceFiles = new Vector();
-		sortedSourceFiles.addAll(sourceFiles);
-		Collections.sort(sortedSourceFiles,
-				new SourceFileDataBaseNameComparator());
-
-		File file = new File(destinationDir, filename);
-		PrintWriter out = null;
-		try
-		{
-			out = IOUtil.getPrintWriter(file);
-
-			out
-					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
-			out
-					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
-
-			out.println("<html>");
-			out.println("<head>");
-			out
-					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>");
-			out.println("<title>Coverage Report Classes</title>");
-			out
-					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\"/>");
-			out.println("</head>");
-			out.println("<body>");
-			out.println("<h5>");
-			out.println(packageData == null ? "All Packages"
-					: generatePackageName(packageData));
-			out.println("</h5>");
-			out.println("<div class=\"separator\"> </div>");
-			out.println("<h5>Classes</h5>");
-			if (!sortedSourceFiles.isEmpty())
-			{
-				out.println("<table width=\"100%\">");
-				out.println("<tbody>");
-
-				for (Iterator iter = sortedSourceFiles.iterator(); iter
-						.hasNext();)
-				{
-					SourceFileData sourceFileData = (SourceFileData)iter.next();
-					out.println("<tr>");
-					String percentCovered;
-					if (sourceFileData.getNumberOfValidLines() > 0)
-						percentCovered = getPercentValue(sourceFileData
-								.getLineCoverageRate());
-					else
-						percentCovered = "N/A";
-					out
-							.println("<td nowrap=\"nowrap\"><a target=\"summary\" href=\""
-									+ sourceFileData.getNormalizedName()
-									+ ".html\">"
-									+ sourceFileData.getBaseName()
-									+ "</a> <i>("
-									+ percentCovered
-									+ ")</i></td>");
-					out.println("</tr>");
-				}
-				out.println("</tbody>");
-				out.println("</table>");
-			}
-
-			out.println("</body>");
-			out.println("</html>");
-		}
-		finally
-		{
-			if (out != null)
-			{
-				out.close();
-			}
-		}
-	}
-
-	private void generateOverviews() throws IOException
-	{
-		generateOverview(null);
-		Iterator iter = projectData.getPackages().iterator();
-		while (iter.hasNext())
-		{
-			PackageData packageData = (PackageData)iter.next();
-			generateOverview(packageData);
-		}
-	}
-
-	private void generateOverview(PackageData packageData) throws IOException
-	{
-		Iterator iter;
-
-		String filename;
-		if (packageData == null)
-		{
-			filename = "frame-summary.html";
-		}
-		else
-		{
-			filename = "frame-summary-" + packageData.getName() + ".html";
-		}
-		File file = new File(destinationDir, filename);
-		PrintWriter out = null;
-
-		try
-		{
-			out = IOUtil.getPrintWriter(file);;
-
-			out
-					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
-			out
-					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
-
-			out.println("<html>");
-			out.println("<head>");
-			out
-					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>");
-			out.println("<title>Coverage Report</title>");
-			out
-					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\"/>");
-			out
-					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/sortabletable.css\"/>");
-			out
-					.println("<script type=\"text/javascript\" src=\"js/popup.js\"></script>");
-			out
-					.println("<script type=\"text/javascript\" src=\"js/sortabletable.js\"></script>");
-			out
-					.println("<script type=\"text/javascript\" src=\"js/customsorttypes.js\"></script>");
-			out.println("</head>");
-			out.println("<body>");
-
-			out.print("<h5>Coverage Report - ");
-			out.print(packageData == null ? "All Packages"
-					: generatePackageName(packageData));
-			out.println("</h5>");
-			out.println("<div class=\"separator\"> </div>");
-			out.println("<table class=\"report\" id=\"packageResults\">");
-			out.println(generateTableHeader("Package", true));
-			out.println("<tbody>");
-
-			SortedSet packages;
-			if (packageData == null)
-			{
-				// Output a summary line for all packages
-				out.println(generateTableRowForTotal());
-
-				// Get packages
-				packages = projectData.getPackages();
-			}
-			else
-			{
-				// Get subpackages
-				packages = projectData.getSubPackages(packageData.getName());
-			}
-
-			// Output a line for each package or subpackage
-			iter = packages.iterator();
-			while (iter.hasNext())
-			{
-				PackageData subPackageData = (PackageData)iter.next();
-				out.println(generateTableRowForPackage(subPackageData));
-			}
-
-			out.println("</tbody>");
-			out.println("</table>");
-			out.println("<script type=\"text/javascript\">");
-			out
-					.println("var packageTable = new SortableTable(document.getElementById(\"packageResults\"),");
-			out
-					.println("    [\"String\", \"Number\", \"Percentage\", \"Percentage\", \"FormattedNumber\"]);");
-			out.println("packageTable.sort(0);");
-			out.println("</script>");
-
-			// Get the list of source files in this package
-			Collection sourceFiles;
-			if (packageData == null)
-			{
-				PackageData defaultPackage = (PackageData)projectData
-						.getChild("");
-				if (defaultPackage != null)
-				{
-					sourceFiles = defaultPackage.getSourceFiles();
-				}
-				else
-				{
-					sourceFiles = new TreeSet();
-				}
-			}
-			else
-			{
-				sourceFiles = packageData.getSourceFiles();
-			}
-
-			// Output a line for each source file
-			if (sourceFiles.size() > 0)
-			{
-				out.println("<div class=\"separator\"> </div>");
-				out.println("<table class=\"report\" id=\"classResults\">");
-				out.println(generateTableHeader("Classes in this Package",
-						false));
-				out.println("<tbody>");
-
-				iter = sourceFiles.iterator();
-				while (iter.hasNext())
-				{
-					SourceFileData sourceFileData = (SourceFileData)iter.next();
-					out.println(generateTableRowsForSourceFile(sourceFileData));
-				}
-
-				out.println("</tbody>");
-				out.println("</table>");
-				out.println("<script type=\"text/javascript\">");
-				out
-						.println("var classTable = new SortableTable(document.getElementById(\"classResults\"),");
-				out
-						.println("    [\"String\", \"Percentage\", \"Percentage\", \"FormattedNumber\"]);");
-				out.println("classTable.sort(0);");
-				out.println("</script>");
-			}
-
-			out.println(generateFooter());
-
-			out.println("</body>");
-			out.println("</html>");
-		}
-		finally
-		{
-			if (out != null)
-			{
-				out.close();
-			}
-		}
-	}
-
-	private void generateSourceFiles()
-	{
-		Iterator iter = projectData.getSourceFiles().iterator();
-		while (iter.hasNext())
-		{
-			SourceFileData sourceFileData = (SourceFileData)iter.next();
-			try
-			{
-				generateSourceFile(sourceFileData);
-			}
-			catch (IOException e)
-			{
-				LOGGER.info("Could not generate HTML file for source file "
-						+ sourceFileData.getName() + ": "
-						+ e.getLocalizedMessage());
-			}
-		}
-	}
-
-	private void generateSourceFile(SourceFileData sourceFileData)
-			throws IOException
-	{
-		if (!sourceFileData.containsInstrumentationInfo())
-		{
-			LOGGER.info("Data file does not contain instrumentation "
-					+ "information for the file " + sourceFileData.getName()
-					+ ".  Ensure this class was instrumented, and this "
-					+ "data file contains the instrumentation information.");
-		}
-
-		String filename = sourceFileData.getNormalizedName() + ".html";
-		File file = new File(destinationDir, filename);
-		PrintWriter out = null;
-
-		try
-		{
-			out = IOUtil.getPrintWriter(file);
-
-			out
-					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
-			out
-					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
-
-			out.println("<html>");
-			out.println("<head>");
-			out
-					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>");
-			out.println("<title>Coverage Report</title>");
-			out
-					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\"/>");
-			out
-					.println("<script type=\"text/javascript\" src=\"js/popup.js\"></script>");
-			out.println("</head>");
-			out.println("<body>");
-			out.print("<h5>Coverage Report - ");
-			String classPackageName = sourceFileData.getPackageName();
-			if ((classPackageName != null) && classPackageName.length() > 0)
-			{
-				out.print(classPackageName + ".");
-			}
-			out.print(sourceFileData.getBaseName());
-			out.println("</h5>");
-
-			// Output the coverage summary for this class
-			out.println("<div class=\"separator\"> </div>");
-			out.println("<table class=\"report\">");
-			out.println(generateTableHeader("Classes in this File", false));
-			out.println(generateTableRowsForSourceFile(sourceFileData));
-			out.println("</table>");
-
-			// Output the coverage summary for methods in this class
-			// TODO
-
-			// Output this class's source code with syntax and coverage highlighting
-			out.println("<div class=\"separator\"> </div>");
-			out.println(generateHtmlizedJavaSource(sourceFileData));
-
-			out.println(generateFooter());
-
-			out.println("</body>");
-			out.println("</html>");
-		}
-		finally
-		{
-			if (out != null)
-			{
-				out.close();
-			}
-		}
-	}
-   
-	private String generateBranchInfo(LineData lineData, String content) {
-		boolean hasBranch = (lineData != null) ? lineData.hasBranch() : false;
-		if (hasBranch) 
-		{
-			StringBuffer ret = new StringBuffer();
-			ret.append("<a title=\"Line ").append(lineData.getLineNumber()).append(": Conditional coverage ")
-			   .append(lineData.getConditionCoverage());
-			if (lineData.getConditionSize() > 1)
-			{
-				ret.append(" [each condition: ");
-				for (int i = 0; i < lineData.getConditionSize(); i++)
-				{
-					if (i > 0)
-						ret.append(", ");
-					ret.append(lineData.getConditionCoverage(i));
-				}
-				ret.append("]");
-			}
-			ret.append(".\">").append(content).append("</a>");
-			return ret.toString();
-		}
-		else
-		{
-			return content;
-		}
-	}
-
-	private String generateHtmlizedJavaSource(SourceFileData sourceFileData)
-	{
-		Source source = finder.getSource(sourceFileData.getName());
-		
-		if (source == null)
-		{
-			return "<p>Unable to locate " + sourceFileData.getName()
-					+ ".  Have you specified the source directory?</p>";
-		}
-
-		BufferedReader br = null;
-		try
-		{
-			br = new BufferedReader(new InputStreamReader(source.getInputStream(), encoding));
-		}
-		catch (UnsupportedEncodingException e)
-		{
-			return "<p>Unable to open " + source.getOriginDesc()
-					+ ": The encoding '" + encoding +"' is not supported by your JVM.</p>";
-		}
-		catch (Throwable t)
-		{
-			return "<p>Unable to open " + source.getOriginDesc() + ": " + t.getLocalizedMessage() + "</p>";
-		}
-
-		StringBuffer ret = new StringBuffer();
-		ret
-				.append("<table cellspacing=\"0\" cellpadding=\"0\" class=\"src\">\n");
-		try
-		{
-			String lineStr;
-			JavaToHtml javaToHtml = new JavaToHtml();
-			int lineNumber = 1;
-			while ((lineStr = br.readLine()) != null)
-			{
-				ret.append("<tr>");
-				if (sourceFileData.isValidSourceLineNumber(lineNumber))
-				{
-					LineData lineData = sourceFileData.getLineCoverage(lineNumber);
-					ret.append("  <td class=\"numLineCover\"> "
-							+ lineNumber + "</td>");
-					if ((lineData != null) && (lineData.isCovered()))
-					{
-						ret.append("  <td class=\"nbHitsCovered\">" 
-								+ generateBranchInfo(lineData, " " + ((lineData != null) ? lineData.getHits() : 0)) 
-								+ "</td>");
-						ret
-							.append("  <td class=\"src\"><pre class=\"src\"> "
-									+ generateBranchInfo(lineData, javaToHtml.process(lineStr))
-									+ "</pre></td>");
-					}
-					else
-					{
-						ret.append("  <td class=\"nbHitsUncovered\">"
-								+ generateBranchInfo(lineData, " " + ((lineData != null) ? lineData.getHits() : 0))
-								+ "</td>");
-						ret
-							.append("  <td class=\"src\"><pre class=\"src\"><span class=\"srcUncovered\"> "
-									+ generateBranchInfo(lineData, javaToHtml.process(lineStr))
-									+ "</span></pre></td>");
-					}
-				}
-				else
-				{
-					ret.append("  <td class=\"numLine\"> " + lineNumber
-							+ "</td>");
-					ret.append("  <td class=\"nbHits\"> </td>\n");
-					ret.append("  <td class=\"src\"><pre class=\"src\"> "
-							+ javaToHtml.process(lineStr) + "</pre></td>");
-				}
-				ret.append("</tr>\n");
-				lineNumber++;
-			}
-		}
-		catch (IOException e)
-		{
-			ret.append("<tr><td>Error reading "
-					+ source.getOriginDesc() + ": "
-					+ e.getLocalizedMessage() + "</td></tr>\n");
-		}
-		finally
-		{
-			try
-			{
-				br.close();
-				source.close();
-			}
-			catch (IOException e)
-			{
-			}
-		}
-
-		ret.append("</table>\n");
-
-		return ret.toString();
-	}
-
-	private static String generateFooter()
-	{
-		return "<div class=\"footer\">Report generated by "
-				+ "<a href=\"http://cobertura.sourceforge.net/\" target=\"_top\">Cobertura</a> "
-				+ Header.version() + " on "
-				+ DateFormat.getInstance().format(new Date()) + ".</div>";
-	}
-
-	private static String generateTableHeader(String title,
-			boolean showColumnForNumberOfClasses)
-	{
-		StringBuffer ret = new StringBuffer();
-		ret.append("<thead>");
-		ret.append("<tr>");
-		ret.append("  <td class=\"heading\">" + title + "</td>");
-		if (showColumnForNumberOfClasses)
-		{
-			ret.append("  <td class=\"heading\"># Classes</td>");
-		}
-		ret.append("  <td class=\"heading\">"
-				+ generateHelpURL("Line Coverage",
-						"The percent of lines executed by this test run.")
-				+ "</td>");
-		ret.append("  <td class=\"heading\">"
-				+ generateHelpURL("Branch Coverage",
-						"The percent of branches executed by this test run.")
-				+ "</td>");
-		ret
-				.append("  <td class=\"heading\">"
-						+ generateHelpURL(
-								"Complexity",
-								"Average McCabe's cyclomatic code complexity for all methods.  This is basically a count of the number of different code paths in a method (incremented by 1 for each if statement, while loop, etc.)")
-						+ "</td>");
-		ret.append("</tr>");
-		ret.append("</thead>");
-		return ret.toString();
-	}
-
-	private static String generateHelpURL(String text, String description)
-	{
-		StringBuffer ret = new StringBuffer();
-		boolean popupTooltips = false;
-		if (popupTooltips)
-		{
-			ret
-					.append("<a class=\"hastooltip\" href=\"help.html\" onclick=\"popupwindow('help.html'); return false;\">");
-			ret.append(text);
-			ret.append("<span>" + description + "</span>");
-			ret.append("</a>");
-		}
-		else
-		{
-			ret
-					.append("<a class=\"dfn\" href=\"help.html\" onclick=\"popupwindow('help.html'); return false;\">");
-			ret.append(text);
-			ret.append("</a>");
-		}
-		return ret.toString();
-	}
-
-	private String generateTableRowForTotal()
-	{
-		StringBuffer ret = new StringBuffer();
-		double ccn = complexity.getCCNForProject(projectData);
-
-		ret.append("  <tr>");
-		ret.append("<td><b>All Packages</b></td>");
-		ret.append("<td class=\"value\">"
-				+ projectData.getNumberOfClasses() + "</td>");
-		ret.append(generateTableColumnsFromData(projectData, ccn));
-		ret.append("</tr>");
-		return ret.toString();
-	}
-
-	private String generateTableRowForPackage(PackageData packageData)
-	{
-		StringBuffer ret = new StringBuffer();
-		String url1 = "frame-summary-" + packageData.getName() + ".html";
-		String url2 = "frame-sourcefiles-" + packageData.getName() + ".html";
-		double ccn = complexity.getCCNForPackage(packageData);
-
-		ret.append("  <tr>");
-		ret.append("<td><a href=\"" + url1
-				+ "\" onclick='parent.sourceFileList.location.href=\"" + url2
-				+ "\"'>" + generatePackageName(packageData) + "</a></td>");
-		ret.append("<td class=\"value\">" + packageData.getNumberOfChildren()
-				+ "</td>");
-		ret.append(generateTableColumnsFromData(packageData, ccn));
-		ret.append("</tr>");
-		return ret.toString();
-	}
-
-	private String generateTableRowsForSourceFile(SourceFileData sourceFileData)
-	{
-		StringBuffer ret = new StringBuffer();
-		String sourceFileName = sourceFileData.getNormalizedName();
-		// TODO: ccn should be calculated per-class, not per-file
-		double ccn = complexity.getCCNForSourceFile(sourceFileData);
-
-		Iterator iter = sourceFileData.getClasses().iterator();
-		while (iter.hasNext())
-		{
-			ClassData classData = (ClassData)iter.next();
-			ret
-					.append(generateTableRowForClass(classData, sourceFileName,
-							ccn));
-		}
-
-		return ret.toString();
-	}
-
-	private String generateTableRowForClass(ClassData classData,
-			String sourceFileName, double ccn)
-	{
-		StringBuffer ret = new StringBuffer();
-
-		ret.append("  <tr>");
-		// TODO: URL should jump straight to the class (only for inner classes?)
-		ret.append("<td><a href=\"" + sourceFileName
-				+ ".html\">" + classData.getBaseName() + "</a></td>");
-		ret.append(generateTableColumnsFromData(classData, ccn));
-		ret.append("</tr>\n");
-		return ret.toString();
-	}
-
-	/**
-	 * Return a string containing three HTML table cells.  The first
-	 * cell contains a graph showing the line coverage, the second
-	 * cell contains a graph showing the branch coverage, and the
-	 * third cell contains the code complexity.
-	 *
-	 * @param ccn The code complexity to display.  This should be greater
-	 *        than 1.
-	 * @return A string containing the HTML for three table cells.
-	 */
-	private static String generateTableColumnsFromData(CoverageData coverageData,
-			double ccn)
-	{
-		int numLinesCovered = coverageData.getNumberOfCoveredLines();
-		int numLinesValid = coverageData.getNumberOfValidLines();
-		int numBranchesCovered = coverageData.getNumberOfCoveredBranches();
-		int numBranchesValid = coverageData.getNumberOfValidBranches();
-
-		// The "hidden" CSS class is used below to write the ccn without
-		// any formatting so that the table column can be sorted correctly
-		return "<td>" + generatePercentResult(numLinesCovered, numLinesValid)
-				+"</td><td>"
-				+ generatePercentResult(numBranchesCovered, numBranchesValid)
-				+ "</td><td class=\"value\"><span class=\"hidden\">"
-				+ ccn + ";</span>" + getDoubleValue(ccn) + "</td>";
-	}
-
-	/**
-	 * This is crazy complicated, and took me a while to figure out,
-	 * but it works.  It creates a dandy little percentage meter, from
-	 * 0 to 100.
-	 * @param dividend The number of covered lines or branches.
-	 * @param divisor  The number of valid lines or branches.
-	 * @return A percentage meter.
-	 */
-	private static String generatePercentResult(int dividend, int divisor)
-	{
-		StringBuffer sb = new StringBuffer();
-
-		sb.append("<table cellpadding=\"0px\" cellspacing=\"0px\" class=\"percentgraph\"><tr class=\"percentgraph\"><td align=\"right\" class=\"percentgraph\" width=\"40\">");
-		if (divisor > 0)
-			sb.append(getPercentValue((double)dividend / divisor));
-		else
-			sb.append(generateHelpURL(
-					"N/A",
-					"Line coverage and branch coverage will appear as \"Not Applicable\" when Cobertura can not find line number information in the .class file.  This happens for stub and skeleton classes, interfaces, or when the class was not compiled with \"debug=true.\""));
-		sb.append("</td><td class=\"percentgraph\"><div class=\"percentgraph\">");
-		if (divisor > 0)
-		{
-			sb.append("<div class=\"greenbar\" style=\"width:"
-					+ (dividend * 100 / divisor) + "px\">");
-			sb.append("<span class=\"text\">");
-			sb.append(dividend);
-			sb.append("/");
-			sb.append(divisor);
-		}
-		else
-		{
-			sb.append("<div class=\"na\" style=\"width:100px\">");
-			sb.append("<span class=\"text\">");
-			sb.append(generateHelpURL(
-					"N/A",
-					"Line coverage and branch coverage will appear as \"Not Applicable\" when Cobertura can not find line number information in the .class file.  This happens for stub and skeleton classes, interfaces, or when the class was not compiled with \"debug=true.\""));
-		}
-		sb.append("</span></div></div></td></tr></table>");
-
-		return sb.toString();
-	}
-
-	private static String getDoubleValue(double value)
-	{
-		return new DecimalFormat().format(value);
-	}
-
-	private static String getPercentValue(double value)
-	{
-		return StringUtil.getPercentValue(value);
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2006 Naoki Iwami
+ * Copyright (C) 2009 Charlie Squires
+ * Copyright (C) 2009 John Lewis
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.html;
+
+import net.sourceforge.cobertura.coveragedata.*;
+import net.sourceforge.cobertura.reporting.ComplexityCalculator;
+import net.sourceforge.cobertura.reporting.html.files.CopyFiles;
+import net.sourceforge.cobertura.util.*;
+
+import java.io.*;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.util.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HTMLReport {
+
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(HTMLReport.class);
+
+	private File destinationDir;
+
+	private FileFinder finder;
+
+	private ComplexityCalculator complexity;
+
+	private ProjectData projectData;
+
+	private String encoding;
+
+	/**
+	 * Create a coverage report
+	 *
+	 * @param encoding
+	 */
+	public HTMLReport(ProjectData projectData, File outputDir,
+			FileFinder finder, ComplexityCalculator complexity, String encoding)
+			throws Exception {
+		this.destinationDir = outputDir;
+		this.finder = finder;
+		this.complexity = complexity;
+		this.projectData = projectData;
+		this.encoding = encoding;
+
+		CopyFiles.copy(outputDir);
+		generatePackageList();
+		generateSourceFileLists();
+		generateOverviews();
+		generateSourceFiles();
+	}
+
+	private String generatePackageName(PackageData packageData) {
+		if (packageData.getName().equals(""))
+			return "(default)";
+		return packageData.getName();
+	}
+
+	private void generatePackageList() throws IOException {
+		File file = new File(destinationDir, "frame-packages.html");
+		PrintWriter out = null;
+
+		try {
+			out = IOUtil.getPrintWriter(file);
+
+			out
+					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
+			out
+					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+
+			out
+					.println("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">");
+			out.println("<head>");
+			out
+					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
+			out.println("<title>Coverage Report</title>");
+			out
+					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\" />");
+			out.println("</head>");
+			out.println("<body>");
+			out.println("<h5>Packages</h5>");
+			out.println("<table width=\"100%\">");
+			out.println("<tr>");
+			out
+					.println("<td nowrap=\"nowrap\"><a href=\"frame-summary.html\" onclick='parent.sourceFileList.location.href=\"frame-sourcefiles.html\"' target=\"summary\">All</a></td>");
+			out.println("</tr>");
+
+			Iterator iter = projectData.getPackages().iterator();
+			while (iter.hasNext()) {
+				PackageData packageData = (PackageData) iter.next();
+				String url1 = "frame-summary-" + packageData.getName()
+						+ ".html";
+				String url2 = "frame-sourcefiles-" + packageData.getName()
+						+ ".html";
+				out.println("<tr>");
+				out.println("<td nowrap=\"nowrap\"><a href=\"" + url1
+						+ "\" onclick='parent.sourceFileList.location.href=\""
+						+ url2 + "\"' target=\"summary\">"
+						+ generatePackageName(packageData) + "</a></td>");
+				out.println("</tr>");
+			}
+			out.println("</table>");
+			out.println("</body>");
+			out.println("</html>");
+		} finally {
+			if (out != null) {
+				out.close();
+			}
+		}
+	}
+
+	private void generateSourceFileLists() throws IOException {
+		generateSourceFileList(null);
+		Iterator iter = projectData.getPackages().iterator();
+		while (iter.hasNext()) {
+			PackageData packageData = (PackageData) iter.next();
+			generateSourceFileList(packageData);
+		}
+	}
+
+	private void generateSourceFileList(PackageData packageData)
+			throws IOException {
+		String filename;
+		Collection sourceFiles;
+		if (packageData == null) {
+			filename = "frame-sourcefiles.html";
+			sourceFiles = projectData.getSourceFiles();
+		} else {
+			filename = "frame-sourcefiles-" + packageData.getName() + ".html";
+			sourceFiles = packageData.getSourceFiles();
+		}
+
+		// sourceFiles may be sorted, but if so it's sorted by
+		// the full path to the file, and we only want to sort
+		// based on the file's basename.
+		Vector sortedSourceFiles = new Vector();
+		sortedSourceFiles.addAll(sourceFiles);
+		Collections.sort(sortedSourceFiles,
+				new SourceFileDataBaseNameComparator());
+
+		File file = new File(destinationDir, filename);
+		PrintWriter out = null;
+		try {
+			out = IOUtil.getPrintWriter(file);
+
+			out
+					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
+			out
+					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+
+			out.println("<html>");
+			out.println("<head>");
+			out
+					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>");
+			out.println("<title>Coverage Report Classes</title>");
+			out
+					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\"/>");
+			out.println("</head>");
+			out.println("<body>");
+			out.println("<h5>");
+			out.println(packageData == null
+					? "All Packages"
+					: generatePackageName(packageData));
+			out.println("</h5>");
+			out.println("<div class=\"separator\"> </div>");
+			out.println("<h5>Classes</h5>");
+			if (!sortedSourceFiles.isEmpty()) {
+				out.println("<table width=\"100%\">");
+				out.println("<tbody>");
+
+				for (Iterator iter = sortedSourceFiles.iterator(); iter
+						.hasNext();) {
+					SourceFileData sourceFileData = (SourceFileData) iter
+							.next();
+					out.println("<tr>");
+					String percentCovered;
+					if (sourceFileData.getNumberOfValidLines() > 0)
+						percentCovered = getPercentValue(sourceFileData
+								.getLineCoverageRate());
+					else
+						percentCovered = "N/A";
+					out
+							.println("<td nowrap=\"nowrap\"><a target=\"summary\" href=\""
+									+ sourceFileData.getNormalizedName()
+									+ ".html\">"
+									+ sourceFileData.getBaseName()
+									+ "</a> <i>("
+									+ percentCovered
+									+ ")</i></td>");
+					out.println("</tr>");
+				}
+				out.println("</tbody>");
+				out.println("</table>");
+			}
+
+			out.println("</body>");
+			out.println("</html>");
+		} finally {
+			if (out != null) {
+				out.close();
+			}
+		}
+	}
+
+	private void generateOverviews() throws IOException {
+		generateOverview(null);
+		Iterator iter = projectData.getPackages().iterator();
+		while (iter.hasNext()) {
+			PackageData packageData = (PackageData) iter.next();
+			generateOverview(packageData);
+		}
+	}
+
+	private void generateOverview(PackageData packageData) throws IOException {
+		Iterator iter;
+
+		String filename;
+		if (packageData == null) {
+			filename = "frame-summary.html";
+		} else {
+			filename = "frame-summary-" + packageData.getName() + ".html";
+		}
+		File file = new File(destinationDir, filename);
+		PrintWriter out = null;
+
+		try {
+			out = IOUtil.getPrintWriter(file);;
+
+			out
+					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
+			out
+					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+
+			out.println("<html>");
+			out.println("<head>");
+			out
+					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>");
+			out.println("<title>Coverage Report</title>");
+			out
+					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\"/>");
+			out
+					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/sortabletable.css\"/>");
+			out
+					.println("<script type=\"text/javascript\" src=\"js/popup.js\"></script>");
+			out
+					.println("<script type=\"text/javascript\" src=\"js/sortabletable.js\"></script>");
+			out
+					.println("<script type=\"text/javascript\" src=\"js/customsorttypes.js\"></script>");
+			out.println("</head>");
+			out.println("<body>");
+
+			out.print("<h5>Coverage Report - ");
+			out.print(packageData == null
+					? "All Packages"
+					: generatePackageName(packageData));
+			out.println("</h5>");
+			out.println("<div class=\"separator\"> </div>");
+			out.println("<table class=\"report\" id=\"packageResults\">");
+			out.println(generateTableHeader("Package", true));
+			out.println("<tbody>");
+
+			SortedSet packages;
+			if (packageData == null) {
+				// Output a summary line for all packages
+				out.println(generateTableRowForTotal());
+
+				// Get packages
+				packages = projectData.getPackages();
+			} else {
+				// Get subpackages
+				packages = projectData.getSubPackages(packageData.getName());
+			}
+
+			// Output a line for each package or subpackage
+			iter = packages.iterator();
+			while (iter.hasNext()) {
+				PackageData subPackageData = (PackageData) iter.next();
+				out.println(generateTableRowForPackage(subPackageData));
+			}
+
+			out.println("</tbody>");
+			out.println("</table>");
+			out.println("<script type=\"text/javascript\">");
+			out
+					.println("var packageTable = new SortableTable(document.getElementById(\"packageResults\"),");
+			out
+					.println("    [\"String\", \"Number\", \"Percentage\", \"Percentage\", \"FormattedNumber\"]);");
+			out.println("packageTable.sort(0);");
+			out.println("</script>");
+
+			// Get the list of source files in this package
+			Collection sourceFiles;
+			if (packageData == null) {
+				PackageData defaultPackage = (PackageData) projectData
+						.getChild("");
+				if (defaultPackage != null) {
+					sourceFiles = defaultPackage.getSourceFiles();
+				} else {
+					sourceFiles = new TreeSet();
+				}
+			} else {
+				sourceFiles = packageData.getSourceFiles();
+			}
+
+			// Output a line for each source file
+			if (sourceFiles.size() > 0) {
+				out.println("<div class=\"separator\"> </div>");
+				out.println("<table class=\"report\" id=\"classResults\">");
+				out.println(generateTableHeader("Classes in this Package",
+						false));
+				out.println("<tbody>");
+
+				iter = sourceFiles.iterator();
+				while (iter.hasNext()) {
+					SourceFileData sourceFileData = (SourceFileData) iter
+							.next();
+					out.println(generateTableRowsForSourceFile(sourceFileData));
+				}
+
+				out.println("</tbody>");
+				out.println("</table>");
+				out.println("<script type=\"text/javascript\">");
+				out
+						.println("var classTable = new SortableTable(document.getElementById(\"classResults\"),");
+				out
+						.println("    [\"String\", \"Percentage\", \"Percentage\", \"FormattedNumber\"]);");
+				out.println("classTable.sort(0);");
+				out.println("</script>");
+			}
+
+			out.println(generateFooter());
+
+			out.println("</body>");
+			out.println("</html>");
+		} finally {
+			if (out != null) {
+				out.close();
+			}
+		}
+	}
+
+	private void generateSourceFiles() {
+		Iterator iter = projectData.getSourceFiles().iterator();
+		while (iter.hasNext()) {
+			SourceFileData sourceFileData = (SourceFileData) iter.next();
+			try {
+				generateSourceFile(sourceFileData);
+			} catch (IOException e) {
+				LOGGER.info("Could not generate HTML file for source file "
+						+ sourceFileData.getName() + ": "
+						+ e.getLocalizedMessage());
+			}
+		}
+	}
+
+	private void generateSourceFile(SourceFileData sourceFileData)
+			throws IOException {
+		if (!sourceFileData.containsInstrumentationInfo()) {
+			LOGGER.info("Data file does not contain instrumentation "
+					+ "information for the file " + sourceFileData.getName()
+					+ ".  Ensure this class was instrumented, and this "
+					+ "data file contains the instrumentation information.");
+		}
+
+		String filename = sourceFileData.getNormalizedName() + ".html";
+		File file = new File(destinationDir, filename);
+		PrintWriter out = null;
+
+		try {
+			out = IOUtil.getPrintWriter(file);
+
+			out
+					.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"");
+			out
+					.println("           \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+
+			out.println("<html>");
+			out.println("<head>");
+			out
+					.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>");
+			out.println("<title>Coverage Report</title>");
+			out
+					.println("<link title=\"Style\" type=\"text/css\" rel=\"stylesheet\" href=\"css/main.css\"/>");
+			out
+					.println("<script type=\"text/javascript\" src=\"js/popup.js\"></script>");
+			out.println("</head>");
+			out.println("<body>");
+			out.print("<h5>Coverage Report - ");
+			String classPackageName = sourceFileData.getPackageName();
+			if ((classPackageName != null) && classPackageName.length() > 0) {
+				out.print(classPackageName + ".");
+			}
+			out.print(sourceFileData.getBaseName());
+			out.println("</h5>");
+
+			// Output the coverage summary for this class
+			out.println("<div class=\"separator\"> </div>");
+			out.println("<table class=\"report\">");
+			out.println(generateTableHeader("Classes in this File", false));
+			out.println(generateTableRowsForSourceFile(sourceFileData));
+			out.println("</table>");
+
+			// Output the coverage summary for methods in this class
+			// TODO
+
+			// Output this class's source code with syntax and coverage highlighting
+			out.println("<div class=\"separator\"> </div>");
+			out.println(generateHtmlizedJavaSource(sourceFileData));
+
+			out.println(generateFooter());
+
+			out.println("</body>");
+			out.println("</html>");
+		} finally {
+			if (out != null) {
+				out.close();
+			}
+		}
+	}
+
+	private String generateBranchInfo(LineData lineData, String content) {
+		boolean hasBranch = (lineData != null) ? lineData.hasBranch() : false;
+		if (hasBranch) {
+			StringBuffer ret = new StringBuffer();
+			ret.append("<a title=\"Line ").append(lineData.getLineNumber())
+					.append(": Conditional coverage ").append(
+							lineData.getConditionCoverage());
+			if (lineData.getConditionSize() > 1) {
+				ret.append(" [each condition: ");
+				for (int i = 0; i < lineData.getConditionSize(); i++) {
+					if (i > 0)
+						ret.append(", ");
+					ret.append(lineData.getConditionCoverage(i));
+				}
+				ret.append("]");
+			}
+			ret.append(".\">").append(content).append("</a>");
+			return ret.toString();
+		} else {
+			return content;
+		}
+	}
+
+	private String generateHtmlizedJavaSource(SourceFileData sourceFileData) {
+		Source source = finder.getSource(sourceFileData.getName());
+
+		if (source == null) {
+			return "<p>Unable to locate " + sourceFileData.getName()
+					+ ".  Have you specified the source directory?</p>";
+		}
+
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new InputStreamReader(source
+					.getInputStream(), encoding));
+		} catch (UnsupportedEncodingException e) {
+			return "<p>Unable to open " + source.getOriginDesc()
+					+ ": The encoding '" + encoding
+					+ "' is not supported by your JVM.</p>";
+		} catch (Throwable t) {
+			return "<p>Unable to open " + source.getOriginDesc() + ": "
+					+ t.getLocalizedMessage() + "</p>";
+		}
+
+		StringBuffer ret = new StringBuffer();
+		ret
+				.append("<table cellspacing=\"0\" cellpadding=\"0\" class=\"src\">\n");
+		try {
+			String lineStr;
+			JavaToHtml javaToHtml = new JavaToHtml();
+			int lineNumber = 1;
+			while ((lineStr = br.readLine()) != null) {
+				ret.append("<tr>");
+				if (sourceFileData.isValidSourceLineNumber(lineNumber)) {
+					LineData lineData = sourceFileData
+							.getLineCoverage(lineNumber);
+					ret.append("  <td class=\"numLineCover\"> "
+							+ lineNumber + "</td>");
+					if ((lineData != null) && (lineData.isCovered())) {
+						ret.append("  <td class=\"nbHitsCovered\">"
+								+ generateBranchInfo(lineData, " "
+										+ ((lineData != null) ? lineData
+												.getHits() : 0)) + "</td>");
+						ret
+								.append("  <td class=\"src\"><pre class=\"src\"> "
+										+ generateBranchInfo(lineData,
+												javaToHtml.process(lineStr))
+										+ "</pre></td>");
+					} else {
+						ret.append("  <td class=\"nbHitsUncovered\">"
+								+ generateBranchInfo(lineData, " "
+										+ ((lineData != null) ? lineData
+												.getHits() : 0)) + "</td>");
+						ret
+								.append("  <td class=\"src\"><pre class=\"src\"><span class=\"srcUncovered\"> "
+										+ generateBranchInfo(lineData,
+												javaToHtml.process(lineStr))
+										+ "</span></pre></td>");
+					}
+				} else {
+					ret.append("  <td class=\"numLine\"> " + lineNumber
+							+ "</td>");
+					ret.append("  <td class=\"nbHits\"> </td>\n");
+					ret.append("  <td class=\"src\"><pre class=\"src\"> "
+							+ javaToHtml.process(lineStr) + "</pre></td>");
+				}
+				ret.append("</tr>\n");
+				lineNumber++;
+			}
+		} catch (IOException e) {
+			ret.append("<tr><td>Error reading " + source.getOriginDesc() + ": "
+					+ e.getLocalizedMessage() + "</td></tr>\n");
+		} finally {
+			try {
+				br.close();
+				source.close();
+			} catch (IOException e) {
+			}
+		}
+
+		ret.append("</table>\n");
+
+		return ret.toString();
+	}
+
+	private static String generateFooter() {
+		return "<div class=\"footer\">Report generated by "
+				+ "<a href=\"http://cobertura.sourceforge.net/\" target=\"_top\">Cobertura</a> "
+				+ Header.version() + " on "
+				+ DateFormat.getInstance().format(new Date()) + ".</div>";
+	}
+
+	private static String generateTableHeader(String title,
+			boolean showColumnForNumberOfClasses) {
+		StringBuffer ret = new StringBuffer();
+		ret.append("<thead>");
+		ret.append("<tr>");
+		ret.append("  <td class=\"heading\">" + title + "</td>");
+		if (showColumnForNumberOfClasses) {
+			ret.append("  <td class=\"heading\"># Classes</td>");
+		}
+		ret.append("  <td class=\"heading\">"
+				+ generateHelpURL("Line Coverage",
+						"The percent of lines executed by this test run.")
+				+ "</td>");
+		ret.append("  <td class=\"heading\">"
+				+ generateHelpURL("Branch Coverage",
+						"The percent of branches executed by this test run.")
+				+ "</td>");
+		ret
+				.append("  <td class=\"heading\">"
+						+ generateHelpURL(
+								"Complexity",
+								"Average McCabe's cyclomatic code complexity for all methods.  This is basically a count of the number of different code paths in a method (incremented by 1 for each if statement, while loop, etc.)")
+						+ "</td>");
+		ret.append("</tr>");
+		ret.append("</thead>");
+		return ret.toString();
+	}
+
+	private static String generateHelpURL(String text, String description) {
+		StringBuffer ret = new StringBuffer();
+		boolean popupTooltips = false;
+		if (popupTooltips) {
+			ret
+					.append("<a class=\"hastooltip\" href=\"help.html\" onclick=\"popupwindow('help.html'); return false;\">");
+			ret.append(text);
+			ret.append("<span>" + description + "</span>");
+			ret.append("</a>");
+		} else {
+			ret
+					.append("<a class=\"dfn\" href=\"help.html\" onclick=\"popupwindow('help.html'); return false;\">");
+			ret.append(text);
+			ret.append("</a>");
+		}
+		return ret.toString();
+	}
+
+	private String generateTableRowForTotal() {
+		StringBuffer ret = new StringBuffer();
+		double ccn = complexity.getCCNForProject(projectData);
+
+		ret.append("  <tr>");
+		ret.append("<td><b>All Packages</b></td>");
+		ret.append("<td class=\"value\">" + projectData.getNumberOfClasses()
+				+ "</td>");
+		ret.append(generateTableColumnsFromData(projectData, ccn));
+		ret.append("</tr>");
+		return ret.toString();
+	}
+
+	private String generateTableRowForPackage(PackageData packageData) {
+		StringBuffer ret = new StringBuffer();
+		String url1 = "frame-summary-" + packageData.getName() + ".html";
+		String url2 = "frame-sourcefiles-" + packageData.getName() + ".html";
+		double ccn = complexity.getCCNForPackage(packageData);
+
+		ret.append("  <tr>");
+		ret.append("<td><a href=\"" + url1
+				+ "\" onclick='parent.sourceFileList.location.href=\"" + url2
+				+ "\"'>" + generatePackageName(packageData) + "</a></td>");
+		ret.append("<td class=\"value\">" + packageData.getNumberOfChildren()
+				+ "</td>");
+		ret.append(generateTableColumnsFromData(packageData, ccn));
+		ret.append("</tr>");
+		return ret.toString();
+	}
+
+	private String generateTableRowsForSourceFile(SourceFileData sourceFileData) {
+		StringBuffer ret = new StringBuffer();
+		String sourceFileName = sourceFileData.getNormalizedName();
+		// TODO: ccn should be calculated per-class, not per-file
+		double ccn = complexity.getCCNForSourceFile(sourceFileData);
+
+		Iterator iter = sourceFileData.getClasses().iterator();
+		while (iter.hasNext()) {
+			ClassData classData = (ClassData) iter.next();
+			ret
+					.append(generateTableRowForClass(classData, sourceFileName,
+							ccn));
+		}
+
+		return ret.toString();
+	}
+
+	private String generateTableRowForClass(ClassData classData,
+			String sourceFileName, double ccn) {
+		StringBuffer ret = new StringBuffer();
+
+		ret.append("  <tr>");
+		// TODO: URL should jump straight to the class (only for inner classes?)
+		ret.append("<td><a href=\"" + sourceFileName + ".html\">"
+				+ classData.getBaseName() + "</a></td>");
+		ret.append(generateTableColumnsFromData(classData, ccn));
+		ret.append("</tr>\n");
+		return ret.toString();
+	}
+
+	/**
+	 * Return a string containing three HTML table cells.  The first
+	 * cell contains a graph showing the line coverage, the second
+	 * cell contains a graph showing the branch coverage, and the
+	 * third cell contains the code complexity.
+	 *
+	 * @param ccn The code complexity to display.  This should be greater
+	 *            than 1.
+	 *
+	 * @return A string containing the HTML for three table cells.
+	 */
+	private static String generateTableColumnsFromData(
+			CoverageData coverageData, double ccn) {
+		int numLinesCovered = coverageData.getNumberOfCoveredLines();
+		int numLinesValid = coverageData.getNumberOfValidLines();
+		int numBranchesCovered = coverageData.getNumberOfCoveredBranches();
+		int numBranchesValid = coverageData.getNumberOfValidBranches();
+
+		// The "hidden" CSS class is used below to write the ccn without
+		// any formatting so that the table column can be sorted correctly
+		return "<td>" + generatePercentResult(numLinesCovered, numLinesValid)
+				+ "</td><td>"
+				+ generatePercentResult(numBranchesCovered, numBranchesValid)
+				+ "</td><td class=\"value\"><span class=\"hidden\">" + ccn
+				+ ";</span>" + getDoubleValue(ccn) + "</td>";
+	}
+
+	/**
+	 * This is crazy complicated, and took me a while to figure out,
+	 * but it works.  It creates a dandy little percentage meter, from
+	 * 0 to 100.
+	 *
+	 * @param dividend The number of covered lines or branches.
+	 * @param divisor  The number of valid lines or branches.
+	 *
+	 * @return A percentage meter.
+	 */
+	private static String generatePercentResult(int dividend, int divisor) {
+		StringBuffer sb = new StringBuffer();
+
+		sb
+				.append("<table cellpadding=\"0px\" cellspacing=\"0px\" class=\"percentgraph\"><tr class=\"percentgraph\"><td align=\"right\" class=\"percentgraph\" width=\"40\">");
+		if (divisor > 0)
+			sb.append(getPercentValue((double) dividend / divisor));
+		else
+			sb
+					.append(generateHelpURL(
+							"N/A",
+							"Line coverage and branch coverage will appear as \"Not Applicable\" when Cobertura can not find line number information in the .class file.  This happens for stub and skeleton classes, interfaces, or when the class was not compiled with \"debug=true.\""));
+		sb
+				.append("</td><td class=\"percentgraph\"><div class=\"percentgraph\">");
+		if (divisor > 0) {
+			sb.append("<div class=\"greenbar\" style=\"width:"
+					+ (dividend * 100 / divisor) + "px\">");
+			sb.append("<span class=\"text\">");
+			sb.append(dividend);
+			sb.append("/");
+			sb.append(divisor);
+		} else {
+			sb.append("<div class=\"na\" style=\"width:100px\">");
+			sb.append("<span class=\"text\">");
+			sb
+					.append(generateHelpURL(
+							"N/A",
+							"Line coverage and branch coverage will appear as \"Not Applicable\" when Cobertura can not find line number information in the .class file.  This happens for stub and skeleton classes, interfaces, or when the class was not compiled with \"debug=true.\""));
+		}
+		sb.append("</span></div></div></td></tr></table>");
+
+		return sb.toString();
+	}
+
+	private static String getDoubleValue(double value) {
+		return new DecimalFormat().format(value);
+	}
+
+	private static String getPercentValue(double value) {
+		return StringUtil.getPercentValue(value);
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/HTMLReportFormatStrategy.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/HTMLReportFormatStrategy.java
new file mode 100644
index 0000000..c712015
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/HTMLReportFormatStrategy.java
@@ -0,0 +1,29 @@
+package net.sourceforge.cobertura.reporting.html;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+import net.sourceforge.cobertura.reporting.NativeReport;
+import net.sourceforge.cobertura.reporting.Report;
+import net.sourceforge.cobertura.reporting.ReportFormatStrategy;
+
+public class HTMLReportFormatStrategy implements ReportFormatStrategy {
+	private static final Logger log = LoggerFactory
+			.getLogger(HTMLReportFormatStrategy.class);
+
+	public void save(Report report) {
+		NativeReport nativeReport = (NativeReport) report;
+		try {
+			new HTMLReport(nativeReport.getProjectData(), nativeReport
+					.getDestinationDir(), nativeReport.getFinder(),
+					nativeReport.getComplexity(), nativeReport.getEncoding());
+		} catch (Exception e) {
+			log.error("Saving HTML report failed.", e);
+		}
+	}
+
+	public ReportFormat getName() {
+		return ReportFormat.HTML;
+	}
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/JavaToHtml.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/JavaToHtml.java
similarity index 74%
rename from src/net/sourceforge/cobertura/reporting/html/JavaToHtml.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/JavaToHtml.java
index d0ed9ee..366c5f1 100644
--- a/src/net/sourceforge/cobertura/reporting/html/JavaToHtml.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/JavaToHtml.java
@@ -1,351 +1,302 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.html;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-
-public class JavaToHtml
-{
-
-	// Could use a J2SE 5.0 enum instead of this.
-	public abstract static class State
-	{
-		public final static int COMMENT_JAVADOC = 0;
-		public final static int COMMENT_MULTI = 1;
-		public final static int COMMENT_SINGLE = 2;
-		public final static int DEFAULT = 3;
-		public final static int KEYWORD = 4;
-		public final static int IMPORT_NAME = 5;
-		public final static int PACKAGE_NAME = 6;
-		public final static int QUOTE_DOUBLE = 8;
-		public final static int QUOTE_SINGLE = 9;
-	}
-
-	// TODO: Set a style for JavaDoc tags
-	//private static final Collection javaJavaDocTags;
-	private static final Collection javaKeywords;
-	private static final Collection javaPrimitiveLiterals;
-	private static final Collection javaPrimitiveTypes;
-
-	static
-	{
-		// TODO: Probably need to add anything new in J2SE 5.0
-		//final String javaJavaDocTagsArray[] = { "see", "author", "version", "param", "return", "exception",
-		//		"deprecated", "throws", "link", "since", "serial", "serialField", "serialData", "beaninfo" };
-		final String[] javaKeywordsArray = { "abstract", "assert", "break",
-				"case", "catch", "class", "const", "continue", "default",
-				"do", "else", "extends", "final", "finally", "for", "goto",
-				"if", "interface", "implements", "import", "instanceof",
-				"native", "new", "package", "private", "protected", "public",
-				"return", "static", "strictfp", "super", "switch",
-				"synchronized", "this", "throw", "throws", "transient",
-				"try", "volatile", "while" };
-		final String javaPrimitiveTypesArray[] = { "boolean", "byte", "char",
-				"double", "float", "int", "long", "short", "void" };
-		final String javaPrimitiveLiteralsArray[] = { "false", "null", "true" };
-
-		//javaJavaDocTags = new HashSet(Arrays.asList(javaJavaDocTagsArray));
-		javaKeywords = new HashSet(Arrays.asList(javaKeywordsArray));
-		javaPrimitiveTypes = new HashSet(Arrays
-				.asList(javaPrimitiveTypesArray));
-		javaPrimitiveLiterals = new HashSet(Arrays
-				.asList(javaPrimitiveLiteralsArray));
-	}
-
-	private int state = State.DEFAULT;
-
-	private static String escapeEntity(final char character)
-	{
-		if (character == '&')
-			return "&";
-		else if (character == '<')
-			return "<";
-		else if (character == '>')
-			return ">";
-		else if (character == '\t')
-			return "        ";
-		else
-			return new Character(character).toString();
-	}
-
-	/**
-	 * Add HTML colorization to a block of Java code.
-	 *
-	 * @param text The block of Java code.
-	 * @return The same block of Java code with added span tags.
-	 *         Newlines are preserved.
-	 */
-	public String process(final String text)
-	{
-		if (text == null)
-			throw new IllegalArgumentException("\"text\" can not be null.");
-
-		StringBuffer ret = new StringBuffer();
-
-		// This look is really complicated because it preserves all
-		// combinations of \r, \n, \r\n, and \n\r
-		int begin, end, nextCR;
-		begin = 0;
-		end = text.indexOf('\n', begin);
-		nextCR = text.indexOf('\r', begin);
-		if ((nextCR != -1) && ((end == -1) || (nextCR < end)))
-			end = nextCR;
-		while (end != -1)
-		{
-			ret.append(processLine(text.substring(begin, end)) + "<br/>");
-
-			if ((end + 1 < text.length())
-					&& ((text.charAt(end + 1) == '\n') || (text
-							.charAt(end + 1) == '\r')))
-			{
-				ret.append(text.substring(end, end + 1));
-				begin = end + 2;
-			}
-			else
-			{
-				ret.append(text.charAt(end));
-				begin = end + 1;
-			}
-
-			end = text.indexOf('\n', begin);
-			nextCR = text.indexOf('\r', begin);
-			if ((nextCR != -1) && ((end == -1) || (nextCR < end)))
-				end = nextCR;
-		}
-		ret.append(processLine(text.substring(begin)));
-
-		return ret.toString();
-	}
-
-	/**
-	 * Add HTML colorization to a single line of Java code.
-	 *
-	 * @param line One line of Java code.
-	 * @return The same line of Java code with added span tags.
-	 */
-	private String processLine(final String line)
-	{
-		if (line == null)
-			throw new IllegalArgumentException("\"line\" can not be null.");
-		if ((line.indexOf('\n') != -1) || (line.indexOf('\r') != -1))
-			throw new IllegalArgumentException(
-					"\"line\" can not contain newline or carriage return characters.");
-
-		StringBuffer ret = new StringBuffer();
-		int currentIndex = 0;
-
-		while (currentIndex != line.length())
-		{
-			if (state == State.DEFAULT)
-			{
-				if ((currentIndex + 2 < line.length())
-						&& line.substring(currentIndex, currentIndex + 3)
-								.equals("/**"))
-				{
-					state = State.COMMENT_JAVADOC;
-
-				}
-				else if ((currentIndex + 1 < line.length())
-						&& line.substring(currentIndex, currentIndex + 2)
-								.equals("/*"))
-				{
-					state = State.COMMENT_MULTI;
-
-				}
-				else if ((currentIndex + 1 < line.length())
-						&& (line.substring(currentIndex, currentIndex + 2)
-								.equals("//")))
-				{
-					state = State.COMMENT_SINGLE;
-
-				}
-				else if (Character.isJavaIdentifierStart(line
-						.charAt(currentIndex)))
-				{
-					state = State.KEYWORD;
-
-				}
-				else if (line.charAt(currentIndex) == '\'')
-				{
-					state = State.QUOTE_SINGLE;
-
-				}
-				else if (line.charAt(currentIndex) == '"')
-				{
-					state = State.QUOTE_DOUBLE;
-
-				}
-				else
-				{
-					// Default: No highlighting.
-					ret.append(escapeEntity(line.charAt(currentIndex++)));
-				}
-			} // End of State.DEFAULT
-
-			else if ((state == State.COMMENT_MULTI)
-					|| (state == State.COMMENT_JAVADOC))
-			{
-				// Print everything from the current character until the
-				// closing */  No exceptions.
-				ret.append("<span class=\"comment\">");
-				while ((currentIndex != line.length())
-						&& !((currentIndex + 1 < line.length()) && (line
-								.substring(currentIndex, currentIndex + 2)
-								.equals("*/"))))
-				{
-					ret.append(escapeEntity(line.charAt(currentIndex++)));
-				}
-				if (currentIndex == line.length())
-				{
-					ret.append("</span>");
-				}
-				else
-				{
-					ret.append("*/</span>");
-					state = State.DEFAULT;
-					currentIndex += 2;
-				}
-			} // End of State.COMMENT_MULTI
-
-			else if (state == State.COMMENT_SINGLE)
-			{
-				// Print everything from the current character until the 
-				// end of the line
-				ret.append("<span class=\"comment\">");
-				while (currentIndex != line.length())
-				{
-					ret.append(escapeEntity(line.charAt(currentIndex++)));
-				}
-				ret.append("</span>");
-				state = State.DEFAULT;
-
-			} // End of State.COMMENT_SINGLE
-
-			else if (state == State.KEYWORD)
-			{
-				StringBuffer tmp = new StringBuffer();
-				do
-				{
-					tmp.append(line.charAt(currentIndex++));
-				} while ((currentIndex != line.length())
-						&& (Character.isJavaIdentifierPart(line
-								.charAt(currentIndex))));
-				if (javaKeywords.contains(tmp.toString()))
-					ret.append("<span class=\"keyword\">" + tmp + "</span>");
-				else if (javaPrimitiveLiterals.contains(tmp.toString()))
-					ret.append("<span class=\"keyword\">" + tmp + "</span>");
-				else if (javaPrimitiveTypes.contains(tmp.toString()))
-					ret.append("<span class=\"keyword\">" + tmp + "</span>");
-				else
-					ret.append(tmp);
-				if (tmp.toString().equals("import"))
-					state = State.IMPORT_NAME;
-				else if (tmp.toString().equals("package"))
-					state = State.PACKAGE_NAME;
-				else
-					state = State.DEFAULT;
-			} // End of State.KEYWORD
-
-			else if (state == State.IMPORT_NAME)
-			{
-				ret.append(escapeEntity(line.charAt(currentIndex++)));
-				state = State.DEFAULT;
-			} // End of State.IMPORT_NAME
-
-			else if (state == State.PACKAGE_NAME)
-			{
-				ret.append(escapeEntity(line.charAt(currentIndex++)));
-				state = State.DEFAULT;
-			} // End of State.PACKAGE_NAME
-
-			else if (state == State.QUOTE_DOUBLE)
-			{
-				// Print everything from the current character until the
-				// closing ", checking for \"
-				ret.append("<span class=\"string\">");
-				do
-				{
-					ret.append(escapeEntity(line.charAt(currentIndex++)));
-				} while ((currentIndex != line.length())
-						&& (!(line.charAt(currentIndex) == '"') || ((line
-								.charAt(currentIndex - 1) == '\\') && (line
-								.charAt(currentIndex - 2) != '\\'))));
-				if (currentIndex == line.length())
-				{
-					ret.append("</span>");
-				}
-				else
-				{
-					ret.append("\"</span>");
-					state = State.DEFAULT;
-					currentIndex++;
-				}
-			} // End of State.QUOTE_DOUBLE
-
-			else if (state == State.QUOTE_SINGLE)
-			{
-				// Print everything from the current character until the
-				// closing ', checking for \'
-				ret.append("<span class=\"string\">");
-				do
-				{
-					ret.append(escapeEntity(line.charAt(currentIndex++)));
-				} while ((currentIndex != line.length())
-						&& (!(line.charAt(currentIndex) == '\'') || ((line
-								.charAt(currentIndex - 1) == '\\') && (line
-								.charAt(currentIndex - 2) != '\\'))));
-				if (currentIndex == line.length())
-				{
-					ret.append("</span>");
-				}
-				else
-				{
-					ret.append("\'</span>");
-					state = State.DEFAULT;
-					currentIndex++;
-				}
-			} // End of State.QUOTE_SINGLE
-
-			else
-			{
-				// Default: No highlighting.
-				ret.append(escapeEntity(line.charAt(currentIndex++)));
-			} // End of unknown state
-		}
-
-		return ret.toString();
-	}
-
-	/**
-	 * Reset the state of this Java parser.  Call this if you have
-	 * been parsing one Java file and you want to begin parsing
-	 * another Java file.
-	 *
-	 */
-	public void reset()
-	{
-		state = State.DEFAULT;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.html;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+
+public class JavaToHtml {
+
+	// Could use a J2SE 5.0 enum instead of this.
+	public abstract static class State {
+		public final static int COMMENT_JAVADOC = 0;
+		public final static int COMMENT_MULTI = 1;
+		public final static int COMMENT_SINGLE = 2;
+		public final static int DEFAULT = 3;
+		public final static int KEYWORD = 4;
+		public final static int IMPORT_NAME = 5;
+		public final static int PACKAGE_NAME = 6;
+		public final static int QUOTE_DOUBLE = 8;
+		public final static int QUOTE_SINGLE = 9;
+	}
+
+	// TODO: Set a style for JavaDoc tags
+	//private static final Collection javaJavaDocTags;
+	private static final Collection javaKeywords;
+	private static final Collection javaPrimitiveLiterals;
+	private static final Collection javaPrimitiveTypes;
+
+	static {
+		// TODO: Probably need to add anything new in J2SE 5.0
+		//final String javaJavaDocTagsArray[] = { "see", "author", "version", "param", "return", "exception",
+		//		"deprecated", "throws", "link", "since", "serial", "serialField", "serialData", "beaninfo" };
+		final String[] javaKeywordsArray = {"abstract", "assert", "break",
+				"case", "catch", "class", "const", "continue", "default", "do",
+				"else", "extends", "final", "finally", "for", "goto", "if",
+				"interface", "implements", "import", "instanceof", "native",
+				"new", "package", "private", "protected", "public", "return",
+				"static", "strictfp", "super", "switch", "synchronized",
+				"this", "throw", "throws", "transient", "try", "volatile",
+				"while"};
+		final String javaPrimitiveTypesArray[] = {"boolean", "byte", "char",
+				"double", "float", "int", "long", "short", "void"};
+		final String javaPrimitiveLiteralsArray[] = {"false", "null", "true"};
+
+		//javaJavaDocTags = new HashSet(Arrays.asList(javaJavaDocTagsArray));
+		javaKeywords = new HashSet(Arrays.asList(javaKeywordsArray));
+		javaPrimitiveTypes = new HashSet(Arrays.asList(javaPrimitiveTypesArray));
+		javaPrimitiveLiterals = new HashSet(Arrays
+				.asList(javaPrimitiveLiteralsArray));
+	}
+
+	private int state = State.DEFAULT;
+
+	private static String escapeEntity(final char character) {
+		if (character == '&')
+			return "&";
+		else if (character == '<')
+			return "<";
+		else if (character == '>')
+			return ">";
+		else if (character == '\t')
+			return "        ";
+		else
+			return new Character(character).toString();
+	}
+
+	/**
+	 * Add HTML colorization to a block of Java code.
+	 *
+	 * @param text The block of Java code.
+	 *
+	 * @return The same block of Java code with added span tags.
+	 *         Newlines are preserved.
+	 */
+	public String process(final String text) {
+		if (text == null)
+			throw new IllegalArgumentException("\"text\" can not be null.");
+
+		StringBuffer ret = new StringBuffer();
+
+		// This look is really complicated because it preserves all
+		// combinations of \r, \n, \r\n, and \n\r
+		int begin, end, nextCR;
+		begin = 0;
+		end = text.indexOf('\n', begin);
+		nextCR = text.indexOf('\r', begin);
+		if ((nextCR != -1) && ((end == -1) || (nextCR < end)))
+			end = nextCR;
+		while (end != -1) {
+			ret.append(processLine(text.substring(begin, end)) + "<br/>");
+
+			if ((end + 1 < text.length())
+					&& ((text.charAt(end + 1) == '\n') || (text.charAt(end + 1) == '\r'))) {
+				ret.append(text.substring(end, end + 1));
+				begin = end + 2;
+			} else {
+				ret.append(text.charAt(end));
+				begin = end + 1;
+			}
+
+			end = text.indexOf('\n', begin);
+			nextCR = text.indexOf('\r', begin);
+			if ((nextCR != -1) && ((end == -1) || (nextCR < end)))
+				end = nextCR;
+		}
+		ret.append(processLine(text.substring(begin)));
+
+		return ret.toString();
+	}
+
+	/**
+	 * Add HTML colorization to a single line of Java code.
+	 *
+	 * @param line One line of Java code.
+	 *
+	 * @return The same line of Java code with added span tags.
+	 */
+	private String processLine(final String line) {
+		if (line == null)
+			throw new IllegalArgumentException("\"line\" can not be null.");
+		if ((line.indexOf('\n') != -1) || (line.indexOf('\r') != -1))
+			throw new IllegalArgumentException(
+					"\"line\" can not contain newline or carriage return characters.");
+
+		StringBuffer ret = new StringBuffer();
+		int currentIndex = 0;
+
+		while (currentIndex != line.length()) {
+			if (state == State.DEFAULT) {
+				if ((currentIndex + 2 < line.length())
+						&& line.substring(currentIndex, currentIndex + 3)
+								.equals("/**")) {
+					state = State.COMMENT_JAVADOC;
+
+				} else if ((currentIndex + 1 < line.length())
+						&& line.substring(currentIndex, currentIndex + 2)
+								.equals("/*")) {
+					state = State.COMMENT_MULTI;
+
+				} else if ((currentIndex + 1 < line.length())
+						&& (line.substring(currentIndex, currentIndex + 2)
+								.equals("//"))) {
+					state = State.COMMENT_SINGLE;
+
+				} else if (Character.isJavaIdentifierStart(line
+						.charAt(currentIndex))) {
+					state = State.KEYWORD;
+
+				} else if (line.charAt(currentIndex) == '\'') {
+					state = State.QUOTE_SINGLE;
+
+				} else if (line.charAt(currentIndex) == '"') {
+					state = State.QUOTE_DOUBLE;
+
+				} else {
+					// Default: No highlighting.
+					ret.append(escapeEntity(line.charAt(currentIndex++)));
+				}
+			} // End of State.DEFAULT
+
+			else if ((state == State.COMMENT_MULTI)
+					|| (state == State.COMMENT_JAVADOC)) {
+				// Print everything from the current character until the
+				// closing */  No exceptions.
+				ret.append("<span class=\"comment\">");
+				while ((currentIndex != line.length())
+						&& !((currentIndex + 1 < line.length()) && (line
+								.substring(currentIndex, currentIndex + 2)
+								.equals("*/")))) {
+					ret.append(escapeEntity(line.charAt(currentIndex++)));
+				}
+				if (currentIndex == line.length()) {
+					ret.append("</span>");
+				} else {
+					ret.append("*/</span>");
+					state = State.DEFAULT;
+					currentIndex += 2;
+				}
+			} // End of State.COMMENT_MULTI
+
+			else if (state == State.COMMENT_SINGLE) {
+				// Print everything from the current character until the
+				// end of the line
+				ret.append("<span class=\"comment\">");
+				while (currentIndex != line.length()) {
+					ret.append(escapeEntity(line.charAt(currentIndex++)));
+				}
+				ret.append("</span>");
+				state = State.DEFAULT;
+
+			} // End of State.COMMENT_SINGLE
+
+			else if (state == State.KEYWORD) {
+				StringBuffer tmp = new StringBuffer();
+				do {
+					tmp.append(line.charAt(currentIndex++));
+				} while ((currentIndex != line.length())
+						&& (Character.isJavaIdentifierPart(line
+								.charAt(currentIndex))));
+				if (javaKeywords.contains(tmp.toString()))
+					ret.append("<span class=\"keyword\">" + tmp + "</span>");
+				else if (javaPrimitiveLiterals.contains(tmp.toString()))
+					ret.append("<span class=\"keyword\">" + tmp + "</span>");
+				else if (javaPrimitiveTypes.contains(tmp.toString()))
+					ret.append("<span class=\"keyword\">" + tmp + "</span>");
+				else
+					ret.append(tmp);
+				if (tmp.toString().equals("import"))
+					state = State.IMPORT_NAME;
+				else if (tmp.toString().equals("package"))
+					state = State.PACKAGE_NAME;
+				else
+					state = State.DEFAULT;
+			} // End of State.KEYWORD
+
+			else if (state == State.IMPORT_NAME) {
+				ret.append(escapeEntity(line.charAt(currentIndex++)));
+				state = State.DEFAULT;
+			} // End of State.IMPORT_NAME
+
+			else if (state == State.PACKAGE_NAME) {
+				ret.append(escapeEntity(line.charAt(currentIndex++)));
+				state = State.DEFAULT;
+			} // End of State.PACKAGE_NAME
+
+			else if (state == State.QUOTE_DOUBLE) {
+				// Print everything from the current character until the
+				// closing ", checking for \"
+				ret.append("<span class=\"string\">");
+				do {
+					ret.append(escapeEntity(line.charAt(currentIndex++)));
+				} while ((currentIndex != line.length())
+						&& (!(line.charAt(currentIndex) == '"') || ((line
+								.charAt(currentIndex - 1) == '\\') && (line
+								.charAt(currentIndex - 2) != '\\'))));
+				if (currentIndex == line.length()) {
+					ret.append("</span>");
+				} else {
+					ret.append("\"</span>");
+					state = State.DEFAULT;
+					currentIndex++;
+				}
+			} // End of State.QUOTE_DOUBLE
+
+			else if (state == State.QUOTE_SINGLE) {
+				// Print everything from the current character until the
+				// closing ', checking for \'
+				ret.append("<span class=\"string\">");
+				do {
+					ret.append(escapeEntity(line.charAt(currentIndex++)));
+				} while ((currentIndex != line.length())
+						&& (!(line.charAt(currentIndex) == '\'') || ((line
+								.charAt(currentIndex - 1) == '\\') && (line
+								.charAt(currentIndex - 2) != '\\'))));
+				if (currentIndex == line.length()) {
+					ret.append("</span>");
+				} else {
+					ret.append("\'</span>");
+					state = State.DEFAULT;
+					currentIndex++;
+				}
+			} // End of State.QUOTE_SINGLE
+
+			else {
+				// Default: No highlighting.
+				ret.append(escapeEntity(line.charAt(currentIndex++)));
+			} // End of unknown state
+		}
+
+		return ret.toString();
+	}
+
+	/**
+	 * Reset the state of this Java parser.  Call this if you have
+	 * been parsing one Java file and you want to begin parsing
+	 * another Java file.
+	 */
+	public void reset() {
+		state = State.DEFAULT;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/SourceFileDataBaseNameComparator.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/SourceFileDataBaseNameComparator.java
similarity index 75%
rename from src/net/sourceforge/cobertura/reporting/html/SourceFileDataBaseNameComparator.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/SourceFileDataBaseNameComparator.java
index 79a72ae..4be823f 100644
--- a/src/net/sourceforge/cobertura/reporting/html/SourceFileDataBaseNameComparator.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/SourceFileDataBaseNameComparator.java
@@ -1,44 +1,46 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.html;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-import net.sourceforge.cobertura.coveragedata.SourceFileData;
-
-public class SourceFileDataBaseNameComparator implements Comparator, Serializable
-{
-
-	private static final long serialVersionUID = 0L;
-
-	public int compare(Object arg0, Object arg1)
-	{
-		SourceFileData sourceFileData0 = (SourceFileData)arg0;
-		SourceFileData sourceFileData1 = (SourceFileData)arg1;
-		int comparison = sourceFileData0.getBaseName().compareTo(sourceFileData1.getBaseName());
-		if (comparison != 0)
-			return comparison;
-		return sourceFileData0.getName().compareTo(sourceFileData1.getName());
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.html;
+
+import net.sourceforge.cobertura.coveragedata.SourceFileData;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+public class SourceFileDataBaseNameComparator
+		implements
+			Comparator,
+			Serializable {
+
+	private static final long serialVersionUID = 0L;
+
+	public int compare(Object arg0, Object arg1) {
+		SourceFileData sourceFileData0 = (SourceFileData) arg0;
+		SourceFileData sourceFileData1 = (SourceFileData) arg1;
+		int comparison = sourceFileData0.getBaseName().compareTo(
+				sourceFileData1.getBaseName());
+		if (comparison != 0)
+			return comparison;
+		return sourceFileData0.getName().compareTo(sourceFileData1.getName());
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/CopyFiles.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/files/CopyFiles.java
similarity index 80%
rename from src/net/sourceforge/cobertura/reporting/html/files/CopyFiles.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/files/CopyFiles.java
index 346dc9f..17aef7a 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/CopyFiles.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/html/files/CopyFiles.java
@@ -1,118 +1,105 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.html.files;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public abstract class CopyFiles
-{
-
-	public static void copy(File destinationDir) throws IOException
-	{
-		File cssOutputDir = new File(destinationDir, "css");
-		File imagesOutputDir = new File(destinationDir, "images");
-		File jsOutputDir = new File(destinationDir, "js");
-
-		destinationDir.mkdirs();
-		cssOutputDir.mkdir();
-		imagesOutputDir.mkdir();
-		jsOutputDir.mkdir();
-
-		copyResourceFromJar("help.css", cssOutputDir);
-		copyResourceFromJar("main.css", cssOutputDir);
-		copyResourceFromJar("sortabletable.css", cssOutputDir);
-		copyResourceFromJar("source-viewer.css", cssOutputDir);
-		copyResourceFromJar("tooltip.css", cssOutputDir);
-
-		copyResourceFromJar("blank.png", imagesOutputDir);
-		copyResourceFromJar("downsimple.png", imagesOutputDir);
-		copyResourceFromJar("upsimple.png", imagesOutputDir);
-
-		copyResourceFromJar("customsorttypes.js", jsOutputDir);
-		copyResourceFromJar("popup.js", jsOutputDir);
-		copyResourceFromJar("sortabletable.js", jsOutputDir);
-		copyResourceFromJar("stringbuilder.js", jsOutputDir);
-
-		copyResourceFromJar("help.html", destinationDir);
-		copyResourceFromJar("index.html", destinationDir);
-	}
-
-	/**
-	 * Copy a file from the jar to a directory on the local machine.
-	 *
-	 * @param resourceName The name of the file in the jar.  This file
-	 *        must exist the same package as this method.
-	 * @param directory The directory to copy the jar to.
-	 * @throws IOException If the file could not be read from the
-	 *         jar or written to the disk.
-	 */
-	private static void copyResourceFromJar(String resourceName,
-			File directory) throws IOException
-	{
-		int n;
-		byte[] buf = new byte[1024];
-
-		InputStream in = null;
-		FileOutputStream out = null;
-		directory.mkdirs();
-		try
-		{
-			in = CopyFiles.class.getResourceAsStream(resourceName);
-			if (in == null)
-				throw new IllegalArgumentException("Resource " + resourceName
-						+ " does not exist in this package.");
-			out = new FileOutputStream(new File(directory, resourceName));
-			while ((n = in.read(buf, 0, buf.length)) != -1)
-			{
-				out.write(buf, 0, n);
-			}
-		}
-		finally
-		{
-			if (in != null)
-			{
-				try
-				{
-					in.close();
-				}
-				catch (IOException e)
-				{
-				}
-			}
-			if (out != null)
-			{
-				try
-				{
-					out.close();
-				}
-				catch (IOException e)
-				{
-				}
-			}
-		}
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.html.files;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public abstract class CopyFiles {
+
+	public static void copy(File destinationDir) throws IOException {
+		File cssOutputDir = new File(destinationDir, "css");
+		File imagesOutputDir = new File(destinationDir, "images");
+		File jsOutputDir = new File(destinationDir, "js");
+
+		destinationDir.mkdirs();
+		cssOutputDir.mkdir();
+		imagesOutputDir.mkdir();
+		jsOutputDir.mkdir();
+
+		copyResourceFromJar("help.css", cssOutputDir);
+		copyResourceFromJar("main.css", cssOutputDir);
+		copyResourceFromJar("sortabletable.css", cssOutputDir);
+		copyResourceFromJar("source-viewer.css", cssOutputDir);
+		copyResourceFromJar("tooltip.css", cssOutputDir);
+
+		copyResourceFromJar("blank.png", imagesOutputDir);
+		copyResourceFromJar("downsimple.png", imagesOutputDir);
+		copyResourceFromJar("upsimple.png", imagesOutputDir);
+
+		copyResourceFromJar("customsorttypes.js", jsOutputDir);
+		copyResourceFromJar("popup.js", jsOutputDir);
+		copyResourceFromJar("sortabletable.js", jsOutputDir);
+		copyResourceFromJar("stringbuilder.js", jsOutputDir);
+
+		copyResourceFromJar("help.html", destinationDir);
+		copyResourceFromJar("index.html", destinationDir);
+	}
+
+	/**
+	 * Copy a file from the jar to a directory on the local machine.
+	 *
+	 * @param resourceName The name of the file in the jar.  This file
+	 *                     must exist the same package as this method.
+	 * @param directory    The directory to copy the jar to.
+	 *
+	 * @throws IOException If the file could not be read from the
+	 *                     jar or written to the disk.
+	 */
+	private static void copyResourceFromJar(String resourceName, File directory)
+			throws IOException {
+		int n;
+		byte[] buf = new byte[1024];
+
+		InputStream in = null;
+		FileOutputStream out = null;
+		directory.mkdirs();
+		try {
+			in = CopyFiles.class.getResourceAsStream(resourceName);
+			if (in == null) {
+				throw new IllegalArgumentException("Resource " + resourceName
+						+ " does not exist in this package.");
+			}
+			out = new FileOutputStream(new File(directory, resourceName));
+			while ((n = in.read(buf, 0, buf.length)) != -1) {
+				out.write(buf, 0, n);
+			}
+		} finally {
+			if (in != null) {
+				try {
+					in.close();
+				} catch (IOException e) {
+				}
+			}
+			if (out != null) {
+				try {
+					out.close();
+				} catch (IOException e) {
+				}
+			}
+		}
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/reporting/xml/SummaryXMLReport.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/SummaryXMLReport.java
similarity index 80%
rename from src/net/sourceforge/cobertura/reporting/xml/SummaryXMLReport.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/SummaryXMLReport.java
index 3ca037d..64c24c6 100644
--- a/src/net/sourceforge/cobertura/reporting/xml/SummaryXMLReport.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/SummaryXMLReport.java
@@ -1,117 +1,103 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2008 Julian Gamble 
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.xml;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Date;
-
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.reporting.ComplexityCalculator;
-import net.sourceforge.cobertura.util.FileFinder;
-import net.sourceforge.cobertura.util.Header;
-import net.sourceforge.cobertura.util.IOUtil;
-
-public class SummaryXMLReport
-{
-	
-
-	private final PrintWriter pw;
-	private int indent = 0;
-
-	
-	public SummaryXMLReport(ProjectData projectData, File destinationDir,
-			FileFinder finder, ComplexityCalculator complexity) throws IOException
-	{
-		File file = new File(destinationDir, "coverage-summary.xml");
-		pw = IOUtil.getPrintWriter(file);
-
-		try
-		{
-			println("<?xml version=\"1.0\"?>");
-			println("<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/"
-					+ XMLReport.coverageDTD + "\">");
-			println("");
-
-			double ccn = complexity.getCCNForProject(projectData);
-			int numLinesCovered = projectData.getNumberOfCoveredLines();
-			int numLinesValid = projectData.getNumberOfValidLines();
-			int numBranchesCovered = projectData.getNumberOfCoveredBranches();
-			int numBranchesValid = projectData.getNumberOfValidBranches();
-
-			
-			// TODO: Set a schema?
-			//println("<coverage " + sourceDirectories.toString() + " xmlns=\"http://cobertura.sourceforge.net\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://cobertura.sourceforge.net/xml/coverage.xsd\">");
-			println(
-					"<coverage line-rate=\"" + projectData.getLineCoverageRate()
-					+ "\" branch-rate=\"" + projectData.getBranchCoverageRate()
-					+ "\" lines-covered=\"" + numLinesCovered
-					+ "\" lines-valid=\"" + numLinesValid
-					+ "\" branches-covered=\"" + numBranchesCovered
-					+ "\" branches-valid=\"" + numBranchesValid
-
-					+ "\" complexity=\"" + ccn
-
-					+ "\" version=\"" + Header.version()
-					+ "\" timestamp=\"" + new Date().getTime()
-					+ "\">");
-
-			//the DTD requires a "packages" element
-			increaseIndentation();
-			println("<packages />");
-			decreaseIndentation();
-			
-			println("</coverage>");
-		}
-		finally
-		{
-			pw.close();
-		}
-
-	}
-	
-	void increaseIndentation()
-	{
-		indent++;
-	}
-
-	void decreaseIndentation()
-	{
-		if (indent > 0)
-			indent--;
-	}
-
-	private void println(String ln)
-	{
-		indent();
-		pw.println(ln);
-	}
-
-	private void indent()
-	{
-		for (int i = 0; i < indent; i++)
-		{
-			pw.print("\t");
-		}
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2008 Julian Gamble 
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.xml;
+
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.reporting.ComplexityCalculator;
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.util.Header;
+import net.sourceforge.cobertura.util.IOUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+
+public class SummaryXMLReport {
+
+	private final PrintWriter pw;
+	private int indent = 0;
+
+	public SummaryXMLReport(ProjectData projectData, File destinationDir,
+			ComplexityCalculator complexity) throws IOException {
+		File file = new File(destinationDir, "coverage-summary.xml");
+		pw = IOUtil.getPrintWriter(file);
+
+		try {
+			println("<?xml version=\"1.0\"?>");
+			println("<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/"
+					+ XMLReport.coverageDTD + "\">");
+			println("");
+
+			double ccn = complexity.getCCNForProject(projectData);
+			int numLinesCovered = projectData.getNumberOfCoveredLines();
+			int numLinesValid = projectData.getNumberOfValidLines();
+			int numBranchesCovered = projectData.getNumberOfCoveredBranches();
+			int numBranchesValid = projectData.getNumberOfValidBranches();
+
+			// TODO: Set a schema?
+			//println("<coverage " + sourceDirectories.toString() + " xmlns=\"http://cobertura.sourceforge.net\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://cobertura.sourceforge.net/xml/coverage.xsd\">");
+			println("<coverage line-rate=\""
+					+ projectData.getLineCoverageRate() + "\" branch-rate=\""
+					+ projectData.getBranchCoverageRate()
+					+ "\" lines-covered=\"" + numLinesCovered
+					+ "\" lines-valid=\"" + numLinesValid
+					+ "\" branches-covered=\"" + numBranchesCovered
+					+ "\" branches-valid=\"" + numBranchesValid
+
+					+ "\" complexity=\"" + ccn
+
+					+ "\" version=\"" + Header.version() + "\" timestamp=\""
+					+ new Date().getTime() + "\">");
+
+			//the DTD requires a "packages" element
+			increaseIndentation();
+			println("<packages />");
+			decreaseIndentation();
+
+			println("</coverage>");
+		} finally {
+			pw.close();
+		}
+
+	}
+
+	void increaseIndentation() {
+		indent++;
+	}
+
+	void decreaseIndentation() {
+		if (indent > 0)
+			indent--;
+	}
+
+	private void println(String ln) {
+		indent();
+		pw.println(ln);
+	}
+
+	private void indent() {
+		for (int i = 0; i < indent; i++) {
+			pw.print("\t");
+		}
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/SummaryXMLReportStrategy.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/SummaryXMLReportStrategy.java
new file mode 100644
index 0000000..bff7072
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/SummaryXMLReportStrategy.java
@@ -0,0 +1,28 @@
+package net.sourceforge.cobertura.reporting.xml;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+import net.sourceforge.cobertura.reporting.NativeReport;
+import net.sourceforge.cobertura.reporting.Report;
+import net.sourceforge.cobertura.reporting.ReportFormatStrategy;
+
+public class SummaryXMLReportStrategy implements ReportFormatStrategy {
+	private static final Logger log = LoggerFactory
+			.getLogger(SummaryXMLReportStrategy.class);
+
+	public void save(Report report) {
+		NativeReport nativeReport = (NativeReport) report;
+		try {
+			new SummaryXMLReport(nativeReport.getProjectData(), nativeReport
+					.getDestinationDir(), nativeReport.getComplexity());
+		} catch (Exception e) {
+			log.error("Saving summary report failed.", e);
+		}
+	}
+
+	public ReportFormat getName() {
+		return ReportFormat.SUMMARY_XML;
+	}
+}
diff --git a/src/net/sourceforge/cobertura/reporting/xml/XMLReport.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/XMLReport.java
similarity index 69%
rename from src/net/sourceforge/cobertura/reporting/xml/XMLReport.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/XMLReport.java
index 1fc13f0..ffd5847 100644
--- a/src/net/sourceforge/cobertura/reporting/xml/XMLReport.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/XMLReport.java
@@ -1,353 +1,313 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2006 Jiri Mares
- * Copyright (C) 2008 Julian Gamble
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.xml;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.JumpData;
-import net.sourceforge.cobertura.coveragedata.LineData;
-import net.sourceforge.cobertura.coveragedata.PackageData;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.coveragedata.SourceFileData;
-import net.sourceforge.cobertura.coveragedata.SwitchData;
-import net.sourceforge.cobertura.reporting.ComplexityCalculator;
-import net.sourceforge.cobertura.util.FileFinder;
-import net.sourceforge.cobertura.util.Header;
-import net.sourceforge.cobertura.util.IOUtil;
-import net.sourceforge.cobertura.util.StringUtil;
-
-import org.apache.log4j.Logger;
-
-public class XMLReport
-{
-
-	private static final Logger logger = Logger.getLogger(XMLReport.class);
-
-	protected final static String coverageDTD = "coverage-04.dtd";
-
-	private final PrintWriter pw;
-	private final FileFinder finder;
-	private final ComplexityCalculator complexity;
-	private int indent = 0;
-
-	public XMLReport(ProjectData projectData, File destinationDir,
-			FileFinder finder, ComplexityCalculator complexity) throws IOException
-	{
-		this.complexity = complexity;
-		this.finder = finder;
-
-		File file = new File(destinationDir, "coverage.xml");
-		pw = IOUtil.getPrintWriter(file);
-
-		try
-		{
-			println("<?xml version=\"1.0\"?>");
-			println("<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/"
-					+ coverageDTD + "\">");
-			println("");
-
-			double ccn = complexity.getCCNForProject(projectData);
-			int numLinesCovered = projectData.getNumberOfCoveredLines();
-			int numLinesValid = projectData.getNumberOfValidLines();
-			int numBranchesCovered = projectData.getNumberOfCoveredBranches();
-			int numBranchesValid = projectData.getNumberOfValidBranches();
-			 
-			// TODO: Set a schema?
-			//println("<coverage " + sourceDirectories.toString() + " xmlns=\"http://cobertura.sourceforge.net\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://cobertura.sourceforge.net/xml/coverage.xsd\">");
-			println(
-					"<coverage line-rate=\"" + projectData.getLineCoverageRate()
-					+ "\" branch-rate=\"" + projectData.getBranchCoverageRate()
-					+ "\" lines-covered=\"" + numLinesCovered
-					+ "\" lines-valid=\"" + numLinesValid
-					+ "\" branches-covered=\"" + numBranchesCovered
-					+ "\" branches-valid=\"" + numBranchesValid
-
-					+ "\" complexity=\"" + ccn
-
-					+ "\" version=\"" + Header.version()
-					+ "\" timestamp=\"" + new Date().getTime()
-					+ "\">");
-
-			increaseIndentation();
-			dumpSources();
-			dumpPackages(projectData);
-			decreaseIndentation();
-			println("</coverage>");
-		}
-		finally
-		{
-			pw.close();
-		}
-	}
-
-	void increaseIndentation()
-	{
-		indent++;
-	}
-
-	void decreaseIndentation()
-	{
-		if (indent > 0)
-			indent--;
-	}
-
-	void indent()
-	{
-		for (int i = 0; i < indent; i++)
-		{
-			pw.print("\t");
-		}
-	}
-
-	void println(String ln)
-	{
-		indent();
-		pw.println(ln);
-	}
-
-	private void dumpSources()
-	{
-		println("<sources>");
-		increaseIndentation();
-		for (Iterator it = finder.getSourceDirectoryList().iterator(); it.hasNext(); ) {
-			String dir = (String) it.next();
-			dumpSource(dir);
-		}
-		decreaseIndentation();
-		println("</sources>");
-	}
-
-	private void dumpSource(String sourceDirectory)
-	{
-		println("<source>" + sourceDirectory + "</source>");
-	}
-
-	private void dumpPackages(ProjectData projectData)
-	{
-		println("<packages>");
-		increaseIndentation();
-
-		Iterator it = projectData.getPackages().iterator();
-		while (it.hasNext())
-		{
-			dumpPackage((PackageData)it.next());
-		}
-
-		decreaseIndentation();
-		println("</packages>");
-	}
-
-	private void dumpPackage(PackageData packageData)
-	{
-		logger.debug("Dumping package " + packageData.getName());
-
-		println("<package name=\"" + packageData.getName()
-				+ "\" line-rate=\"" + packageData.getLineCoverageRate()
-				+ "\" branch-rate=\"" + packageData.getBranchCoverageRate()
-				+ "\" complexity=\"" + complexity.getCCNForPackage(packageData) + "\"" + ">");
-		increaseIndentation();
-		dumpSourceFiles(packageData);
-		decreaseIndentation();
-		println("</package>");
-	}
-
-	private void dumpSourceFiles(PackageData packageData)
-	{
-		println("<classes>");
-		increaseIndentation();
-
-		Iterator it = packageData.getSourceFiles().iterator();
-		while (it.hasNext())
-		{
-			dumpClasses((SourceFileData)it.next());
-		}
-
-		decreaseIndentation();
-		println("</classes>");
-	}
-
-	private void dumpClasses(SourceFileData sourceFileData)
-	{
-		Iterator it = sourceFileData.getClasses().iterator();
-		while (it.hasNext())
-		{
-			dumpClass((ClassData)it.next());
-		}
-	}
-
-	private void dumpClass(ClassData classData)
-	{
-		logger.debug("Dumping class " + classData.getName());
-
-		println("<class name=\"" + classData.getName() + "\" filename=\""
-				+ classData.getSourceFileName() + "\" line-rate=\""
-				+ classData.getLineCoverageRate() + "\" branch-rate=\""
-				+ classData.getBranchCoverageRate() + "\" complexity=\""
-				+ complexity.getCCNForClass(classData) + "\"" + ">");
-		increaseIndentation();
-
-		dumpMethods(classData);
-		dumpLines(classData);
-
-		decreaseIndentation();
-		println("</class>");
-	}
-
-	private void dumpMethods(ClassData classData)
-	{
-		println("<methods>");
-		increaseIndentation();
-
-		SortedSet sortedMethods = new TreeSet();
-		sortedMethods.addAll(classData.getMethodNamesAndDescriptors());
-		Iterator iter = sortedMethods.iterator();
-		while (iter.hasNext())
-		{
-			dumpMethod(classData, (String)iter.next());
-		}
-
-		decreaseIndentation();
-		println("</methods>");
-	}
-
-	private void dumpMethod(ClassData classData, String nameAndSig)
-	{
-		String name = nameAndSig.substring(0, nameAndSig.indexOf('('));
-		String signature = nameAndSig.substring(nameAndSig.indexOf('('));
-		double lineRate = classData.getLineCoverageRate(nameAndSig);
-		double branchRate = classData.getBranchCoverageRate(nameAndSig);
-
-		println("<method name=\"" + xmlEscape(name) + "\" signature=\""
-				+ xmlEscape(signature) + "\" line-rate=\"" + lineRate
-				+ "\" branch-rate=\"" + branchRate + "\">");
-		increaseIndentation();
-		dumpLines(classData, nameAndSig);
-		decreaseIndentation();
-		println("</method>");
-	}
-
-	private static String xmlEscape(String str)
-	{
-		str = StringUtil.replaceAll(str, "<", "<");
-		str = StringUtil.replaceAll(str, ">", ">");
-		return str;
-	}
-
-	private void dumpLines(ClassData classData)
-	{
-		dumpLines(classData.getLines());
-	}
-
-	private void dumpLines(ClassData classData, String methodNameAndSig)
-	{
-		dumpLines(classData.getLines(methodNameAndSig));
-	}
-
-	private void dumpLines(Collection lines)
-	{
-		println("<lines>");
-		increaseIndentation();
-
-		SortedSet sortedLines = new TreeSet();
-		sortedLines.addAll(lines);
-		Iterator iter = sortedLines.iterator();
-		while (iter.hasNext())
-		{
-			dumpLine((LineData)iter.next());
-		}
-
-		decreaseIndentation();
-		println("</lines>");
-	}
-
-	private void dumpLine(LineData lineData)
-	{
-		int lineNumber = lineData.getLineNumber();
-		long hitCount = lineData.getHits();
-		boolean hasBranch = lineData.hasBranch();
-		String conditionCoverage = lineData.getConditionCoverage();
-
-		String lineInfo = "<line number=\"" + lineNumber + "\" hits=\"" + hitCount
-				+ "\" branch=\"" + hasBranch + "\"";
-		if (hasBranch)
-		{
-			println(lineInfo + " condition-coverage=\"" + conditionCoverage + "\">");
-			dumpConditions(lineData);
-			println("</line>");
-		} else
-		{
-			println(lineInfo + "/>");
-		}
-	}
-
-	private void dumpConditions(LineData lineData)
-	{
-		increaseIndentation();
-		println("<conditions>");
-
-		for (int i = 0; i < lineData.getConditionSize(); i++)
-		{
-			Object conditionData = lineData.getConditionData(i);
-			String coverage = lineData.getConditionCoverage(i);
-			dumpCondition(conditionData, coverage);
-		}
-
-		println("</conditions>");
-		decreaseIndentation();
-	}
-
-	private void dumpCondition(Object conditionData, String coverage)
-	{
-		increaseIndentation();
-		StringBuffer buffer = new StringBuffer("<condition");
-		if (conditionData instanceof JumpData)
-		{
-			JumpData jumpData = (JumpData) conditionData;
-			buffer.append(" number=\"").append(jumpData.getConditionNumber()).append("\"");
-			buffer.append(" type=\"").append("jump").append("\"");
-			buffer.append(" coverage=\"").append(coverage).append("\"");
-		}
-		else
-		{
-			SwitchData switchData = (SwitchData) conditionData;
-			buffer.append(" number=\"").append(switchData.getSwitchNumber()).append("\"");
-			buffer.append(" type=\"").append("switch").append("\"");
-			buffer.append(" coverage=\"").append(coverage).append("\"");
-		}
-		buffer.append("/>");
-		println(buffer.toString());
-		decreaseIndentation();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2006 Jiri Mares
+ * Copyright (C) 2008 Julian Gamble
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.xml;
+
+import net.sourceforge.cobertura.coveragedata.*;
+import net.sourceforge.cobertura.reporting.ComplexityCalculator;
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.util.Header;
+import net.sourceforge.cobertura.util.IOUtil;
+import net.sourceforge.cobertura.util.StringUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class XMLReport {
+
+	private static final Logger logger = LoggerFactory
+			.getLogger(XMLReport.class);
+
+	protected final static String coverageDTD = "coverage-04.dtd";
+
+	private final PrintWriter pw;
+	private final FileFinder finder;
+	private final ComplexityCalculator complexity;
+	private int indent = 0;
+
+	public XMLReport(ProjectData projectData, File destinationDir,
+			FileFinder finder, ComplexityCalculator complexity)
+			throws IOException {
+		this.complexity = complexity;
+		this.finder = finder;
+
+		File file = new File(destinationDir, "coverage.xml");
+		pw = IOUtil.getPrintWriter(file);
+
+		try {
+			println("<?xml version=\"1.0\"?>");
+			println("<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/"
+					+ coverageDTD + "\">");
+			println("");
+
+			double ccn = complexity.getCCNForProject(projectData);
+			int numLinesCovered = projectData.getNumberOfCoveredLines();
+			int numLinesValid = projectData.getNumberOfValidLines();
+			int numBranchesCovered = projectData.getNumberOfCoveredBranches();
+			int numBranchesValid = projectData.getNumberOfValidBranches();
+
+			// TODO: Set a schema?
+			//println("<coverage " + sourceDirectories.toString() + " xmlns=\"http://cobertura.sourceforge.net\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://cobertura.sourceforge.net/xml/coverage.xsd\">");
+			println("<coverage line-rate=\""
+					+ projectData.getLineCoverageRate() + "\" branch-rate=\""
+					+ projectData.getBranchCoverageRate()
+					+ "\" lines-covered=\"" + numLinesCovered
+					+ "\" lines-valid=\"" + numLinesValid
+					+ "\" branches-covered=\"" + numBranchesCovered
+					+ "\" branches-valid=\"" + numBranchesValid
+
+					+ "\" complexity=\"" + ccn
+
+					+ "\" version=\"" + Header.version() + "\" timestamp=\""
+					+ new Date().getTime() + "\">");
+
+			increaseIndentation();
+			dumpSources();
+			dumpPackages(projectData);
+			decreaseIndentation();
+			println("</coverage>");
+		} finally {
+			pw.close();
+		}
+	}
+
+	void increaseIndentation() {
+		indent++;
+	}
+
+	void decreaseIndentation() {
+		if (indent > 0)
+			indent--;
+	}
+
+	void indent() {
+		for (int i = 0; i < indent; i++) {
+			pw.print("\t");
+		}
+	}
+
+	void println(String ln) {
+		indent();
+		pw.println(ln);
+	}
+
+	private void dumpSources() {
+		println("<sources>");
+		increaseIndentation();
+		for (Iterator it = finder.getSourceDirectoryList().iterator(); it
+				.hasNext();) {
+			String dir = (String) it.next();
+			dumpSource(dir);
+		}
+		decreaseIndentation();
+		println("</sources>");
+	}
+
+	private void dumpSource(String sourceDirectory) {
+		println("<source>" + sourceDirectory + "</source>");
+	}
+
+	private void dumpPackages(ProjectData projectData) {
+		println("<packages>");
+		increaseIndentation();
+
+		Iterator it = projectData.getPackages().iterator();
+		while (it.hasNext()) {
+			dumpPackage((PackageData) it.next());
+		}
+
+		decreaseIndentation();
+		println("</packages>");
+	}
+
+	private void dumpPackage(PackageData packageData) {
+		logger.debug("Dumping package " + packageData.getName());
+
+		println("<package name=\"" + packageData.getName() + "\" line-rate=\""
+				+ packageData.getLineCoverageRate() + "\" branch-rate=\""
+				+ packageData.getBranchCoverageRate() + "\" complexity=\""
+				+ complexity.getCCNForPackage(packageData) + "\"" + ">");
+		increaseIndentation();
+		dumpSourceFiles(packageData);
+		decreaseIndentation();
+		println("</package>");
+	}
+
+	private void dumpSourceFiles(PackageData packageData) {
+		println("<classes>");
+		increaseIndentation();
+
+		Iterator it = packageData.getSourceFiles().iterator();
+		while (it.hasNext()) {
+			dumpClasses((SourceFileData) it.next());
+		}
+
+		decreaseIndentation();
+		println("</classes>");
+	}
+
+	private void dumpClasses(SourceFileData sourceFileData) {
+		Iterator it = sourceFileData.getClasses().iterator();
+		while (it.hasNext()) {
+			dumpClass((ClassData) it.next());
+		}
+	}
+
+	private void dumpClass(ClassData classData) {
+		logger.debug("Dumping class " + classData.getName());
+
+		println("<class name=\"" + classData.getName() + "\" filename=\""
+				+ classData.getSourceFileName() + "\" line-rate=\""
+				+ classData.getLineCoverageRate() + "\" branch-rate=\""
+				+ classData.getBranchCoverageRate() + "\" complexity=\""
+				+ complexity.getCCNForClass(classData) + "\"" + ">");
+		increaseIndentation();
+
+		dumpMethods(classData);
+		dumpLines(classData);
+
+		decreaseIndentation();
+		println("</class>");
+	}
+
+	private void dumpMethods(ClassData classData) {
+		println("<methods>");
+		increaseIndentation();
+
+		SortedSet sortedMethods = new TreeSet();
+		sortedMethods.addAll(classData.getMethodNamesAndDescriptors());
+		Iterator iter = sortedMethods.iterator();
+		while (iter.hasNext()) {
+			dumpMethod(classData, (String) iter.next());
+		}
+
+		decreaseIndentation();
+		println("</methods>");
+	}
+
+	private void dumpMethod(ClassData classData, String nameAndSig) {
+		String name = nameAndSig.substring(0, nameAndSig.indexOf('('));
+		String signature = nameAndSig.substring(nameAndSig.indexOf('('));
+		double lineRate = classData.getLineCoverageRate(nameAndSig);
+		double branchRate = classData.getBranchCoverageRate(nameAndSig);
+		int methodComplexity = complexity.getCCNForMethod(classData, name, signature);
+
+		println("<method name=\"" + xmlEscape(name) + "\" signature=\""
+				+ xmlEscape(signature) + "\" line-rate=\"" + lineRate
+		    		+ "\" branch-rate=\"" + branchRate + "\" complexity=\"" + methodComplexity + "\">");
+		increaseIndentation();
+		dumpLines(classData, nameAndSig);
+		decreaseIndentation();
+		println("</method>");
+	}
+
+	private static String xmlEscape(String str) {
+		str = StringUtil.replaceAll(str, "<", "<");
+		str = StringUtil.replaceAll(str, ">", ">");
+		return str;
+	}
+
+	private void dumpLines(ClassData classData) {
+		dumpLines(classData.getLines());
+	}
+
+	private void dumpLines(ClassData classData, String methodNameAndSig) {
+		dumpLines(classData.getLines(methodNameAndSig));
+	}
+
+	private void dumpLines(Collection lines) {
+		println("<lines>");
+		increaseIndentation();
+
+		SortedSet sortedLines = new TreeSet();
+		sortedLines.addAll(lines);
+		Iterator iter = sortedLines.iterator();
+		while (iter.hasNext()) {
+			dumpLine((LineData) iter.next());
+		}
+
+		decreaseIndentation();
+		println("</lines>");
+	}
+
+	private void dumpLine(LineData lineData) {
+		int lineNumber = lineData.getLineNumber();
+		long hitCount = lineData.getHits();
+		boolean hasBranch = lineData.hasBranch();
+		String conditionCoverage = lineData.getConditionCoverage();
+
+		String lineInfo = "<line number=\"" + lineNumber + "\" hits=\""
+				+ hitCount + "\" branch=\"" + hasBranch + "\"";
+		if (hasBranch) {
+			println(lineInfo + " condition-coverage=\"" + conditionCoverage
+					+ "\">");
+			dumpConditions(lineData);
+			println("</line>");
+		} else {
+			println(lineInfo + "/>");
+		}
+	}
+
+	private void dumpConditions(LineData lineData) {
+		increaseIndentation();
+		println("<conditions>");
+
+		for (int i = 0; i < lineData.getConditionSize(); i++) {
+			Object conditionData = lineData.getConditionData(i);
+			String coverage = lineData.getConditionCoverage(i);
+			dumpCondition(conditionData, coverage);
+		}
+
+		println("</conditions>");
+		decreaseIndentation();
+	}
+
+	private void dumpCondition(Object conditionData, String coverage) {
+		increaseIndentation();
+		StringBuffer buffer = new StringBuffer("<condition");
+		if (conditionData instanceof JumpData) {
+			JumpData jumpData = (JumpData) conditionData;
+			buffer.append(" number=\"").append(jumpData.getConditionNumber())
+					.append("\"");
+			buffer.append(" type=\"").append("jump").append("\"");
+			buffer.append(" coverage=\"").append(coverage).append("\"");
+		} else {
+			SwitchData switchData = (SwitchData) conditionData;
+			buffer.append(" number=\"").append(switchData.getSwitchNumber())
+					.append("\"");
+			buffer.append(" type=\"").append("switch").append("\"");
+			buffer.append(" coverage=\"").append(coverage).append("\"");
+		}
+		buffer.append("/>");
+		println(buffer.toString());
+		decreaseIndentation();
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/XMLReportFormatStrategy.java b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/XMLReportFormatStrategy.java
new file mode 100644
index 0000000..d434880
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/reporting/xml/XMLReportFormatStrategy.java
@@ -0,0 +1,29 @@
+package net.sourceforge.cobertura.reporting.xml;
+
+import net.sourceforge.cobertura.dsl.ReportFormat;
+import net.sourceforge.cobertura.reporting.NativeReport;
+import net.sourceforge.cobertura.reporting.Report;
+import net.sourceforge.cobertura.reporting.ReportFormatStrategy;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class XMLReportFormatStrategy implements ReportFormatStrategy {
+	private static final Logger log = LoggerFactory
+			.getLogger(XMLReportFormatStrategy.class);
+
+	public void save(Report report) {
+		NativeReport nativeReport = (NativeReport) report;
+		try {
+			new XMLReport(nativeReport.getProjectData(), nativeReport
+					.getDestinationDir(), nativeReport.getFinder(),
+					nativeReport.getComplexity());
+		} catch (Exception e) {
+			log.error("Saving XML report failed.", e);
+		}
+	}
+
+	public ReportFormat getName() {
+		return ReportFormat.XML;
+	}
+}
diff --git a/src/net/sourceforge/cobertura/util/ArchiveUtil.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/ArchiveUtil.java
similarity index 61%
rename from src/net/sourceforge/cobertura/util/ArchiveUtil.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/ArchiveUtil.java
index 79f2eb8..7d40af4 100644
--- a/src/net/sourceforge/cobertura/util/ArchiveUtil.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/ArchiveUtil.java
@@ -1,65 +1,91 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2006 Mark Doliner
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-/**
- * Utility methods for working with archives.
- * 
- * @author John Lewis
- */
-public abstract class ArchiveUtil
-{
-
-	/**
-	 * Return true if the given name ends with .jar, .zip,
-	 * .war, .ear, or .sar (case insensitive).
-	 * 
-	 * @param name The file name.
-	 * @return true if the name is an archive.
-	 */
-	public static boolean isArchive(String name)
-	{
-		name = name.toLowerCase();
-		return name.endsWith(".jar") || name.endsWith(".zip") || name.endsWith(".war")
-				|| name.endsWith(".ear") || name.endsWith(".sar");
-	}
-
-	/**
-	 * Check to see if the given file name is a signature file
-	 * (meta-inf/*.rsa or meta-inf/*.sf).
-	 * 
-	 * @param name The file name.  Commonly a ZipEntry name.
-	 * @return true if the name is a signature file.
-	 */
-	public static boolean isSignatureFile(String name)
-	{
-		name = name.toLowerCase();
-		return (name.startsWith("meta-inf/") && (name.endsWith(".rsa") || name.endsWith(".sf")));
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Mark Doliner
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.coveragedata.TouchCollector;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Utility methods for working with archives.
+ *
+ * @author John Lewis
+ */
+public abstract class ArchiveUtil {
+
+	/**
+	 * Return true if the given name ends with .jar, .zip,
+	 * .war, .ear, or .sar (case insensitive).
+	 *
+	 * @param name The file name.
+	 *
+	 * @return true if the name is an archive.
+	 */
+	public static boolean isArchive(String name) {
+		name = name.toLowerCase();
+		return name.endsWith(".jar") || name.endsWith(".zip")
+				|| name.endsWith(".war") || name.endsWith(".ear")
+				|| name.endsWith(".sar");
+	}
+
+	/**
+	 * Check to see if the given file name is a signature file
+	 * (meta-inf/*.rsa or meta-inf/*.sf).
+	 *
+	 * @param name The file name.  Commonly a ZipEntry name.
+	 *
+	 * @return true if the name is a signature file.
+	 */
+	public static boolean isSignatureFile(String name) {
+		name = name.toLowerCase();
+		return (name.startsWith("meta-inf/") && (name.endsWith(".rsa") || name
+				.endsWith(".sf")));
+	}
+
+	public static void getFiles(File baseDir, String validExtension,
+			List<File> files) {
+		String[] children = baseDir.list();
+		if (children == null) {
+			// Either dir does not exist or is not a directory
+		} else {
+			for (String filename : children) {
+				File file = new File(baseDir, filename);
+				if (filename.endsWith(validExtension)) {
+					files.add(file);
+				} else {
+					if (file.isDirectory()) {
+						getFiles(file, validExtension, files);
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/src/net/sourceforge/cobertura/util/CommandLineBuilder.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/CommandLineBuilder.java
similarity index 76%
rename from src/net/sourceforge/cobertura/util/CommandLineBuilder.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/CommandLineBuilder.java
index 0617b97..830b841 100644
--- a/src/net/sourceforge/cobertura/util/CommandLineBuilder.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/CommandLineBuilder.java
@@ -1,224 +1,220 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-/**
- * Helper class for storing long command lines inside temporary file.
- * <p>
- * Typical usage:
- * 
- * <pre>
- *  builder = new CommandLineBuilder();
- *  builder.addArg("--someoption");
- *  builder.addArg("optionValue");
- *  ...
- *  builder.saveArgs();
- *  doSomething(builder.getCommandLineFile());
- *  builder.dispose();
- * </pre>
- * 
- * It will save options in <code>builder.getCommandLineFile()</code>. Options
- * will be stored one in a line. To retrieve options from file helper method can
- * be used (see documentation):
- * 
- * <pre>
- * String[] args = CommandLineBuilder.preprocessCommandLineArguments(args);
- * </pre>
- * 
- * </p>
- * 
- * <p>
- * NOTICE: No protection against line separators in arguments, should be OK for
- * Cobertura needs.
- * </p>
- * <p>
- * NOTICE: This class depends on local machine settings (line separator, default
- * encoding). If arguments are saved on different machine than they are loaded,
- * results are unspecified. No problem in Cobertura.
- * </p>
- * 
- * @author Grzegorz Lukasik
- */
-public class CommandLineBuilder {
-	private static final Logger logger = Logger
-			.getLogger(CommandLineBuilder.class);
-
-	private static final String LINESEP = System.getProperty("line.separator");
-
-	// File that will be used to store arguments
-	private File commandLineFile = null;
-
-	// Writer that will be used to write arguments to the file
-	private FileWriter commandLineWriter = null;
-
-	/**
-	 * Creates a new instance of the builder. Instances of this class should not
-	 * be reused to create many command lines.
-	 * 
-	 * @throws IOException
-	 *             if problems with creating temporary file for storing command
-	 *             line occur
-	 */
-	public CommandLineBuilder() throws IOException {
-		commandLineFile = File.createTempFile("cobertura.", ".cmdline");
-		commandLineFile.deleteOnExit();
-		commandLineWriter = new FileWriter(commandLineFile);
-	}
-
-	/**
-	 * Adds command line argument. Each argument can be thought as a single cell
-	 * in array passed to main method. This method should not be used after
-	 * arguments were saved.
-	 * 
-	 * @param arg command line argument to save
-	 * @throws IOException
-	 *             if problems with temporary file occur
-	 * @throws NullPointerException 
-	 *             if <code>arg</code> is <code>null</code>            
-	 */
-	public void addArg(String arg) throws IOException {
-		if( arg==null)
-			throw new NullPointerException();
-		commandLineWriter.write(arg + LINESEP);
-	}
-
-	
-	/**
-	 * Adds two command line arguments. Convienience function, calls
-	 * {@link #addArg(String)} two times.   
-	 * 
-	 * @param arg1 first command line argument to save
-	 * @param arg2 second command line argument to save
-	 * @throws IOException
-	 *             if problems with temporary file occur
-	 * @throws NullPointerException 
-	 *             if any <code>arg</code> is <code>null</code>            
-	 */
-    public void addArg(String arg1, String arg2) throws IOException {
-        addArg(arg1);
-        addArg(arg2);
-    }
-
-    
-	/**
-	 * Saves options and made file available to use. Use method
-	 * {@link #getCommandLineFile} to get the file the arguments are saved in.
-	 * 
-	 * @throws IOException
-	 *             if problems with temporary file occur
-	 */
-	public void saveArgs() throws IOException {
-		commandLineWriter.flush();
-		commandLineWriter.close();
-	}
-
-	/**
-	 * Gets absolute path to the file with saved arguments. Notice, that however
-	 * this method can be used as soon as an instance of this class is created,
-	 * arguments should be read from the file after a call to
-	 * {@link #saveArgs} method.
-	 * 
-	 * @return absolute path to the file with arguments
-	 */
-	public String getCommandLineFile() {
-		return commandLineFile.getAbsolutePath();
-	}
-
-	/**
-	 * Explicity frees all resources associated with this instance. Result of
-	 * any other method call after disposing an instance of this class is
-	 * unspecified.
-	 */
-	public void dispose() {
-		commandLineFile.delete();
-	}
-
-	/**
-	 * Loads arguments from file if <code>--commandsfile</code> option is used. Checks
-	 * if passed array contains <code>--commandsfile</code> String, and if
-	 * so arguments from file specified in the very next array cell are read. If
-	 * there are more then one <code>--commandsfile</code> the result is unspecified. 
-	 *
-	 * @return The list of arguments read from commandsfile, or
-	 *         <code>args</code> if commandsfile option was not specified
-	 *         or the file cannot be read.
-	 * @throws NullPointerException if args is null, or any argument is null
-	 * @throws IllegalArgumentException if --commandsfile is specified as last option
-	 * @throws IOException if I/O related error with temporary command line file occur
-	 */
-	public static String[] preprocessCommandLineArguments(String[] args) throws IOException {
-		boolean hasCommandsFile = false;
-		String commandsFileName = null;
-		for (int i = 0; i < args.length; i++) {
-			if ( args[i].equals( "--commandsfile")) {
-				if( i==args.length-1) {
-					throw new IllegalArgumentException("'--commandsfile' specified as last option.");
-				}
-				hasCommandsFile = true;
-				commandsFileName = args[++i];
-			}
-		}
-
-		if (hasCommandsFile) {
-			List arglist = new ArrayList();
-			BufferedReader bufferedReader = null;
-
-			try {
-				bufferedReader = new BufferedReader(new FileReader(
-						commandsFileName));
-				String line;
-
-				while ((line = bufferedReader.readLine()) != null)
-					arglist.add(line);
-
-			} catch (IOException e) {
-				logger.info( "I/O error when reading temporary commands file", e);
-				throw new IOException( "Unable to read temporary commands file "
-						+ commandsFileName + ".");
-			} finally {
-				if (bufferedReader != null) {
-					try {
-						bufferedReader.close();
-					} catch (IOException e) {
-					}
-				}
-			}
-
-			args = (String[]) arglist.toArray(new String[arglist.size()]);
-		}
-		return args;
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Helper class for storing long command lines inside temporary file.
+ * <p>
+ * Typical usage:
+ * <p/>
+ * <pre>
+ *  builder = new CommandLineBuilder();
+ *  builder.addArg("--someoption");
+ *  builder.addArg("optionValue");
+ *  ...
+ *  builder.saveArgs();
+ *  doSomething(builder.getCommandLineFile());
+ *  builder.dispose();
+ * </pre>
+ * <p/>
+ * It will save options in <code>builder.getCommandLineFile()</code>. Options
+ * will be stored one in a line. To retrieve options from file helper method can
+ * be used (see documentation):
+ * <p/>
+ * <pre>
+ * String[] args = CommandLineBuilder.preprocessCommandLineArguments(args);
+ * </pre>
+ * <p/>
+ * </p>
+ * <p/>
+ * <p>
+ * NOTICE: No protection against line separators in arguments, should be OK for
+ * Cobertura needs.
+ * </p>
+ * <p>
+ * NOTICE: This class depends on local machine settings (line separator, default
+ * encoding). If arguments are saved on different machine than they are loaded,
+ * results are unspecified. No problem in Cobertura.
+ * </p>
+ *
+ * @author Grzegorz Lukasik
+ */
+public class CommandLineBuilder {
+	private static final Logger logger = LoggerFactory
+			.getLogger(CommandLineBuilder.class);
+
+	private static final String LINESEP = System.getProperty("line.separator");
+
+	// File that will be used to store arguments
+	private File commandLineFile = null;
+
+	// Writer that will be used to write arguments to the file
+	private FileWriter commandLineWriter = null;
+
+	/**
+	 * Creates a new instance of the builder. Instances of this class should not
+	 * be reused to create many command lines.
+	 *
+	 * @throws IOException if problems with creating temporary file for storing command
+	 *                     line occur
+	 */
+	public CommandLineBuilder() throws IOException {
+		commandLineFile = File.createTempFile("cobertura.", ".cmdline");
+		commandLineFile.deleteOnExit();
+		commandLineWriter = new FileWriter(commandLineFile);
+	}
+
+	/**
+	 * Adds command line argument. Each argument can be thought as a single cell
+	 * in array passed to main method. This method should not be used after
+	 * arguments were saved.
+	 *
+	 * @param arg command line argument to save
+	 *
+	 * @throws IOException          if problems with temporary file occur
+	 * @throws NullPointerException if <code>arg</code> is <code>null</code>
+	 */
+	public void addArg(String arg) throws IOException {
+		if (arg == null)
+			throw new NullPointerException();
+		commandLineWriter.write(arg + LINESEP);
+	}
+
+	/**
+	 * Adds two command line arguments. Convienience function, calls
+	 * {@link #addArg(String)} two times.
+	 *
+	 * @param arg1 first command line argument to save
+	 * @param arg2 second command line argument to save
+	 *
+	 * @throws IOException          if problems with temporary file occur
+	 * @throws NullPointerException if any <code>arg</code> is <code>null</code>
+	 */
+	public void addArg(String arg1, String arg2) throws IOException {
+		addArg(arg1);
+		addArg(arg2);
+	}
+
+	/**
+	 * Saves options and made file available to use. Use method
+	 * {@link #getCommandLineFile} to get the file the arguments are saved in.
+	 *
+	 * @throws IOException if problems with temporary file occur
+	 */
+	public void saveArgs() throws IOException {
+		commandLineWriter.flush();
+		commandLineWriter.close();
+	}
+
+	/**
+	 * Gets absolute path to the file with saved arguments. Notice, that however
+	 * this method can be used as soon as an instance of this class is created,
+	 * arguments should be read from the file after a call to
+	 * {@link #saveArgs} method.
+	 *
+	 * @return absolute path to the file with arguments
+	 */
+	public String getCommandLineFile() {
+		return commandLineFile.getAbsolutePath();
+	}
+
+	/**
+	 * Explicity frees all resources associated with this instance. Result of
+	 * any other method call after disposing an instance of this class is
+	 * unspecified.
+	 */
+	public void dispose() {
+		commandLineFile.delete();
+	}
+
+	/**
+	 * Loads arguments from file if <code>--commandsfile</code> option is used. Checks
+	 * if passed array contains <code>--commandsfile</code> String, and if
+	 * so arguments from file specified in the very next array cell are read. If
+	 * there are more then one <code>--commandsfile</code> the result is unspecified.
+	 *
+	 * @return The list of arguments read from commandsfile, or
+	 *         <code>args</code> if commandsfile option was not specified
+	 *         or the file cannot be read.
+	 *
+	 * @throws NullPointerException     if args is null, or any argument is null
+	 * @throws IllegalArgumentException if --commandsfile is specified as last option
+	 * @throws IOException              if I/O related error with temporary command line file occur
+	 */
+	public static String[] preprocessCommandLineArguments(String[] args)
+			throws IOException {
+		boolean hasCommandsFile = false;
+		String commandsFileName = null;
+		for (int i = 0; i < args.length; i++) {
+			if (args[i].equals("--commandsfile")) {
+				if (i == args.length - 1) {
+					throw new IllegalArgumentException(
+							"'--commandsfile' specified as last option.");
+				}
+				hasCommandsFile = true;
+				commandsFileName = args[++i];
+			}
+		}
+
+		if (hasCommandsFile) {
+			List arglist = new ArrayList();
+			BufferedReader bufferedReader = null;
+
+			try {
+				bufferedReader = new BufferedReader(new FileReader(
+						commandsFileName));
+				String line;
+
+				while ((line = bufferedReader.readLine()) != null)
+					arglist.add(line);
+
+			} catch (IOException e) {
+				logger
+						.info("I/O error when reading temporary commands file",
+								e);
+				throw new IOException("Unable to read temporary commands file "
+						+ commandsFileName + ".");
+			} finally {
+				if (bufferedReader != null) {
+					try {
+						bufferedReader.close();
+					} catch (IOException e) {
+					}
+				}
+			}
+
+			args = (String[]) arglist.toArray(new String[arglist.size()]);
+		}
+		return args;
+	}
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/util/ConfigurationUtil.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/ConfigurationUtil.java
new file mode 100644
index 0000000..35c8462
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/ConfigurationUtil.java
@@ -0,0 +1,103 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2007 Joakim Erdfelt
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Properties;
+
+/**
+ * A Utility Class to load the configuration.
+ * <p/>
+ * Checks for values using the following hierarchy.
+ * 1) System Property matching key.
+ * 2) cobertura.properties Resource Property matching key.
+ * 3) hardcoded default value
+ *
+ * @author Joakim Erdfelt
+ */
+public class ConfigurationUtil {
+	public static final String RESOURCE = "/cobertura.properties";
+
+	private Properties props;
+
+	public ConfigurationUtil() {
+		init();
+	}
+
+	public void init() {
+		props = new Properties();
+
+		URL url = this.getClass().getResource(RESOURCE);
+		if (url == null) {
+			DEBUG("Unable to find configuration resource in classpath of name "
+					+ RESOURCE + ", using empty configuration.");
+			return;
+		}
+
+		InputStream is = null;
+		try {
+			is = url.openStream();
+			props.load(is);
+		} catch (IOException e) {
+			System.err.println("ERROR: Unable to load configuration resource "
+					+ RESOURCE + " - " + e.getMessage());
+		} finally {
+			IOUtil.closeInputStream(is);
+		}
+	}
+
+	public String getProperty(String key, String defvalue) {
+		String value = System.getProperty(key);
+		if (value != null) {
+			DEBUG("Using system property value [" + value + "] for key [" + key
+					+ "]");
+			return value;
+		}
+
+		value = props.getProperty(key);
+		if (value != null) {
+			DEBUG("Using cobertura.properties value [" + value + "] for key ["
+					+ key + "]");
+			return value;
+		}
+
+		DEBUG("Using default value [" + defvalue + "] for key [" + key + "]");
+		return defvalue;
+	}
+
+	public String getDatafile() {
+		return getProperty("net.sourceforge.cobertura.datafile",
+				"cobertura.ser");
+	}
+
+	/**
+	 * Poor mans debugging.
+	 * Intentionally didn't use log4j, as we dont want to introduce that dependency on instrumented files.
+	 */
+	private void DEBUG(String msg) {
+		if (false) {
+			System.out.println("[Cobertura:ConfigurationUtil] " + msg);
+		}
+	}
+}
diff --git a/src/net/sourceforge/cobertura/util/FileFinder.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/FileFinder.java
similarity index 61%
rename from src/net/sourceforge/cobertura/util/FileFinder.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/FileFinder.java
index 10c5dd4..3c19aa4 100644
--- a/src/net/sourceforge/cobertura/util/FileFinder.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/FileFinder.java
@@ -1,286 +1,283 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2009 Charlie Squires
- * Copyright (C) 2009 John Lewis
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-import org.apache.log4j.Logger;
-
-
-/**
- * Maps source file names to existing files. After adding description
- * of places files can be found in, it can be used to localize 
- * the files. 
- * 
- * <p>
- * FileFinder supports two types of source files locations:
- * <ul>
- *     <li>source root directory, defines the directory under 
- *     which source files are located,</li>
- *     <li>pair (base directory, file path relative to base directory).</li>
- * </ul>
- * The difference between these two is that in case of the first you add all
- * source files under the specified root directory, and in the second you add
- * exactly one file. In both cases file to be found has to be located under 
- * subdirectory that maps to package definition provided with the source file name.      
- *  
- * @author Jeremy Thomerson
- */
-public class FileFinder {
-
-	private static Logger LOGGER = Logger.getLogger(FileFinder.class);
-	
-	// Contains Strings with directory paths
-	private Set sourceDirectories = new HashSet();
-	
-	// Contains pairs (String directoryRoot, Set fileNamesRelativeToRoot)
-	private Map sourceFilesMap = new HashMap();
-
-	/**
-	 * Adds directory that is a root of sources. A source file
-	 * that is under this directory will be found if relative
-	 * path to the file from root matches package name.
-	 * <p>
-	 * Example:
-	 * <pre>
-	 * fileFinder.addSourceDirectory( "C:/MyProject/src/main");
-	 * fileFinder.addSourceDirectory( "C:/MyProject/src/test");
-	 * </pre>
-	 * In path both / and \ can be used.
-	 * </p> 
-	 * 
-	 * @param directory The root of source files 
-	 * @throws NullPointerException if <code>directory</code> is <code>null</code>
-	 */
-	public void addSourceDirectory( String directory) {
-		if( LOGGER.isDebugEnabled())
-			LOGGER.debug( "Adding sourceDirectory=[" + directory + "]");
-
-		// Change \ to / in case of Windows users
-		directory = getCorrectedPath(directory);
-		sourceDirectories.add(directory);
-	}
-
-	/**
-	 * Adds file by specifying root directory and relative path to the
-	 * file in it. Adds exactly one file, relative path should match
-	 * package that the source file is in, otherwise it will be not
-	 * found later.
-	 * <p>
-	 * Example:
-	 * <pre>
-	 * fileFinder.addSourceFile( "C:/MyProject/src/main", "com/app/MyClass.java");
-	 * fileFinder.addSourceFile( "C:/MyProject/src/test", "com/app/MyClassTest.java");
-	 * </pre>
-	 * In paths both / and \ can be used.
-	 * </p>
-	 * 
-	 * @param baseDir sources root directory
-	 * @param file path to source file relative to <code>baseDir</code>
-	 * @throws NullPointerException if either <code>baseDir</code> or <code>file</code> is <code>null</code>
-	 */
-	public void addSourceFile( String baseDir, String file) {
-		if( LOGGER.isDebugEnabled())
-			LOGGER.debug( "Adding sourceFile baseDir=[" + baseDir + "] file=[" + file + "]");
-
-		if( baseDir==null || file==null)
-			throw new NullPointerException();
-	
-		// Change \ to / in case of Windows users
-		file = getCorrectedPath( file);
-		baseDir = getCorrectedPath( baseDir);
-		
-		// Add file to sourceFilesMap
-		Set container = (Set) sourceFilesMap.get(baseDir);
-		if( container==null) {
-			container = new HashSet();
-			sourceFilesMap.put( baseDir, container);
-		}
-		container.add( file);
-	}
-
-	/**
-	 * Maps source file name to existing file.
-	 * When mapping file name first values that were added with
-	 * {@link #addSourceDirectory} and later added with {@link #addSourceFile} are checked.
-	 * 
-	 * @param fileName source file to be mapped
-	 * @return existing file that maps to passed sourceFile 
-	 * @throws IOException if cannot map source file to existing file
-	 * @throws NullPointerException if fileName is null
-	 */
-	public File getFileForSource(String fileName) throws IOException {
-		// Correct file name
-		if( LOGGER.isDebugEnabled())
-			LOGGER.debug( "Searching for file, name=[" + fileName + "]");
-		fileName = getCorrectedPath( fileName);
-
-		// Check inside sourceDirectories
-		for( Iterator it=sourceDirectories.iterator(); it.hasNext();) {
-			String directory = (String)it.next();
-			File file = new File( directory, fileName);
-			if( file.isFile()) {
-				LOGGER.debug( "Found inside sourceDirectories");
-				return file;
-			}
-		}
-		
-		// Check inside sourceFilesMap
-		for( Iterator it=sourceFilesMap.keySet().iterator(); it.hasNext();) {
-			String directory = (String)it.next();
-			Set container = (Set) sourceFilesMap.get(directory);
-			if( !container.contains( fileName))
-				continue;
-			File file = new File( directory, fileName);
-			if( file.isFile()) {
-				LOGGER.debug( "Found inside sourceFilesMap");
-				return file;
-			}
-		}
-
-		// Have not found? Throw an error.
-		LOGGER.debug( "File not found");
-		throw new IOException( "Cannot find source file, name=["+fileName+"]");
-	}
-	
-	/**
-	 * Maps source file name to existing file or source archive.
-	 * When mapping file name first values that were added with
-	 * {@link #addSourceDirectory} and later added with {@link #addSourceFile} are checked.
-	 * 
-	 * @param fileName source file to be mapped
-	 * @return Source that maps to passed sourceFile or null if it can't be found
-	 * @throws NullPointerException if fileName is null
-	 */
-	public Source getSource(String fileName) {
-		File file = null;
-		try
-		{
-			file = getFileForSource(fileName);
-			return new Source(new FileInputStream(file), file);
-		}
-		catch (IOException e)
-		{
-			//Source file wasn't found. Try searching archives.
-			return searchJarsForSource(fileName);
-		}
-		
-	}
-
-	/**
-	 * Gets a BufferedReader for a file within a jar.
-	 * 
-	 * @param fileName source file to get an input stream for
-	 * @return Source for existing file inside a jar that maps to passed sourceFile 
-	 * or null if cannot map source file to existing file
-	 */
-	private Source searchJarsForSource(String fileName) {
-		//Check inside jars in sourceDirectories
-		for( Iterator it=sourceDirectories.iterator(); it.hasNext();) {
-			String directory = (String)it.next();
-			File file = new File(directory);
-			//Get a list of jars and zips in the directory
-			String[] jars = file.list(new JarZipFilter());
-			if(jars != null) {
-				for(String jar : jars) {
-					try
-					{
-						LOGGER.debug("Looking for: " + fileName + " in "+ jar);
-						JarFile jf = new JarFile(directory + "/" + jar);
-	
-						//Get a list of files in the jar
-						Enumeration<JarEntry> files = jf.entries();
-						//See if the jar has the class we need
-						while(files.hasMoreElements()) {
-							JarEntry entry = files.nextElement();
-							if(entry.getName().equals(fileName)) {
-								return new Source(jf.getInputStream(entry), jf);
-							}
-						}
-					}
-					catch (Throwable t)
-					{
-						LOGGER.warn("Error while reading " + jar, t);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns a list with string for all source directories.
-	 * Example: <code>[C:/MyProject/src/main,C:/MyProject/src/test]</code>
-	 * 
-	 * @return list with Strings for all source roots, or empty list if no source roots were specified 
-	 */
-	public List getSourceDirectoryList() {
-		// Get names from sourceDirectories
-		List result = new ArrayList();
-		for( Iterator it=sourceDirectories.iterator(); it.hasNext();) {
-			result.add( it.next());
-		}
-		
-		// Get names from sourceFilesMap
-		for( Iterator it=sourceFilesMap.keySet().iterator(); it.hasNext();) {
-			result.add(it.next());
-		}
-		
-		// Return combined names
-		return result;
-	}
-
-    private String getCorrectedPath(String path) {
-        return path.replace('\\', '/');
-    }
-
-    /**
-     * Returns string representation of FileFinder.
-     */
-    public String toString() {
-    	return "FileFinder, source directories: " + getSourceDirectoryList().toString();
-    }
-    
-    /**
-     * A filter that accepts files that end in .jar or .zip
-     */
-    private class JarZipFilter implements FilenameFilter {
-		public boolean accept(File dir, String name) {
-			return(name.endsWith(".jar") || name.endsWith(".zip"));
-		}
-    }
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Jeremy Thomerson
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2009 Charlie Squires
+ * Copyright (C) 2009 John Lewis
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.*;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Maps source file names to existing files. After adding description
+ * of places files can be found in, it can be used to localize
+ * the files.
+ * <p/>
+ * <p/>
+ * FileFinder supports two types of source files locations:
+ * <ul>
+ * <li>source root directory, defines the directory under
+ * which source files are located,</li>
+ * <li>pair (base directory, file path relative to base directory).</li>
+ * </ul>
+ * The difference between these two is that in case of the first you add all
+ * source files under the specified root directory, and in the second you add
+ * exactly one file. In both cases file to be found has to be located under
+ * subdirectory that maps to package definition provided with the source file name.
+ *
+ * @author Jeremy Thomerson
+ */
+public class FileFinder {
+
+	private static Logger LOGGER = LoggerFactory.getLogger(FileFinder.class);
+
+	// Contains Strings with directory paths
+	private Set sourceDirectories = new HashSet();
+
+	// Contains pairs (String directoryRoot, Set fileNamesRelativeToRoot)
+	private Map sourceFilesMap = new HashMap();
+
+	/**
+	 * Adds directory that is a root of sources. A source file
+	 * that is under this directory will be found if relative
+	 * path to the file from root matches package name.
+	 * <p>
+	 * Example:
+	 * <pre>
+	 * fileFinder.addSourceDirectory( "C:/MyProject/src/main");
+	 * fileFinder.addSourceDirectory( "C:/MyProject/src/test");
+	 * </pre>
+	 * In path both / and \ can be used.
+	 * </p>
+	 *
+	 * @param directory The root of source files
+	 *
+	 * @throws NullPointerException if <code>directory</code> is <code>null</code>
+	 */
+	public void addSourceDirectory(String directory) {
+		if (LOGGER.isDebugEnabled())
+			LOGGER.debug("Adding sourceDirectory=[" + directory + "]");
+
+		// Change \ to / in case of Windows users
+		directory = getCorrectedPath(directory);
+		sourceDirectories.add(directory);
+	}
+
+	/**
+	 * Adds file by specifying root directory and relative path to the
+	 * file in it. Adds exactly one file, relative path should match
+	 * package that the source file is in, otherwise it will be not
+	 * found later.
+	 * <p>
+	 * Example:
+	 * <pre>
+	 * fileFinder.addSourceFile( "C:/MyProject/src/main", "com/app/MyClass.java");
+	 * fileFinder.addSourceFile( "C:/MyProject/src/test", "com/app/MyClassTest.java");
+	 * </pre>
+	 * In paths both / and \ can be used.
+	 * </p>
+	 *
+	 * @param baseDir sources root directory
+	 * @param file    path to source file relative to <code>baseDir</code>
+	 *
+	 * @throws NullPointerException if either <code>baseDir</code> or <code>file</code> is <code>null</code>
+	 */
+	public void addSourceFile(String baseDir, String file) {
+		if (LOGGER.isDebugEnabled())
+			LOGGER.debug("Adding sourceFile baseDir=[" + baseDir + "] file=["
+					+ file + "]");
+
+		if (baseDir == null || file == null)
+			throw new NullPointerException();
+
+		// Change \ to / in case of Windows users
+		file = getCorrectedPath(file);
+		baseDir = getCorrectedPath(baseDir);
+
+		// Add file to sourceFilesMap
+		Set container = (Set) sourceFilesMap.get(baseDir);
+		if (container == null) {
+			container = new HashSet();
+			sourceFilesMap.put(baseDir, container);
+		}
+		container.add(file);
+	}
+
+	/**
+	 * Maps source file name to existing file.
+	 * When mapping file name first values that were added with
+	 * {@link #addSourceDirectory} and later added with {@link #addSourceFile} are checked.
+	 *
+	 * @param fileName source file to be mapped
+	 *
+	 * @return existing file that maps to passed sourceFile
+	 *
+	 * @throws IOException          if cannot map source file to existing file
+	 * @throws NullPointerException if fileName is null
+	 */
+	public File getFileForSource(String fileName) throws IOException {
+		// Correct file name
+		if (LOGGER.isDebugEnabled())
+			LOGGER.debug("Searching for file, name=[" + fileName + "]");
+		fileName = getCorrectedPath(fileName);
+
+		// Check inside sourceDirectories
+		for (Iterator it = sourceDirectories.iterator(); it.hasNext();) {
+			String directory = (String) it.next();
+			File file = new File(directory, fileName);
+			if (file.isFile()) {
+				LOGGER.debug("Found inside sourceDirectories");
+				return file;
+			}
+		}
+
+		// Check inside sourceFilesMap
+		for (Iterator it = sourceFilesMap.keySet().iterator(); it.hasNext();) {
+			String directory = (String) it.next();
+			Set container = (Set) sourceFilesMap.get(directory);
+			if (!container.contains(fileName))
+				continue;
+			File file = new File(directory, fileName);
+			if (file.isFile()) {
+				LOGGER.debug("Found inside sourceFilesMap");
+				return file;
+			}
+		}
+
+		// Have not found? Throw an error.
+		LOGGER.debug("File not found");
+		throw new IOException("Cannot find source file, name=[" + fileName
+				+ "]");
+	}
+
+	/**
+	 * Maps source file name to existing file or source archive.
+	 * When mapping file name first values that were added with
+	 * {@link #addSourceDirectory} and later added with {@link #addSourceFile} are checked.
+	 *
+	 * @param fileName source file to be mapped
+	 *
+	 * @return Source that maps to passed sourceFile or null if it can't be found
+	 *
+	 * @throws NullPointerException if fileName is null
+	 */
+	public Source getSource(String fileName) {
+		File file = null;
+		try {
+			file = getFileForSource(fileName);
+			return new Source(new FileInputStream(file), file);
+		} catch (IOException e) {
+			//Source file wasn't found. Try searching archives.
+			return searchJarsForSource(fileName);
+		}
+
+	}
+
+	/**
+	 * Gets a BufferedReader for a file within a jar.
+	 *
+	 * @param fileName source file to get an input stream for
+	 *
+	 * @return Source for existing file inside a jar that maps to passed sourceFile
+	 *         or null if cannot map source file to existing file
+	 */
+	private Source searchJarsForSource(String fileName) {
+		//Check inside jars in sourceDirectories
+		for (Iterator it = sourceDirectories.iterator(); it.hasNext();) {
+			String directory = (String) it.next();
+			File file = new File(directory);
+			//Get a list of jars and zips in the directory
+			String[] jars = file.list(new JarZipFilter());
+			if (jars != null) {
+				for (String jar : jars) {
+					try {
+						LOGGER.debug("Looking for: " + fileName + " in " + jar);
+						JarFile jf = new JarFile(directory + "/" + jar);
+
+						//Get a list of files in the jar
+						Enumeration<JarEntry> files = jf.entries();
+						//See if the jar has the class we need
+						while (files.hasMoreElements()) {
+							JarEntry entry = files.nextElement();
+							if (entry.getName().equals(fileName)) {
+								return new Source(jf.getInputStream(entry), jf);
+							}
+						}
+					} catch (Throwable t) {
+						LOGGER.warn("Error while reading " + jar, t);
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns a list with string for all source directories.
+	 * Example: <code>[C:/MyProject/src/main,C:/MyProject/src/test]</code>
+	 *
+	 * @return list with Strings for all source roots, or empty list if no source roots were specified
+	 */
+	public List getSourceDirectoryList() {
+		// Get names from sourceDirectories
+		List result = new ArrayList();
+		for (Iterator it = sourceDirectories.iterator(); it.hasNext();) {
+			result.add(it.next());
+		}
+
+		// Get names from sourceFilesMap
+		for (Iterator it = sourceFilesMap.keySet().iterator(); it.hasNext();) {
+			result.add(it.next());
+		}
+
+		// Return combined names
+		return result;
+	}
+
+	private String getCorrectedPath(String path) {
+		return path.replace('\\', '/');
+	}
+
+	/**
+	 * Returns string representation of FileFinder.
+	 */
+	public String toString() {
+		return "FileFinder, source directories: "
+				+ getSourceDirectoryList().toString();
+	}
+
+	/**
+	 * A filter that accepts files that end in .jar or .zip
+	 */
+	private class JarZipFilter implements FilenameFilter {
+		public boolean accept(File dir, String name) {
+			return (name.endsWith(".jar") || name.endsWith(".zip"));
+		}
+	}
+}
diff --git a/src/net/sourceforge/cobertura/util/FileLocker.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/FileLocker.java
similarity index 55%
rename from src/net/sourceforge/cobertura/util/FileLocker.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/FileLocker.java
index e8a21d9..75cfc7c 100644
--- a/src/net/sourceforge/cobertura/util/FileLocker.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/FileLocker.java
@@ -1,209 +1,196 @@
-/* Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2006 Mark Doliner
- * Copyright (C) 2009 Chris van Es
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License 1.1 (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.RandomAccessFile;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * This class controls access to any file so that multiple JVMs will
- * not be able to write to the file at the same time.
- *
- * A file called "filename.lock" is created and Java's FileLock class
- * is used to lock the file.
- *
- * The java.nio classes were introduced in Java 1.4, so this class
- * does a no-op when used with Java 1.3.  The class maintains
- * compatability with Java 1.3 by accessing the java.nio classes
- * using reflection.
- *
- * @author John Lewis
- * @author Mark Doliner
- */
-public class FileLocker
-{
-
-	/**
-	 * An object of type FileLock, created using reflection.
-	 */
-	private Object lock = null;
-
-	/**
-	 * An object of type FileChannel, created using reflection.
-	 */
-	private Object lockChannel = null;
-
-	/**
-	 * A file called "filename.lock" that resides in the same directory
-	 * as "filename"
-	 */
-	private File lockFile;
-
-	public FileLocker(File file)
-	{
-		String lockFileName = file.getName() + ".lock";
-		File parent = file.getParentFile();
-		if (parent == null)
-		{
-			lockFile = new File(lockFileName);
-		}
-		else
-		{
-			lockFile = new File(parent, lockFileName);
-		}
-	}
-
-	/**
-	 * Obtains a lock on the file.  This blocks until the lock is obtained.
-	 */
-	public boolean lock()
-	{
-		String useNioProperty = System.getProperty("cobertura.use.java.nio");
-		if (System.getProperty("java.version").startsWith("1.3") ||
-				((useNioProperty != null) && useNioProperty.equalsIgnoreCase("false")))
-		{
-			return true;
-		}
-
-		try
-		{
-			Class aClass = Class.forName("java.io.RandomAccessFile");
-			Method method = aClass.getDeclaredMethod("getChannel", (Class[])null);
-			lockChannel = method.invoke(new RandomAccessFile(lockFile, "rw"), (Object[])null);
-		}
-		catch (FileNotFoundException e)
-		{
-			System.err.println("Unable to get lock channel for " + lockFile.getAbsolutePath()
-					+ ": " + e.getLocalizedMessage());
-			return false;
-		}
-		catch (InvocationTargetException e)
-		{
-			System.err.println("Unable to get lock channel for " + lockFile.getAbsolutePath()
-					+ ": " + e.getLocalizedMessage());
-			return false;
-		}
-		catch (Throwable t)
-		{
-			System.err.println("Unable to execute RandomAccessFile.getChannel() using reflection: "
-					+ t.getLocalizedMessage());
-			t.printStackTrace();
-		}
-
-		try
-		{
-			Class aClass = Class.forName("java.nio.channels.FileChannel");
-			Method method = aClass.getDeclaredMethod("lock", (Class[])null);
-			lock = method.invoke(lockChannel, (Object[])null);
-		}
-		catch (InvocationTargetException e)
-		{
-			System.err.println("---------------------------------------");
-			e.printStackTrace(System.err);
-			System.err.println("---------------------------------------");
-			System.err.println("Unable to get lock on " + lockFile.getAbsolutePath() + ": "
-					+ e.getLocalizedMessage());
-			System.err.println("This is known to happen on Linux kernel 2.6.20.");
-			System.err.println("Make sure cobertura.jar is in the root classpath of the jvm ");
-			System.err.println("process running the instrumented code.  If the instrumented code ");
-			System.err.println("is running in a web server, this means cobertura.jar should be in ");
-			System.err.println("the web server's lib directory.");
-			System.err.println("Don't put multiple copies of cobertura.jar in different WEB-INF/lib directories.");
-			System.err.println("Only one classloader should load cobertura.  It should be the root classloader.");
-			System.err.println("---------------------------------------");
-			return false;
-		}
-		catch (Throwable t)
-		{
-			System.err.println("Unable to execute FileChannel.lock() using reflection: "
-					+ t.getLocalizedMessage());
-			t.printStackTrace();
-		}
-
-		return true;
-	}
-
-	/**
-	 * Releases the lock on the file.
-	 */
-	public void release()
-	{
-		if (lock != null)
-			lock = releaseFileLock(lock);
-		
-		if (lockChannel != null)
-			lockChannel = closeChannel(lockChannel);
-		if (!lockFile.delete())
-		{
-			System.err.println("lock file could not be deleted");
-		}
-	}
-
-	private static Object releaseFileLock(Object lock)
-	{
-		try
-		{
-			Class aClass = Class.forName("java.nio.channels.FileLock");
-			Method method = aClass.getDeclaredMethod("isValid", (Class[])null);
-			if (((Boolean)method.invoke(lock, (Object[])null)).booleanValue())
-			{
-				method = aClass.getDeclaredMethod("release", (Class[])null);
-				method.invoke(lock, (Object[])null);
-				lock = null;
-			}
-		}
-		catch (Throwable t)
-		{
-			System.err.println("Unable to release locked file: " + t.getLocalizedMessage());
-		}
-		return lock;
-	}
-
-	private static Object closeChannel(Object channel)
-	{
-		try
-		{
-			Class aClass = Class.forName("java.nio.channels.spi.AbstractInterruptibleChannel");
-			Method method = aClass.getDeclaredMethod("isOpen", (Class[])null);
-			if (((Boolean)method.invoke(channel, (Object[])null)).booleanValue())
-			{
-				method = aClass.getDeclaredMethod("close", (Class[])null);
-				method.invoke(channel, (Object[])null);
-				channel = null;
-			}
-		}
-		catch (Throwable t)
-		{
-			System.err.println("Unable to close file channel: " + t.getLocalizedMessage());
-		}
-		return channel;
-	}
-
-}
+/* Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Mark Doliner
+ * Copyright (C) 2009 Chris van Es
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License 1.1 (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.RandomAccessFile;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * This class controls access to any file so that multiple JVMs will
+ * not be able to write to the file at the same time.
+ * <p/>
+ * A file called "filename.lock" is created and Java's FileLock class
+ * is used to lock the file.
+ * <p/>
+ * The java.nio classes were introduced in Java 1.4, so this class
+ * does a no-op when used with Java 1.3.  The class maintains
+ * compatability with Java 1.3 by accessing the java.nio classes
+ * using reflection.
+ *
+ * @author John Lewis
+ * @author Mark Doliner
+ */
+public class FileLocker {
+
+	/**
+	 * An object of type FileLock, created using reflection.
+	 */
+	private Object lock = null;
+
+	/**
+	 * An object of type FileChannel, created using reflection.
+	 */
+	private Object lockChannel = null;
+
+	/**
+	 * A file called "filename.lock" that resides in the same directory
+	 * as "filename"
+	 */
+	private File lockFile;
+
+	public FileLocker(File file) {
+		String lockFileName = file.getName() + ".lock";
+		File parent = file.getParentFile();
+		if (parent == null) {
+			lockFile = new File(lockFileName);
+		} else {
+			lockFile = new File(parent, lockFileName);
+		}
+	}
+
+	/**
+	 * Obtains a lock on the file.  This blocks until the lock is obtained.
+	 */
+	public boolean lock() {
+		String useNioProperty = System.getProperty("cobertura.use.java.nio");
+		if (System.getProperty("java.version").startsWith("1.3")
+				|| ((useNioProperty != null) && useNioProperty
+						.equalsIgnoreCase("false"))) {
+			return true;
+		}
+
+		try {
+			Class aClass = Class.forName("java.io.RandomAccessFile");
+			Method method = aClass.getDeclaredMethod("getChannel",
+					(Class[]) null);
+			lockChannel = method.invoke(new RandomAccessFile(lockFile, "rw"),
+					(Object[]) null);
+		} catch (FileNotFoundException e) {
+			System.err.println("Unable to get lock channel for "
+					+ lockFile.getAbsolutePath() + ": "
+					+ e.getLocalizedMessage());
+			return false;
+		} catch (InvocationTargetException e) {
+			System.err.println("Unable to get lock channel for "
+					+ lockFile.getAbsolutePath() + ": "
+					+ e.getLocalizedMessage());
+			return false;
+		} catch (Throwable t) {
+			System.err
+					.println("Unable to execute RandomAccessFile.getChannel() using reflection: "
+							+ t.getLocalizedMessage());
+			t.printStackTrace();
+		}
+
+		try {
+			Class aClass = Class.forName("java.nio.channels.FileChannel");
+			Method method = aClass.getDeclaredMethod("lock", (Class[]) null);
+			lock = method.invoke(lockChannel, (Object[]) null);
+		} catch (InvocationTargetException e) {
+			System.err.println("---------------------------------------");
+			e.printStackTrace(System.err);
+			System.err.println("---------------------------------------");
+			System.err.println("Unable to get lock on "
+					+ lockFile.getAbsolutePath() + ": "
+					+ e.getLocalizedMessage());
+			System.err
+					.println("This is known to happen on Linux kernel 2.6.20.");
+			System.err
+					.println("Make sure cobertura.jar is in the root classpath of the jvm ");
+			System.err
+					.println("process running the instrumented code.  If the instrumented code ");
+			System.err
+					.println("is running in a web server, this means cobertura.jar should be in ");
+			System.err.println("the web server's lib directory.");
+			System.err
+					.println("Don't put multiple copies of cobertura.jar in different WEB-INF/lib directories.");
+			System.err
+					.println("Only one classloader should load cobertura.  It should be the root classloader.");
+			System.err.println("---------------------------------------");
+			return false;
+		} catch (Throwable t) {
+			System.err
+					.println("Unable to execute FileChannel.lock() using reflection: "
+							+ t.getLocalizedMessage());
+			t.printStackTrace();
+		}
+
+		return true;
+	}
+
+	/**
+	 * Releases the lock on the file.
+	 */
+	public void release() {
+		if (lock != null)
+			lock = releaseFileLock(lock);
+
+		if (lockChannel != null)
+			lockChannel = closeChannel(lockChannel);
+		if (!lockFile.delete()) {
+			System.err.println("lock file could not be deleted");
+		}
+	}
+
+	private static Object releaseFileLock(Object lock) {
+		try {
+			Class aClass = Class.forName("java.nio.channels.FileLock");
+			Method method = aClass.getDeclaredMethod("isValid", (Class[]) null);
+			if (((Boolean) method.invoke(lock, (Object[]) null)).booleanValue()) {
+				method = aClass.getDeclaredMethod("release", (Class[]) null);
+				method.invoke(lock, (Object[]) null);
+				lock = null;
+			}
+		} catch (Throwable t) {
+			System.err.println("Unable to release locked file: "
+					+ t.getLocalizedMessage());
+		}
+		return lock;
+	}
+
+	private static Object closeChannel(Object channel) {
+		try {
+			Class aClass = Class
+					.forName("java.nio.channels.spi.AbstractInterruptibleChannel");
+			Method method = aClass.getDeclaredMethod("isOpen", (Class[]) null);
+			if (((Boolean) method.invoke(channel, (Object[]) null))
+					.booleanValue()) {
+				method = aClass.getDeclaredMethod("close", (Class[]) null);
+				method.invoke(channel, (Object[]) null);
+				channel = null;
+			}
+		} catch (Throwable t) {
+			System.err.println("Unable to close file channel: "
+					+ t.getLocalizedMessage());
+		}
+		return channel;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/util/Header.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/Header.java
similarity index 74%
rename from src/net/sourceforge/cobertura/util/Header.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/Header.java
index 8cd15e5..35464f1 100644
--- a/src/net/sourceforge/cobertura/util/Header.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/Header.java
@@ -1,42 +1,41 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Erik Dick
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.PrintStream;
-
-public abstract class Header
-{
-
-	public static String version()
-	{
-		Package thisPackage = Header.class.getPackage();
-		return (thisPackage != null ? thisPackage
-				.getImplementationVersion() : "cvs");
-	}
-
-	public static void print(PrintStream out)
-	{
-		out.println("Cobertura " + version() + " - GNU GPL License (NO WARRANTY) - See COPYRIGHT file");
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Erik Dick
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import java.io.PrintStream;
+
+public abstract class Header {
+
+	public static String version() {
+		Package thisPackage = Header.class.getPackage();
+		return (thisPackage != null
+				? thisPackage.getImplementationVersion()
+				: "cvs");
+	}
+
+	public static void print(PrintStream out) {
+		out.println("Cobertura " + version()
+				+ " - GNU GPL License (NO WARRANTY) - See COPYRIGHT file");
+	}
+}
diff --git a/src/net/sourceforge/cobertura/util/IOUtil.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/IOUtil.java
similarity index 70%
rename from src/net/sourceforge/cobertura/util/IOUtil.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/IOUtil.java
index b64c4d6..be312d9 100644
--- a/src/net/sourceforge/cobertura/util/IOUtil.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/IOUtil.java
@@ -1,184 +1,156 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2007 Ignat Zapolsky
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-
-/**
- * Helper class with useful I/O operations.
- * 
- * @author Grzegorz Lukasik
- */
-public abstract class IOUtil
-{
-
-	/**
-	 * Copies bytes from input stream into the output stream.  Stops
-	 * when the input stream read method returns -1.  Does not close
-	 * the streams.
-	 * 
-	 * @throws IOException If either passed stream will throw IOException.
-	 * @throws NullPointerException If either passed stream is null.
-	 */
-	public static void copyStream(InputStream in, OutputStream out)
-			throws IOException
-	{
-		// NullPointerException is explicity thrown to guarantee expected behaviour
-		if (in == null || out == null)
-			throw new NullPointerException();
-
-		int el;
-		byte[] buffer = new byte[1 << 15];
-		while ((el = in.read(buffer)) != -1)
-		{
-			out.write(buffer, 0, el);
-		}
-	}
-
-	/**
-	 * Returns an array that contains values read from the
-	 * given input stream.
-	 * 
-	 * @throws NullPointerException If null stream is passed.
-	 */
-	public static byte[] createByteArrayFromInputStream(InputStream in)
-			throws IOException
-	{
-		ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
-		copyStream(in, byteArray);
-		return byteArray.toByteArray();
-	}
-
-	/**
-	 * Moves a file from one location to other.
-	 *
-	 * @throws IOException If IO exception occur during moving.
-	 * @throws NullPointerException If either passed file is null.
-	 */
-	public static void moveFile(File sourceFile, File destinationFile)
-			throws IOException
-	{
-		if (destinationFile.exists())
-		{
-			destinationFile.delete();
-		}
-
-		// Move file using File method if possible
-		boolean succesfulMove = sourceFile.renameTo(destinationFile);
-		if (succesfulMove)
-			return;
-
-		// Copy file from source to destination
-		InputStream in = null;
-		OutputStream out = null;
-		try
-		{
-			in = new FileInputStream(sourceFile);
-			out = new FileOutputStream(destinationFile);
-			copyStream(in, out);
-		}
-		finally
-		{
-			in = closeInputStream(in);
-			out = closeOutputStream(out);
-		}
-
-		// Remove source file
-		sourceFile.delete();
-	}
-
-	/**
-	 * Closes an input stream.
-	 * 
-	 * @param in The stream to close.
-	 * @return null unless an exception was thrown while closing, else
-	 *         returns the stream
-	 */
-	public static InputStream closeInputStream(InputStream in)
-	{
-		if (in != null)
-		{
-			try
-			{
-				in.close();
-				in = null;
-			}
-			catch (IOException e)
-			{
-				System.err.println("Cobertura: Error closing input stream.");
-				e.printStackTrace();
-			}
-		}
-		return in;
-	}
-
-	/**
-	 * Closes an output stream.
-	 * 
-	 * @param out The stream to close.
-	 * @return null unless an exception was thrown while closing, else
-	 *         returns the stream.
-	 */
-	public static OutputStream closeOutputStream(OutputStream out)
-	{
-		if (out != null)
-		{
-			try
-			{
-				out.close();
-				out = null;
-			}
-			catch (IOException e)
-			{
-				System.err.println("Cobertura: Error closing output stream.");
-				e.printStackTrace();
-			}
-		}
-		return out;
-	}
-
-	public static PrintWriter getPrintWriter(File file) throws UnsupportedEncodingException, FileNotFoundException
-	{
-		Writer osWriter = new BufferedWriter (new OutputStreamWriter(new FileOutputStream(file), "UTF-8"), 16384);
-		PrintWriter pw = new PrintWriter(osWriter, false);
-		return pw;
-	}
-	
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2007 Ignat Zapolsky
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import java.io.*;
+
+/**
+ * Helper class with useful I/O operations.
+ *
+ * @author Grzegorz Lukasik
+ */
+public abstract class IOUtil {
+
+	/**
+	 * Copies bytes from input stream into the output stream.  Stops
+	 * when the input stream read method returns -1.  Does not close
+	 * the streams.
+	 *
+	 * @throws IOException          If either passed stream will throw IOException.
+	 * @throws NullPointerException If either passed stream is null.
+	 */
+	public static void copyStream(InputStream in, OutputStream out)
+			throws IOException {
+		// NullPointerException is explicity thrown to guarantee expected behaviour
+		if (in == null || out == null)
+			throw new NullPointerException();
+
+		int el;
+		byte[] buffer = new byte[1 << 15];
+		while ((el = in.read(buffer)) != -1) {
+			out.write(buffer, 0, el);
+		}
+	}
+
+	/**
+	 * Returns an array that contains values read from the
+	 * given input stream.
+	 *
+	 * @throws NullPointerException If null stream is passed.
+	 */
+	public static byte[] createByteArrayFromInputStream(InputStream in)
+			throws IOException {
+		ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
+		copyStream(in, byteArray);
+		return byteArray.toByteArray();
+	}
+
+	/**
+	 * Moves a file from one location to other.
+	 *
+	 * @throws IOException          If IO exception occur during moving.
+	 * @throws NullPointerException If either passed file is null.
+	 */
+	public static void moveFile(File sourceFile, File destinationFile)
+			throws IOException {
+		if (destinationFile.exists()) {
+			destinationFile.delete();
+		}
+
+		// Move file using File method if possible
+		boolean succesfulMove = sourceFile.renameTo(destinationFile);
+		if (succesfulMove)
+			return;
+
+		// Copy file from source to destination
+		InputStream in = null;
+		OutputStream out = null;
+		try {
+			in = new FileInputStream(sourceFile);
+			out = new FileOutputStream(destinationFile);
+			copyStream(in, out);
+		} finally {
+			in = closeInputStream(in);
+			out = closeOutputStream(out);
+		}
+
+		// Remove source file
+		sourceFile.delete();
+	}
+
+	/**
+	 * Closes an input stream.
+	 *
+	 * @param in The stream to close.
+	 *
+	 * @return null unless an exception was thrown while closing, else
+	 *         returns the stream
+	 */
+	public static InputStream closeInputStream(InputStream in) {
+		if (in != null) {
+			try {
+				in.close();
+				in = null;
+			} catch (IOException e) {
+				System.err.println("Cobertura: Error closing input stream.");
+				e.printStackTrace();
+			}
+		}
+		return in;
+	}
+
+	/**
+	 * Closes an output stream.
+	 *
+	 * @param out The stream to close.
+	 *
+	 * @return null unless an exception was thrown while closing, else
+	 *         returns the stream.
+	 */
+	public static OutputStream closeOutputStream(OutputStream out) {
+		if (out != null) {
+			try {
+				out.close();
+				out = null;
+			} catch (IOException e) {
+				System.err.println("Cobertura: Error closing output stream.");
+				e.printStackTrace();
+			}
+		}
+		return out;
+	}
+
+	public static PrintWriter getPrintWriter(File file)
+			throws UnsupportedEncodingException, FileNotFoundException {
+		Writer osWriter = new BufferedWriter(new OutputStreamWriter(
+				new FileOutputStream(file), "UTF-8"), 16384);
+		PrintWriter pw = new PrintWriter(osWriter, false);
+		return pw;
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/util/RegexUtil.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/RegexUtil.java
similarity index 76%
rename from src/net/sourceforge/cobertura/util/RegexUtil.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/RegexUtil.java
index 98ea70f..c5c171c 100644
--- a/src/net/sourceforge/cobertura/util/RegexUtil.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/RegexUtil.java
@@ -1,90 +1,84 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.log4j.Logger;
-import org.apache.oro.text.regex.MalformedPatternException;
-import org.apache.oro.text.regex.Pattern;
-import org.apache.oro.text.regex.Perl5Compiler;
-import org.apache.oro.text.regex.Perl5Matcher;
-
-/**
- * Abstract, not to be instantiated utility class for Regex functions.
- * 
- * @author John Lewis (logic copied from MethodInstrumenter)
- */
-public abstract class RegexUtil
-{
-
-	private static final Logger logger = Logger.getLogger(RegexUtil.class);
-
-	private final static Perl5Matcher pm = new Perl5Matcher();
-
-	/**
-	 * <p>
-	 * Check to see if one of the regular expressions in a collection match
-	 * an input string.
-	 * </p>
-	 *
-	 * @param regexs The collection of regular expressions.
-	 * @param str The string to check for a match.
-	 * @return True if a match is found.
-	 */
-	public static boolean matches(Collection regexs, String str)
-	{
-		Iterator iter = regexs.iterator();
-		while (iter.hasNext())
-		{
-			Pattern regex = (Pattern)iter.next();
-			if (pm.matches(str, regex))
-			{
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	public static void addRegex(Collection list, String regex)
-	{
-		try
-		{
-			Perl5Compiler pc = new Perl5Compiler();
-			Pattern pattern = pc.compile(regex);
-			list.add(pattern);
-		}
-		catch (MalformedPatternException e)
-		{
-			logger.warn("The regular expression " + regex + " is invalid: "
-					+ e.getLocalizedMessage());
-		}
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2006 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import org.apache.oro.text.regex.MalformedPatternException;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.Perl5Compiler;
+import org.apache.oro.text.regex.Perl5Matcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Abstract, not to be instantiated utility class for Regex functions.
+ *
+ * @author John Lewis (logic copied from MethodInstrumenter)
+ */
+public abstract class RegexUtil {
+
+	private static final Logger logger = LoggerFactory
+			.getLogger(RegexUtil.class);
+
+	private final static Perl5Matcher pm = new Perl5Matcher();
+
+	/**
+	 * <p>
+	 * Check to see if one of the regular expressions in a collection match
+	 * an input string.
+	 * </p>
+	 *
+	 * @param regexs The collection of regular expressions.
+	 * @param str    The string to check for a match.
+	 *
+	 * @return True if a match is found.
+	 */
+	public static boolean matches(Collection<Pattern> regexs, String str) {
+		Iterator<Pattern> iter = regexs.iterator();
+		while (iter.hasNext()) {
+			Pattern regex = iter.next();
+			if (pm.matches(str, regex)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public static void addRegex(Collection<Pattern> list, String regex) {
+		try {
+			Perl5Compiler pc = new Perl5Compiler();
+			Pattern pattern = pc.compile(regex);
+			list.add(pattern);
+		} catch (MalformedPatternException e) {
+			logger.warn("The regular expression " + regex + " is invalid: "
+					+ e.getLocalizedMessage());
+		}
+	}
+
+}
diff --git a/cobertura/src/main/java/net/sourceforge/cobertura/util/ShutdownHooks.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/ShutdownHooks.java
new file mode 100644
index 0000000..711d8cb
--- /dev/null
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/ShutdownHooks.java
@@ -0,0 +1,29 @@
+package net.sourceforge.cobertura.util;
+import net.sourceforge.cobertura.coveragedata.*;
+public class ShutdownHooks {
+
+	public static void saveGlobalProjectDataWithTomcatInits() {
+		// Hack for Tomcat - by saving project data right now we force loading
+		// of classes involved in this process (like ObjectOutputStream)
+		// so that it won't be necessary to load them on JVM shutdown
+		if (System.getProperty("catalina.home") != null) {
+			ProjectData.saveGlobalProjectData();
+			// Force the class loader to load some classes that are
+			// required by our JVM shutdown hook.
+			// TODO: Use ClassLoader.loadClass("whatever"); instead
+			ClassData.class.toString();
+			CoverageData.class.toString();
+			CoverageDataContainer.class.toString();
+			FileLocker.class.toString();
+			LineData.class.toString();
+			PackageData.class.toString();
+			SourceFileData.class.toString();
+		}
+
+		// Add a hook to save the data when the JVM exits
+		Runtime.getRuntime().addShutdownHook(new Thread(new SaveTimer()));
+		// Possibly also save the coverage data every x seconds?
+		//Timer timer = new Timer(true);
+		//timer.schedule(saveTimer, 100);
+	}
+}
\ No newline at end of file
diff --git a/src/net/sourceforge/cobertura/util/Source.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/Source.java
similarity index 76%
rename from src/net/sourceforge/cobertura/util/Source.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/Source.java
index 3cddba4..7f9f228 100644
--- a/src/net/sourceforge/cobertura/util/Source.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/Source.java
@@ -1,95 +1,83 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2009 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.util;
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.zip.ZipFile;
-
-import org.apache.log4j.Logger;
-
-public class Source {
-	private InputStream is;
-	
-	//streamOrigin is either a File or a ZipFile
-	private Object streamOrigin;
-	
-	private static Logger LOGGER = Logger.getLogger(Source.class);
-
-	public Source(InputStream is, Object streamOrigin)
-	{
-		this.is = is;
-		this.streamOrigin = streamOrigin;
-	}
-	
-	public InputStream getInputStream()
-	{
-		return is;
-	}
-	
-	/**
-	 * Close the source input stream and the archive if it came from one.
-	 * 
-	 * This will not throw anything.   Any throwable is caught and a warning is logged.
-	 */
-	public void close()
-	{
-		try
-		{
-			is.close();
-		}
-		catch (Throwable t)
-		{
-			LOGGER.warn("Failure closing input stream for " + getOriginDesc(), t);
-		}
-		
-		if (streamOrigin instanceof ZipFile)
-		{
-			try
-			{
-				((ZipFile) streamOrigin).close();
-			}
-			catch (Throwable t)
-			{
-				LOGGER.warn("Failure closing " + getOriginDesc(), t);
-			}
-		}
-	}
-	
-	public String getOriginDesc()
-	{
-		String ret = "";
-		
-		if (streamOrigin instanceof File)
-		{
-			ret = "file " + ((File) streamOrigin).getAbsolutePath();
-		}
-		else
-		{
-			ret = "archive " + ((ZipFile) streamOrigin).getName();
-		}
-		return ret;
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2009 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.util;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.zip.ZipFile;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Source {
+	private InputStream is;
+
+	//streamOrigin is either a File or a ZipFile
+	private Object streamOrigin;
+
+	private static Logger LOGGER = LoggerFactory.getLogger(Source.class);
+
+	public Source(InputStream is, Object streamOrigin) {
+		this.is = is;
+		this.streamOrigin = streamOrigin;
+	}
+
+	public InputStream getInputStream() {
+		return is;
+	}
+
+	/**
+	 * Close the source input stream and the archive if it came from one.
+	 * <p/>
+	 * This will not throw anything.   Any throwable is caught and a warning is logged.
+	 */
+	public void close() {
+		try {
+			is.close();
+		} catch (Throwable t) {
+			LOGGER.warn("Failure closing input stream for " + getOriginDesc(),
+					t);
+		}
+
+		if (streamOrigin instanceof ZipFile) {
+			try {
+				((ZipFile) streamOrigin).close();
+			} catch (Throwable t) {
+				LOGGER.warn("Failure closing " + getOriginDesc(), t);
+			}
+		}
+	}
+
+	public String getOriginDesc() {
+		String ret = "";
+
+		if (streamOrigin instanceof File) {
+			ret = "file " + ((File) streamOrigin).getAbsolutePath();
+		} else {
+			ret = "archive " + ((ZipFile) streamOrigin).getName();
+		}
+		return ret;
+	}
+}
diff --git a/src/net/sourceforge/cobertura/util/StringUtil.java b/cobertura/src/main/java/net/sourceforge/cobertura/util/StringUtil.java
similarity index 81%
rename from src/net/sourceforge/cobertura/util/StringUtil.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/util/StringUtil.java
index 83ab984..0d1e9d3 100644
--- a/src/net/sourceforge/cobertura/util/StringUtil.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/util/StringUtil.java
@@ -1,92 +1,89 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Jeremy Thomerson
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.text.NumberFormat;
-
-/**
- * Abstract, not to be instantiated utility class for String functions.
- * 
- * @author Jeremy Thomerson
- */
-public abstract class StringUtil
-{
-
-	/**
-	 * <p>
-	 * Replaces all instances of "replace" with "with" from the "original"
-	 * string.
-	 * </p>
-	 *
-	 * <p>
-	 * NOTE: it is known that a similar function is included in jdk 1.4 as replaceAll(),
-	 * but is written here so as to allow backward compatibility to users using SDK's
-	 * prior to 1.4
-	 * </p>
-	 * 
-	 * @param original The original string to do replacement on.
-	 * @param replace The string to replace.
-	 * @param with The string to replace "replace" with.
-	 * @return The replaced string.
-	 */
-	public static String replaceAll(String original, String replace, String with)
-	{
-		if (original == null)
-		{
-			return original;
-		}
-
-		final int len = replace.length();
-		StringBuffer sb = new StringBuffer(original.length());
-		int start = 0;
-		int found = -1;
-
-		while ((found = original.indexOf(replace, start)) != -1)
-		{
-			sb.append(original.substring(start, found));
-			sb.append(with);
-			start = found + len;
-		}
-
-		sb.append(original.substring(start));
-		return sb.toString();
-	}
-
-	/**
-	 * Takes a double and turns it into a percent string.
-	 * Ex.  0.5 turns into 50%
-	 * 
-	 * @param value
-	 * @return corresponding percent string
-	 */
-	public static String getPercentValue(double value)
-	{
-		//moved from HTMLReport.getPercentValue()
-      value = Math.floor(value * 100) / 100; //to represent 199 covered lines from 200 as 99% covered, not 100 %
-		return NumberFormat.getPercentInstance().format(value);
-	}
-	
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Jeremy Thomerson
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import java.text.NumberFormat;
+
+/**
+ * Abstract, not to be instantiated utility class for String functions.
+ *
+ * @author Jeremy Thomerson
+ */
+public abstract class StringUtil {
+
+	/**
+	 * <p>
+	 * Replaces all instances of "replace" with "with" from the "original"
+	 * string.
+	 * </p>
+	 * <p/>
+	 * <p>
+	 * NOTE: it is known that a similar function is included in jdk 1.4 as replaceAll(),
+	 * but is written here so as to allow backward compatibility to users using SDK's
+	 * prior to 1.4
+	 * </p>
+	 *
+	 * @param original The original string to do replacement on.
+	 * @param replace  The string to replace.
+	 * @param with     The string to replace "replace" with.
+	 *
+	 * @return The replaced string.
+	 */
+	public static String replaceAll(String original, String replace, String with) {
+		if (original == null) {
+			return original;
+		}
+
+		final int len = replace.length();
+		StringBuffer sb = new StringBuffer(original.length());
+		int start = 0;
+		int found = -1;
+
+		while ((found = original.indexOf(replace, start)) != -1) {
+			sb.append(original.substring(start, found));
+			sb.append(with);
+			start = found + len;
+		}
+
+		sb.append(original.substring(start));
+		return sb.toString();
+	}
+
+	/**
+	 * Takes a double and turns it into a percent string.
+	 * Ex.  0.5 turns into 50%
+	 *
+	 * @param value
+	 *
+	 * @return corresponding percent string
+	 */
+	public static String getPercentValue(double value) {
+		//moved from HTMLReport.getPercentValue()
+		value = Math.floor(value * 100) / 100; //to represent 199 covered lines from 200 as 99% covered, not 100 %
+		return NumberFormat.getPercentInstance().format(value);
+	}
+
+}
diff --git a/src/net/sourceforge/cobertura/webapp/FlushCoberturaServlet.java b/cobertura/src/main/java/net/sourceforge/cobertura/webapp/FlushCoberturaServlet.java
similarity index 51%
rename from src/net/sourceforge/cobertura/webapp/FlushCoberturaServlet.java
rename to cobertura/src/main/java/net/sourceforge/cobertura/webapp/FlushCoberturaServlet.java
index c97e316..f5a64e1 100644
--- a/src/net/sourceforge/cobertura/webapp/FlushCoberturaServlet.java
+++ b/cobertura/src/main/java/net/sourceforge/cobertura/webapp/FlushCoberturaServlet.java
@@ -1,70 +1,69 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2009 Amit Nithianandan
- * Copyright (C) 2009 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License.
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.webapp;
-
-import java.io.IOException;
-import java.io.PrintStream;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class FlushCoberturaServlet extends HttpServlet
-{
-
-    /**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	@Override
-    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
-            throws ServletException, IOException
-    {
-        try {
-            String className = "net.sourceforge.cobertura.coveragedata.ProjectData";
-            String methodName = "saveGlobalProjectData";
-            Class saveClass = Class.forName(className);
-            java.lang.reflect.Method saveMethod = saveClass.getDeclaredMethod(methodName, new Class[0]);
-            saveMethod.invoke(null,new Object[0]);
-        } catch (Throwable t) {
-        	PrintStream ps = new PrintStream(resp.getOutputStream());
-        	ps.println("<HTML><BODY><P>Could not save Cobertura data.  Make sure cobertura.jar is in the web server's lib directory: " + t.getLocalizedMessage());
-        	ps.print("<P>");
-        	t.printStackTrace(ps);
-        	ps.println("</BODY></HTML>");
-        	resp.flushBuffer();
-        }
-    }
-
-    @Override
-    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
-            throws ServletException, IOException
-    {
-        doGet(req, resp);
-    }
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2009 Amit Nithianandan
+ * Copyright (C) 2009 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License.
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.webapp;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintStream;
+
+public class FlushCoberturaServlet extends HttpServlet {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1L;
+
+	@Override
+	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+		try {
+			String className = "net.sourceforge.cobertura.coveragedata.ProjectData";
+			String methodName = "saveGlobalProjectData";
+			Class saveClass = Class.forName(className);
+			java.lang.reflect.Method saveMethod = saveClass.getDeclaredMethod(
+					methodName, new Class[0]);
+			saveMethod.invoke(null, new Object[0]);
+		} catch (Throwable t) {
+			PrintStream ps = new PrintStream(resp.getOutputStream());
+			ps
+					.println("<HTML><BODY><P>Could not save Cobertura data.  Make sure cobertura.jar is in the web server's lib directory: "
+							+ t.getLocalizedMessage());
+			ps.print("<P>");
+			t.printStackTrace(ps);
+			ps.println("</BODY></HTML>");
+			resp.flushBuffer();
+		}
+	}
+
+	@Override
+	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+		doGet(req, resp);
+	}
+
+}
diff --git a/cobertura/src/main/javacc/Java1.1.jj b/cobertura/src/main/javacc/Java1.1.jj
new file mode 100644
index 0000000..2e0db50
--- /dev/null
+++ b/cobertura/src/main/javacc/Java1.1.jj
@@ -0,0 +1,3489 @@
+/**
+ *
+ * Copyright (C) 1996, 1997 Sun Microsystems Inc.
+ *
+ * Use of this file and the system it is part of is constrained by the
+ * file COPYRIGHT in the root directory of this system.  You may, however,
+ * make any modifications you wish to this file.
+ *
+ * Java files generated by running JavaCC on this file (or modified versions
+ * of this file) may be used in exactly the same manner as Java files
+ * generated from any grammar developed by you.
+ *
+ * Author: Sriram Sankar
+ * Date: 3/5/97
+ *
+ * This file contains a Java grammar and actions that implement a front-end.
+ *
+ *
+ * Changes applied to this grammar are for the JavaNCSS
+ * application: http://www.kclee.com/clemens/java/javancss/
+ * Author: Chr. Clemens Lee, 2000-01-31
+ * Additional counting of javadoc comments done by
+ *    Emilio Gongora, <emilio at sms.nl> and
+ *    Guillermo Rodriguez, <guille at sms.nl>.
+ * Anonymous class count patch by Vesa Karvonnen, <vesa_karvonen at hotmail.com> 2002-10-30.
+ */
+
+options {
+  JAVA_UNICODE_ESCAPE = true;
+  STATIC = false;
+  /* // DEBUG MODE
+  DEBUG_PARSER = true;
+  // */
+}
+
+PARSER_BEGIN(JavaParser)
+
+package net.sourceforge.cobertura.javancss.parser;
+
+import java.util.*;
+
+import net.sourceforge.cobertura.javancss.ccl.Util;
+
+import net.sourceforge.cobertura.javancss.FunctionMetric;
+import net.sourceforge.cobertura.javancss.ObjectMetric;
+import net.sourceforge.cobertura.javancss.PackageMetric;
+
+/**
+ * Java source code parser based on a grammar compiled by
+ * JavaCC from Java1.1.jj to the JavaParser class.<p>
+ *
+ * This class is responsible for parsing Java code and counting
+ * all metrics during this parsing process.
+ * The rest of the application is only responsible for invoking
+ * this parser in a convenient way and to present the results
+ * to the user.<p>
+ *
+ * This grammar is based on the Java grammar that comes as an
+ * example with JavaCC, but has been extended to collect the
+ * metrics data (and adapted to support real life and jdk 1.4
+ * Java sources as well).
+ *
+ * @author    Sriram Sankar (original JavaCC grammar)
+ *            , Chr. Clemens Lee <clemens at kclee.com> (JavaNCSS metrics)
+ *            , additional counting of javadoc comments done by
+ *              Emilio Gongora, <emilio at sms.nl> and
+ *              Guillermo Rodriguez, <guille at sms.nl>.
+ *            Anonymous class count patch by Vesa Karvonnen, <vesa_karvonen at hotmail.com> 2002-10-30.
+ * @version   2000-01-31 $Id: Java1.1.jj 193 2009-06-12 13:35:12Z reynaud_seb $
+ */
+public class JavaParser implements JavaParserInterface
+{
+    {
+        /* // DEBUG MODE
+        Util.setDebug( true );
+        // */
+    }
+    private boolean _bReturn         = false;
+    private int     _ncss            = 0;     // general counter
+    private int     _loc             = 0;
+    private int     _cyc             = 1;
+    private int     _localCases      = 0;
+    private String  _sName           = "";    // name of last token
+    private String  _sParameter      = "";
+    private String  _sPackage        = "";
+    private String  _sClass          = "";
+    private String  _sFunction       = "";
+    private int     _functions       = 0;     // number of functions in this class
+    //private int     _topLevelClasses = 0;
+    private int     _classes         = 0;
+    private int     _classLevel      = 0;
+    private int     _anonClassCount  = 1;
+
+    private int     _jvdcLines = 0;           // added by SMS
+    private int     _jvdc      = 0;
+    private boolean _bPrivate  = true;//false;        // added by SMS
+    private boolean _bPublic   = true;        // added by SMS
+
+    private int	_nbligne = 0; //Added by REYNAUD Sebastien (LOGICA)
+
+    /**
+     * For each class the number of formal
+     * comments in toplevel methods, constructors, inner
+     * classes, and for the class itself are counted.
+     * The top level comment has to be directly before
+     * the class definition, not before the package or
+     * import statement as it is often seen in source code
+     * examples (at the beginning of your source files you
+     * should instead put your copyright notice).
+     */
+    private int    _javadocs   = 0;              // global javadocs
+    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
+
+    /**
+     * Metrics for each class/interface are stored in this
+     * vector.
+     */
+    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
+    private List _vImports = new ArrayList();
+    private Object[] _aoPackage = null;
+    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
+    private PackageMetric _pPackageMetric;
+
+    private Token _tmpToken = null;
+    /** Argh, too much of a state machine. */
+    private Token _tmpResultToken = null;
+
+    private String _formatPackage(String sPackage_) {
+        if (sPackage_.equals("")) {
+            return ".";
+        }
+
+        return sPackage_.substring(0, sPackage_.length() - 1);
+    }
+
+    public void parse() throws Exception {
+      CompilationUnit();
+    }
+
+    public void parseImportUnit() throws Exception {
+      ImportUnit();
+    }
+
+    public int getNcss() {
+        return _ncss;
+    }
+
+    public int getLOC() {
+        return _loc;
+    }
+
+    // added by SMS
+    public int getJvdc() {
+        return _jvdc;
+    }
+
+    /*public int getTopLevelClasses() {
+      return _topLevelClasses;
+      }*/
+
+    public List/*<FunctionMetric>*/ getFunction() {
+        return _vFunctions;
+    }
+
+    /**
+     * @return Top level classes in sorted order
+     */
+    public List/*<ObjectMetric>*/ getObject() {
+        Collections.sort(_vClasses);
+        return _vClasses;
+    }
+
+    /**
+     * @return The empty package consists of the name ".".
+     */
+    public Map/*<String,PackageMetric>*/ getPackage() {
+        return _htPackage;
+    }
+
+    public List getImports() {
+        return _vImports;
+    }
+
+    /**
+     * name, beginLine, ...
+     */
+    public Object[] getPackageObjects() {
+        return _aoPackage;
+    }
+
+    /**
+     * if javancss is used with cat *.java a long
+     * input stream might get generated, so line
+     * number information in case of an parse exception
+     * is not very useful.
+     */
+    public String getLastFunction() {
+        return _sPackage + _sClass + _sFunction;
+    }
+
+   /**
+    * Class to hold modifiers.
+    */
+   static public final class ModifierSet
+   {
+     /* Definitions of the bits in the modifiers field.  */
+     public static final int PUBLIC = 0x0001;
+     public static final int PROTECTED = 0x0002;
+     public static final int PRIVATE = 0x0004;
+     public static final int ABSTRACT = 0x0008;
+     public static final int STATIC = 0x0010;
+     public static final int FINAL = 0x0020;
+     public static final int SYNCHRONIZED = 0x0040;
+     public static final int NATIVE = 0x0080;
+     public static final int TRANSIENT = 0x0100;
+     public static final int VOLATILE = 0x0200;
+     public static final int STRICTFP = 0x1000;
+
+     /** A set of accessors that indicate whether the specified modifier
+         is in the set. */
+
+     public boolean isPublic(int modifiers)
+     {
+       return (modifiers & PUBLIC) != 0;
+     }
+
+     public boolean isProtected(int modifiers)
+     {
+       return (modifiers & PROTECTED) != 0;
+     }
+
+     public boolean isPrivate(int modifiers)
+     {
+       return (modifiers & PRIVATE) != 0;
+     }
+
+     public boolean isStatic(int modifiers)
+     {
+       return (modifiers & STATIC) != 0;
+     }
+
+     public boolean isAbstract(int modifiers)
+     {
+       return (modifiers & ABSTRACT) != 0;
+     }
+
+     public boolean isFinal(int modifiers)
+     {
+       return (modifiers & FINAL) != 0;
+     }
+
+     public boolean isNative(int modifiers)
+     {
+       return (modifiers & NATIVE) != 0;
+     }
+
+     public boolean isStrictfp(int modifiers)
+     {
+       return (modifiers & STRICTFP) != 0;
+     }
+
+     public boolean isSynchronized(int modifiers)
+     {
+       return (modifiers & SYNCHRONIZED) != 0;
+     }
+
+     public boolean isTransient(int modifiers)
+      {
+       return (modifiers & TRANSIENT) != 0;
+     }
+
+     public boolean isVolatile(int modifiers)
+     {
+       return (modifiers & VOLATILE) != 0;
+     }
+
+     /**
+      * Removes the given modifier.
+      */
+     static int removeModifier(int modifiers, int mod)
+     {
+        return modifiers & ~mod;
+     }
+   }
+}
+
+PARSER_END(JavaParser)
+
+TOKEN_MGR_DECLS :
+{
+    // added by SMS
+
+    public static int  _iSingleComments = 0;
+    public static int  _iMultiComments = 0;
+    public static int  _iFormalComments = 0;
+
+    public static int  _iMultiCommentsLast = 0;
+
+    public static int nbligne = 1; //Added by REYNAUD Sebastien (LOGICA)
+}
+
+/* WHITE SPACE */
+
+SKIP :
+{
+  " "
+| "\t"
+| "\n" /*Added by REYNAUD Sebastien (LOGICA)*/ {nbligne++;} //
+| "\r" /*Added by REYNAUD Sebastien (LOGICA)*/ {nbligne++;} //
+| "\f"
+| "\u001a"
+| "\r\n" {nbligne++;} //Added by REYNAUD Sebastien (LOGICA)
+}
+
+/* COMMENTS */
+
+MORE :
+{
+   //   "//" : IN_SINGLE_LINE_COMMENT
+   //|
+    //  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+    //|
+  "/*" { _iMultiCommentsLast = 0; } : IN_MULTI_LINE_COMMENT     // MODIFIED by SMS
+}
+
+SPECIAL_TOKEN :
+{
+   <SINGLE_LINE_COMMENT: "//"> { _iSingleComments++; } : IN_SINGLE_LINE_COMMENT       // MODIFIED by SMS:  the global counter is incremented
+}
+
+<IN_SINGLE_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+    <SINGLE_LINE_COMMENT2: (~["\n","\r"])* ("\n"|"\r"|"\r\n")?> /*Added by REYNAUD Sebastien (LOGICA)*/ {nbligne++;} /* */: DEFAULT
+}
+
+//<IN_SINGLE_LINE_COMMENT>
+//SPECIAL_TOKEN :
+//{
+//   <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : DEFAULT
+   //<SINGLE_LINE_COMMENT: (~["\n", "\r"])* ("\n" | "\r" | "\r\n")? >
+   /*"\n" : DEFAULT
+      | "\r" : DEFAULT
+      | "\r\n" : DEFAULT
+      | <~[]>*/
+//}
+
+//<IN_FORMAL_COMMENT>
+//SPECIAL_TOKEN :
+//{
+//  <FORMAL_COMMENT: "*/" > : DEFAULT
+//}
+
+<IN_MULTI_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+  <END_OF_LINE_MULTI: "\n" | "\r" | "\r\n" > {/*Added by REYNAUD Sebastien (LOGICA)*/ nbligne++; /* */ _iMultiComments++; _iMultiCommentsLast++; } : IN_MULTI_LINE_COMMENT      // added by SMS
+  | <MULTI_LINE_COMMENT: "*/" > { _iMultiComments++; _iMultiCommentsLast++; } : DEFAULT                                 // the global counter is incremented
+}
+
+//<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
+<IN_SINGLE_LINE_COMMENT,IN_MULTI_LINE_COMMENT>
+MORE :
+{
+  < ~[] >
+}
+
+/* RESERVED WORDS AND LITERALS */
+
+TOKEN :
+{
+  < ABSTRACT: "abstract" >
+| < ASSERT: "assert" >
+| < BOOLEAN: "boolean" >
+| < BREAK: "break" >
+| < BYTE: "byte" >
+| < CASE: "case" >
+| < CATCH: "catch" >
+| < CHAR: "char" >
+| < CLASS: "class" >
+| < CONST: "const" >
+| < CONTINUE: "continue" >
+| < _DEFAULT: "default" >
+| < DO: "do" >
+| < DOUBLE: "double" >
+| < ELSE: "else" >
+| < ENUM: "enum" >
+| < EXTENDS: "extends" >
+| < FALSE: "false" >
+| < FINAL: "final" >
+| < FINALLY: "finally" >
+| < FLOAT: "float" >
+| < FOR: "for" >
+| < GOTO: "goto" >
+| < IF: "if" >
+| < IMPLEMENTS: "implements" >
+| < IMPORT: "import" >
+| < INSTANCEOF: "instanceof" >
+| < INT: "int" >
+| < INTERFACE: "interface" >
+| < LONG: "long" >
+| < NATIVE: "native" >
+| < NEW: "new" >
+| < NULL: "null" >
+| < PACKAGE: "package">
+| < PRIVATE: "private" >
+| < PROTECTED: "protected" >
+| < PUBLIC: "public" >
+| < RETURN: "return" >
+| < SHORT: "short" >
+| < STATIC: "static" >
+| < TESTAAAA: "strictfp" > // STRICTFP lets the linux jdk1.1 compiler fail
+| < SUPER: "super" >
+| < SWITCH: "switch" >
+| < SYNCHRONIZED: "synchronized" >
+| < THIS: "this" >
+| < THROW: "throw" >
+| < THROWS: "throws" >
+| < TRANSIENT: "transient" >
+| < TRUE: "true" >
+| < TRY: "try" >
+| < VOID: "void" >
+| < VOLATILE: "volatile" >
+| < WHILE: "while" >
+}
+
+/* LITERALS */
+
+TOKEN :
+{
+  < INTEGER_LITERAL:
+        <DECIMAL_LITERAL> (["l","L"])?
+      | <HEX_LITERAL> (["l","L"])?
+      | <OCTAL_LITERAL> (["l","L"])?
+  >
+|
+  < #DECIMAL_LITERAL: ["1"-"9"] (["_", "0"-"9"])* >
+|
+  < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
+|
+  < #OCTAL_LITERAL: "0" (["0"-"7"])* >
+|
+  < FLOATING_POINT_LITERAL:
+        (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])?
+      | "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])?
+      | (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])?
+      | (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]
+  >
+|
+  < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+|
+  < CHARACTER_LITERAL:
+      "'"
+                                         // "\r" eigendlich noch dazu, aber wegen bug
+                                         // in java/text/TextBoundaryData.java
+                                         // in zeile 55 columne 12 und zeile 69
+                                         // columne 12 hier entfernt.
+                                         // (   (~["'","\\","\n","\r"])
+      (   (~["\\","\n"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )
+      "'"
+  >
+|
+  < STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\""
+  >
+}
+
+/* IDENTIFIERS */
+
+TOKEN :
+{
+  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
+|
+  < #LETTER:
+      [  // all chars for which Character.isIdentifierStart is true
+         "$",
+         "A"-"Z",
+         "_",
+         "a"-"z",
+         "\u00a2"-"\u00a5",
+         "\u00aa",
+         "\u00b5",
+         "\u00ba",
+         "\u00c0"-"\u00d6",
+         "\u00d8"-"\u00f6",
+         "\u00f8"-"\u021f",
+         "\u0222"-"\u0233",
+         "\u0250"-"\u02ad",
+         "\u02b0"-"\u02b8",
+         "\u02bb"-"\u02c1",
+         "\u02d0"-"\u02d1",
+         "\u02e0"-"\u02e4",
+         "\u02ee",
+         "\u037a",
+         "\u0386",
+         "\u0388"-"\u038a",
+         "\u038c",
+         "\u038e"-"\u03a1",
+         "\u03a3"-"\u03ce",
+         "\u03d0"-"\u03d7",
+         "\u03da"-"\u03f3",
+         "\u0400"-"\u0481",
+         "\u048c"-"\u04c4",
+         "\u04c7"-"\u04c8",
+         "\u04cb"-"\u04cc",
+         "\u04d0"-"\u04f5",
+         "\u04f8"-"\u04f9",
+         "\u0531"-"\u0556",
+         "\u0559",
+         "\u0561"-"\u0587",
+         "\u05d0"-"\u05ea",
+         "\u05f0"-"\u05f2",
+         "\u0621"-"\u063a",
+         "\u0640"-"\u064a",
+         "\u0671"-"\u06d3",
+         "\u06d5",
+         "\u06e5"-"\u06e6",
+         "\u06fa"-"\u06fc",
+         "\u0710",
+         "\u0712"-"\u072c",
+         "\u0780"-"\u07a5",
+         "\u0905"-"\u0939",
+         "\u093d",
+         "\u0950",
+         "\u0958"-"\u0961",
+         "\u0985"-"\u098c",
+         "\u098f"-"\u0990",
+         "\u0993"-"\u09a8",
+         "\u09aa"-"\u09b0",
+         "\u09b2",
+         "\u09b6"-"\u09b9",
+         "\u09dc"-"\u09dd",
+         "\u09df"-"\u09e1",
+         "\u09f0"-"\u09f3",
+         "\u0a05"-"\u0a0a",
+         "\u0a0f"-"\u0a10",
+         "\u0a13"-"\u0a28",
+         "\u0a2a"-"\u0a30",
+         "\u0a32"-"\u0a33",
+         "\u0a35"-"\u0a36",
+         "\u0a38"-"\u0a39",
+         "\u0a59"-"\u0a5c",
+         "\u0a5e",
+         "\u0a72"-"\u0a74",
+         "\u0a85"-"\u0a8b",
+         "\u0a8d",
+         "\u0a8f"-"\u0a91",
+         "\u0a93"-"\u0aa8",
+         "\u0aaa"-"\u0ab0",
+         "\u0ab2"-"\u0ab3",
+         "\u0ab5"-"\u0ab9",
+         "\u0abd",
+         "\u0ad0",
+         "\u0ae0",
+         "\u0b05"-"\u0b0c",
+         "\u0b0f"-"\u0b10",
+         "\u0b13"-"\u0b28",
+         "\u0b2a"-"\u0b30",
+         "\u0b32"-"\u0b33",
+         "\u0b36"-"\u0b39",
+         "\u0b3d",
+         "\u0b5c"-"\u0b5d",
+         "\u0b5f"-"\u0b61",
+         "\u0b85"-"\u0b8a",
+         "\u0b8e"-"\u0b90",
+         "\u0b92"-"\u0b95",
+         "\u0b99"-"\u0b9a",
+         "\u0b9c",
+         "\u0b9e"-"\u0b9f",
+         "\u0ba3"-"\u0ba4",
+         "\u0ba8"-"\u0baa",
+         "\u0bae"-"\u0bb5",
+         "\u0bb7"-"\u0bb9",
+         "\u0c05"-"\u0c0c",
+         "\u0c0e"-"\u0c10",
+         "\u0c12"-"\u0c28",
+         "\u0c2a"-"\u0c33",
+         "\u0c35"-"\u0c39",
+         "\u0c60"-"\u0c61",
+         "\u0c85"-"\u0c8c",
+         "\u0c8e"-"\u0c90",
+         "\u0c92"-"\u0ca8",
+         "\u0caa"-"\u0cb3",
+         "\u0cb5"-"\u0cb9",
+         "\u0cde",
+         "\u0ce0"-"\u0ce1",
+         "\u0d05"-"\u0d0c",
+         "\u0d0e"-"\u0d10",
+         "\u0d12"-"\u0d28",
+         "\u0d2a"-"\u0d39",
+         "\u0d60"-"\u0d61",
+         "\u0d85"-"\u0d96",
+         "\u0d9a"-"\u0db1",
+         "\u0db3"-"\u0dbb",
+         "\u0dbd",
+         "\u0dc0"-"\u0dc6",
+         "\u0e01"-"\u0e30",
+         "\u0e32"-"\u0e33",
+         "\u0e3f"-"\u0e46",
+         "\u0e81"-"\u0e82",
+         "\u0e84",
+         "\u0e87"-"\u0e88",
+         "\u0e8a",
+         "\u0e8d",
+         "\u0e94"-"\u0e97",
+         "\u0e99"-"\u0e9f",
+         "\u0ea1"-"\u0ea3",
+         "\u0ea5",
+         "\u0ea7",
+         "\u0eaa"-"\u0eab",
+         "\u0ead"-"\u0eb0",
+         "\u0eb2"-"\u0eb3",
+         "\u0ebd",
+         "\u0ec0"-"\u0ec4",
+         "\u0ec6",
+         "\u0edc"-"\u0edd",
+         "\u0f00",
+         "\u0f40"-"\u0f47",
+         "\u0f49"-"\u0f6a",
+         "\u0f88"-"\u0f8b",
+         "\u1000"-"\u1021",
+         "\u1023"-"\u1027",
+         "\u1029"-"\u102a",
+         "\u1050"-"\u1055",
+         "\u10a0"-"\u10c5",
+         "\u10d0"-"\u10f6",
+         "\u1100"-"\u1159",
+         "\u115f"-"\u11a2",
+         "\u11a8"-"\u11f9",
+         "\u1200"-"\u1206",
+         "\u1208"-"\u1246",
+         "\u1248",
+         "\u124a"-"\u124d",
+         "\u1250"-"\u1256",
+         "\u1258",
+         "\u125a"-"\u125d",
+         "\u1260"-"\u1286",
+         "\u1288",
+         "\u128a"-"\u128d",
+         "\u1290"-"\u12ae",
+         "\u12b0",
+         "\u12b2"-"\u12b5",
+         "\u12b8"-"\u12be",
+         "\u12c0",
+         "\u12c2"-"\u12c5",
+         "\u12c8"-"\u12ce",
+         "\u12d0"-"\u12d6",
+         "\u12d8"-"\u12ee",
+         "\u12f0"-"\u130e",
+         "\u1310",
+         "\u1312"-"\u1315",
+         "\u1318"-"\u131e",
+         "\u1320"-"\u1346",
+         "\u1348"-"\u135a",
+         "\u13a0"-"\u13f4",
+         "\u1401"-"\u166c",
+         "\u166f"-"\u1676",
+         "\u1681"-"\u169a",
+         "\u16a0"-"\u16ea",
+         "\u1780"-"\u17b3",
+         "\u17db",
+         "\u1820"-"\u1877",
+         "\u1880"-"\u18a8",
+         "\u1e00"-"\u1e9b",
+         "\u1ea0"-"\u1ef9",
+         "\u1f00"-"\u1f15",
+         "\u1f18"-"\u1f1d",
+         "\u1f20"-"\u1f45",
+         "\u1f48"-"\u1f4d",
+         "\u1f50"-"\u1f57",
+         "\u1f59",
+         "\u1f5b",
+         "\u1f5d",
+         "\u1f5f"-"\u1f7d",
+         "\u1f80"-"\u1fb4",
+         "\u1fb6"-"\u1fbc",
+         "\u1fbe",
+         "\u1fc2"-"\u1fc4",
+         "\u1fc6"-"\u1fcc",
+         "\u1fd0"-"\u1fd3",
+         "\u1fd6"-"\u1fdb",
+         "\u1fe0"-"\u1fec",
+         "\u1ff2"-"\u1ff4",
+         "\u1ff6"-"\u1ffc",
+         "\u203f"-"\u2040",
+         "\u207f",
+         "\u20a0"-"\u20af",
+         "\u2102",
+         "\u2107",
+         "\u210a"-"\u2113",
+         "\u2115",
+         "\u2119"-"\u211d",
+         "\u2124",
+         "\u2126",
+         "\u2128",
+         "\u212a"-"\u212d",
+         "\u212f"-"\u2131",
+         "\u2133"-"\u2139",
+         "\u2160"-"\u2183",
+         "\u3005"-"\u3007",
+         "\u3021"-"\u3029",
+         "\u3031"-"\u3035",
+         "\u3038"-"\u303a",
+         "\u3041"-"\u3094",
+         "\u309d"-"\u309e",
+         "\u30a1"-"\u30fe",
+         "\u3105"-"\u312c",
+         "\u3131"-"\u318e",
+         "\u31a0"-"\u31b7",
+         "\u3400"-"\u4db5",
+         "\u4e00"-"\u9fa5",
+         "\ua000"-"\ua48c",
+         "\uac00"-"\ud7a3",
+         "\uf900"-"\ufa2d",
+         "\ufb00"-"\ufb06",
+         "\ufb13"-"\ufb17",
+         "\ufb1d",
+         "\ufb1f"-"\ufb28",
+         "\ufb2a"-"\ufb36",
+         "\ufb38"-"\ufb3c",
+         "\ufb3e",
+         "\ufb40"-"\ufb41",
+         "\ufb43"-"\ufb44",
+         "\ufb46"-"\ufbb1",
+         "\ufbd3"-"\ufd3d",
+         "\ufd50"-"\ufd8f",
+         "\ufd92"-"\ufdc7",
+         "\ufdf0"-"\ufdfb",
+         "\ufe33"-"\ufe34",
+         "\ufe4d"-"\ufe4f",
+         "\ufe69",
+         "\ufe70"-"\ufe72",
+         "\ufe74",
+         "\ufe76"-"\ufefc",
+         "\uff04",
+         "\uff21"-"\uff3a",
+         "\uff3f",
+         "\uff41"-"\uff5a",
+         "\uff65"-"\uffbe",
+         "\uffc2"-"\uffc7",
+         "\uffca"-"\uffcf",
+         "\uffd2"-"\uffd7",
+         "\uffda"-"\uffdc",
+         "\uffe0"-"\uffe1",
+         "\uffe5"-"\uffe6"
+      ]
+  >
+|
+  < #DIGIT:
+      [
+       "\u0030"-"\u0039",
+       "\u0660"-"\u0669",
+       "\u06f0"-"\u06f9",
+       "\u0966"-"\u096f",
+       "\u09e6"-"\u09ef",
+       "\u0a66"-"\u0a6f",
+       "\u0ae6"-"\u0aef",
+       "\u0b66"-"\u0b6f",
+       "\u0be7"-"\u0bef",
+       "\u0c66"-"\u0c6f",
+       "\u0ce6"-"\u0cef",
+       "\u0d66"-"\u0d6f",
+       "\u0e50"-"\u0e59",
+       "\u0ed0"-"\u0ed9",
+       "\u1040"-"\u1049"
+      ]
+  >
+}
+
+/* SEPARATORS */
+
+TOKEN :
+{
+  < LPAREN: "(" >
+| < RPAREN: ")" >
+| < LBRACE: "{" >
+| < RBRACE: "}" >
+| < LBRACKET: "[" >
+| < RBRACKET: "]" >
+| < SEMICOLON: ";" >
+| < COMMA: "," >
+| < DOT: "." >
+| < AT: "@" >
+}
+
+/* OPERATORS */
+
+TOKEN :
+{
+  < ASSIGN: "=" >
+| < GT: ">" >
+| < LT: "<" >
+| < BANG: "!" >
+| < TILDE: "~" >
+| < HOOK: "?" >
+| < COLON: ":" >
+| < EQ: "==" >
+| < LE: "<=" >
+| < GE: ">=" >
+| < NE: "!=" >
+| < SC_OR: "||" >
+| < SC_AND: "&&" >
+| < INCR: "++" >
+| < DECR: "--" >
+| < PLUS: "+" >
+| < MINUS: "-" >
+| < STAR: "*" >
+| < SLASH: "/" >
+| < BIT_AND: "&" >
+| < BIT_OR: "|" >
+| < XOR: "^" >
+| < REM: "%" >
+| < LSHIFT: "<<" >
+
+// | < RSIGNEDSHIFT: ">>" > //Removed by REYNAUD Sebastien (LOGICA)
+
+// | < RUNSIGNEDSHIFT: ">>>" > //Removed by REYNAUD Sebastien (LOGICA)
+
+| < PLUSASSIGN: "+=" >
+| < MINUSASSIGN: "-=" >
+| < STARASSIGN: "*=" >
+| < SLASHASSIGN: "/=" >
+| < ANDASSIGN: "&=" >
+| < ORASSIGN: "|=" >
+| < XORASSIGN: "^=" >
+| < REMASSIGN: "%=" >
+| < LSHIFTASSIGN: "<<=" >
+| < RSIGNEDSHIFTASSIGN: ">>=" >
+| < RUNSIGNEDSHIFTASSIGN: ">>>=" >
+| < ELLIPSIS: "..." >
+}
+
+
+/*****************************************
+ * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
+ *****************************************/
+
+/*
+ * Program structuring syntax follows.
+ */
+
+void CompilationUnit() :
+{
+    int oldNcss = 0;
+
+    // added by SMS
+    int oldFormal = 0;
+    int oldSingle = 0;
+    int oldMulti  = 0;
+
+    JavaParserTokenManager._iSingleComments = 0;
+    JavaParserTokenManager._iMultiComments = 0;
+    JavaParserTokenManager._iFormalComments = 0;
+
+    JavaParserTokenManager._iMultiCommentsLast = 0;
+
+    _bPrivate = true;//false;
+
+	JavaParserTokenManager.nbligne = 1; //Added by REYNAUD Sebastien (LOGICA)
+}
+{
+        {
+                _sPackage = "";
+                _pPackageMetric = new PackageMetric();      // this object manages the metrics
+        }
+  [ LOOKAHEAD( ( Annotation() )* "package" ) PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( TypeDeclaration()
+    //{ System.out.println( "Token: " + getToken( 0 ) ); }
+    )*
+         {
+             // Package classes and functions are set inside
+             // class and interface bodies.
+             _pPackageMetric.ncss = _ncss;
+
+             // added by SMS
+             _pPackageMetric.javadocsLn = JavaParserTokenManager._iFormalComments;
+             _pPackageMetric.singleLn   = JavaParserTokenManager._iSingleComments;
+             _pPackageMetric.multiLn    = JavaParserTokenManager._iMultiComments;
+             //
+
+             _htPackage.put(_formatPackage(_sPackage),
+                            _pPackageMetric);
+         }
+  (
+  {
+      oldNcss = _ncss;
+      _sPackage = "";
+      _pPackageMetric = new PackageMetric();
+
+      // added by SMS
+      oldFormal = JavaParserTokenManager._iFormalComments;
+      oldSingle = JavaParserTokenManager._iSingleComments;
+      oldMulti  = JavaParserTokenManager._iMultiComments;
+  }
+  (PackageDeclaration()
+   |
+   ( ImportDeclaration() )
+   )
+  ( ImportDeclaration() )*
+  ( TypeDeclaration() )+
+  {
+      // Package classes and functions are set inside
+      // class and interface bodies.
+      _pPackageMetric.ncss = _ncss - oldNcss;
+
+      // added by SMS
+      _pPackageMetric.javadocsLn = JavaParserTokenManager._iFormalComments - oldFormal;
+      _pPackageMetric.singleLn   = JavaParserTokenManager._iSingleComments - oldSingle;
+      _pPackageMetric.multiLn    = JavaParserTokenManager._iMultiComments  - oldMulti;
+      //
+
+      PackageMetric pckmPrevious = (PackageMetric)_htPackage.
+             get(_formatPackage(_sPackage));
+      _pPackageMetric.add(pckmPrevious);
+      _htPackage.put(_formatPackage(_sPackage),
+                     _pPackageMetric);
+  }
+  )*
+  <EOF>
+         {
+             Token pToken = getToken(1);
+             _loc = pToken.endLine;
+	     _nbligne = JavaParserTokenManager.nbligne; //Added by REYNAUD Sebastien (LOGICA)
+         }
+}
+
+void ImportUnit() :
+{
+}
+{
+  [ PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )*
+  ( "class" | "interface" )
+}
+
+void PackageDeclaration() :
+{
+    int beginLine = 1;
+    int beginColumn = 1;
+}
+{
+    (Annotation())*
+  "package"
+  {
+      _anonClassCount = 1;
+
+      Token pToken = getToken( 0 );
+      beginLine = pToken.beginLine ;
+      beginColumn = pToken.beginColumn;
+      _aoPackage = new Object[ 5 ];
+  }
+  Name()
+  {
+      _aoPackage[ 0 ] = _sName;
+      _aoPackage[ 1 ] = new Integer( beginLine );
+      _aoPackage[ 2 ] = new Integer( beginColumn );
+  }
+  ";"
+  {
+      _aoPackage[ 3 ] = new Integer( getToken( 0 ).endLine );
+      _aoPackage[ 4 ] = new Integer( getToken( 0 ).endColumn );
+      _ncss++;
+      Util.debug( "_ncss++" );
+      _sPackage = _sName + ".";
+  }
+}
+
+void ImportDeclaration() :
+{
+    int beginLine = 1;
+    int beginColumn = 1;
+    Object[] aoImport = null;
+}
+{
+  "import"
+  {
+      Token pToken = getToken( 0 );
+      beginLine = pToken.beginLine ;
+      beginColumn = pToken.beginColumn;
+  }
+[ "static" ]
+  Name()
+  {
+      aoImport = new Object[ 5 ];
+      aoImport[ 0 ] = _sName;
+      aoImport[ 1 ] = new Integer( beginLine );
+      aoImport[ 2 ] = new Integer( beginColumn );
+  }
+  [ "." "*" { aoImport[ 0 ] = aoImport[ 0 ].toString() + ".*"; } ] ";"
+  {
+      aoImport[ 3 ] = new Integer( getToken( 0 ).endLine );
+      aoImport[ 4 ] = new Integer( getToken( 0 ).endColumn );
+      _vImports.add( aoImport );
+      _ncss++;
+      Util.debug( "_ncss++" );
+  }
+}
+
+void TypeDeclaration() :
+{
+   int modifiers;
+}
+{
+  LOOKAHEAD( (Annotation())* ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )* "class" )
+
+	//(Annotation())*	//Removed by REYNAUD Sebastien (LOGICA)
+
+  ClassDeclaration()
+|
+  LOOKAHEAD( modifiers = Modifiers()
+                 "enum" <IDENTIFIER>
+             //EnumDeclaration(modifiers)
+             )
+  modifiers = Modifiers()
+  EnumDeclaration(modifiers)
+|
+         LOOKAHEAD( Modifiers() "interface" )
+
+	//(Annotation())*	//Removed by REYNAUD Sebastien (LOGICA)
+
+  InterfaceDeclaration()
+   |
+  modifiers = Modifiers()
+     AnnotationTypeDeclaration(modifiers)
+|
+  ";"
+}
+
+
+/*
+ * Declaration syntax follows.
+ */
+
+void ClassDeclaration() :
+{
+    Token tmpToken = null;
+    _javadocs = 0;
+    ObjectMetric metric = null;
+
+    // added by SMS
+    int oldSingle = 0;
+    int oldMulti  = 0;
+
+    _jvdcLines    = 0;
+    boolean bTemp = _bPublic;
+    _bPublic      = false;
+    //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	//
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+	//
+
+  ( "abstract"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "final"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "public"
+  {
+      _bPublic = true;         // added by SMS
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "synchronized"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "strictfp"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ )*
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 1 );
+      }
+  }
+
+  // added by SMS
+  {
+      while( tmpToken.specialToken != null ) {
+          if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+              _javadocs++;
+              Util.debug( "ClassDeclaration()._javadocs++" );
+              if (_bPublic || _bPrivate) {
+                  Util.debug( "_jvdc++" );
+                  _jvdc++;
+                  _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
+                  JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
+              }
+              JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
+              break;
+          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+              break;
+          }
+
+          //System.out.println("\n"+tmpToken.specialToken.image);
+
+          tmpToken = tmpToken.specialToken;
+      }
+
+      oldSingle = JavaParserTokenManager._iSingleComments;
+      oldMulti = JavaParserTokenManager._iMultiComments;
+  }
+
+  UnmodifiedClassDeclaration()
+         {
+             /* removed by SMS
+             while( tmpToken.specialToken != null ) {
+                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                     _javadocs++;
+                 }
+                 tmpToken = tmpToken.specialToken;
+             }
+             */
+             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1);
+             metric.javadocs = _javadocs;
+
+             // added by SMS
+             metric.javadocsLn = _jvdcLines;
+             metric.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
+             metric.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
+             //
+
+            // added by SMS
+            _bPublic = bTemp;
+         }
+}
+
+void UnmodifiedClassDeclaration() :
+{
+        String sOldClass = _sClass;
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        int oldClasses = _classes;
+	
+	//Added by REYNAUD Sebastien (LOGICA)
+	ObjectMetric metric = new ObjectMetric();
+	if (_classLevel == 0) {
+		//metric.firstLine = JavaParserTokenManager.nbligne;
+	}
+	//
+}
+{
+        {
+                if (!_sClass.equals("")) {
+                        _sClass += ".";
+                }
+                _sClass += getToken(2).image;
+                _classLevel ++;
+        }
+        Modifiers()
+  "class" Identifier() [TypeParameters()] [ "extends" Name() [TypeArguments()] /*Added by REYNAUD Sebastien (LOGICA)*/ ("." Name() [TypeArguments()] )* /**/ ] [ "implements" NameList() ]
+  ClassBody()
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _classLevel--;
+                if (_classLevel == 0) {
+                        //_topLevelClasses++;
+
+                        //ObjectMetric metric = new ObjectMetric(); //Removed by REYNAUD Sebastien (LOGICA)
+
+                        metric.name = _sPackage + _sClass;
+                        metric.ncss = _ncss - oldNcss;
+                        metric.functions = _functions - oldFunctions;
+                        metric.classes = _classes - oldClasses;
+                        Token lastToken = getToken( 0 );
+                        //metric.add( new Integer( lastToken.endLine ) );
+                        //metric.add( new Integer( lastToken.endColumn ) );
+                        //metric.add( new Integer( _javadocs ) );
+                        _vClasses.add( metric );
+                        _pPackageMetric.functions += _functions - oldFunctions;
+                        _pPackageMetric.classes++;
+
+                        // added by SMS
+                        _pPackageMetric.javadocs += _javadocs;
+                        //_pPackageMetric.javadocsLn += JavaParserTokenManager._iFormalComments - oldFormal;
+                        //_pPackageMetric.singleLn += JavaParserTokenManager._iSingleComments - oldSingle;
+                        //_pPackageMetric.multiLn += JavaParserTokenManager._iMultiComments - oldMulti;
+                        //
+                }
+
+                _functions = oldFunctions;
+                _classes = oldClasses + 1;
+                _sClass = sOldClass;
+        }
+}
+
+void ClassBody() :
+{}
+{
+  "{" ( ClassBodyDeclaration() )* "}"
+}
+
+void NestedClassDeclaration() :
+
+{
+    // added by SMS
+    Token tmpToken = null;
+
+    boolean bTemp = _bPublic;
+    _bPublic = false;
+    boolean bPublic = false;
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	//
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+
+	{
+	if(tmpToken==null)
+	{
+		tmpToken = getToken( 1 );
+	}
+	}
+	//
+
+  ( "static" | "abstract" | "final"
+  | "public" { bPublic = true; }        // added by SMS
+  | "protected" { bPublic = true; }     // added by SMS
+  | "private" | "strictfp" )*
+
+
+  // added by SMS
+  {
+
+			//tmpToken = getToken( 0 );//Removed by REYNAUD Sebastien (LOGICA)
+
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        Util.debug( "NestedClassDeclaration()._javadocs++" );
+                        if ((_bPublic && bPublic) || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
+                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+    }
+
+  UnmodifiedClassDeclaration()
+  {
+       //added by SMS
+      _bPublic = bTemp;
+  }
+}
+
+void ClassBodyDeclaration() :
+{
+    int modifiers;
+}
+{
+  EmptyStatement()
+|
+  LOOKAHEAD(2)
+  Initializer()
+
+//Added by REYNAUD Sebastien (LOGICA)
+|
+  LOOKAHEAD((Annotation())* ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )*  "@" "interface")
+  modifiers = Modifiers()
+  AnnotationTypeDeclaration(modifiers)
+|
+  LOOKAHEAD((Annotation())* "@" "interface")
+  CreationAnnotation()
+//
+
+|
+  LOOKAHEAD( (Annotation())* ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "class" )
+
+	//(Annotation())*	//Removed by REYNAUD Sebastien (LOGICA)
+
+  NestedClassDeclaration()
+|
+  LOOKAHEAD( Modifiers() "interface" )
+  //LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface" )
+  modifiers = Modifiers()
+  NestedInterfaceDeclaration()
+  |
+   LOOKAHEAD( Modifiers() "enum" )
+   modifiers = Modifiers()
+   EnumDeclaration(modifiers)
+|
+         //LOOKAHEAD( [ TypeParameters() ] <IDENTIFIER> "(" )
+         LOOKAHEAD( (Annotation())* [ "public" | "protected" | "private" ] [ TypeParameters() ] Name() "(" )
+         //{ System.out.println( "\n\nClassDeclaration\n" ); }
+
+	//(Annotation())* //Removed by REYNAUD Sebastien (LOGICA)
+
+  ConstructorDeclaration()
+|
+  LOOKAHEAD( MethodDeclarationLookahead() )
+         //{ System.out.println( "\n\nMethodDeclaration\n" ); }
+  MethodDeclaration()
+|
+  (Annotation())* FieldDeclaration()
+}
+
+// This production is to determine lookahead only.
+void MethodDeclarationLookahead() :
+{}
+{
+    ( Annotation() )*
+    ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" | "strictfp" )*
+    ( Annotation() )*
+  [ TypeParameters() ]
+  ResultType() Identifier() "("
+}
+
+void InterfaceDeclaration() :
+{
+        Token tmpToken = null;
+        _javadocs = 0;
+        //boolean bClassComment = false;
+        ObjectMetric metric = null;
+
+        // added by SMS
+        int oldSingle;
+        int oldMulti;
+
+        _jvdcLines = 0;
+        boolean bTemp = _bPublic;
+        _bPublic = false;
+        //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken=null;
+	//
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+	//
+
+  ( "strictfp" | "abstract"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "public"
+  {
+      _bPublic = true;         // added by SMS
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ )*
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 1 );
+      }
+  }
+
+
+  // added by SMS
+  // added by SMS
+  {
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        Util.debug( "InterfaceDeclaration()._javadocs++" );
+                        if (_bPublic || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
+                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+
+                oldSingle = JavaParserTokenManager._iSingleComments;
+                oldMulti = JavaParserTokenManager._iMultiComments;
+    }
+
+  UnmodifiedInterfaceDeclaration()
+         {
+             /* removed by SMS
+             while( tmpToken.specialToken != null ) {
+                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                     _javadocs++;
+                     bClassComment = true;
+                 }
+                 tmpToken = tmpToken.specialToken;
+                 }*/
+             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1 );
+             metric.javadocs = _javadocs;
+
+             // added by SMS
+             metric.javadocsLn = _jvdcLines;
+             metric.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
+             metric.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
+             //
+
+            // added by SMS
+            _bPublic = bTemp;
+         }
+}
+
+void NestedInterfaceDeclaration() :
+
+{
+    // added by SMS
+    Token tmpToken = null;
+
+    boolean bTemp = _bPublic;
+    _bPublic = false;
+    boolean bPublic = false;
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken=null;
+	//
+
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+	{
+	if(tmpToken==null)
+	{
+		tmpToken = getToken( 1 );
+	}
+	}
+	//
+
+
+  ( "static" | "abstract" | "final"
+  | "public" { bPublic = true; }        // added by SMS
+  | "protected" { bPublic = true; }     // added by SMS
+  | "private" | "strictfp" )*
+
+  // added by SMS
+  {
+
+			//tmpToken = getToken( 0 );	//Removed by REYNAUD Sebastien (LOGICA)
+
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        if ((_bPublic && bPublic) || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
+                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+
+    }
+
+  UnmodifiedInterfaceDeclaration()
+
+  {
+      // added by SMS
+      _bPublic = bTemp;
+  }
+}
+
+void UnmodifiedInterfaceDeclaration() :
+{
+        String sOldClass = _sClass;
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        int oldClasses = _classes;
+
+
+		//Added by REYNAUD Sebastien (LOGICA)
+	 	ObjectMetric metric = new ObjectMetric();
+	 	//metric.firstLine = JavaParserTokenManager.nbligne;
+		//
+}
+{
+        {
+                if (!_sClass.equals("")) {
+                        _sClass += ".";
+                }
+                _sClass += getToken(2).image;
+                _classLevel ++;
+        }
+  "interface" Identifier() [TypeParameters()] [ "extends" NameList() ]
+  "{" ( InterfaceMemberDeclaration() )* "}"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _classLevel--;
+                if (_classLevel == 0)
+                {
+                        //_topLevelClasses++;
+
+                        //ObjectMetric metric = new ObjectMetric(); //Removed by REYNAUD Sebastien (LOGICA)
+
+                        metric.name = _sPackage + _sClass;
+                        metric.ncss = _ncss - oldNcss;
+                        metric.functions = _functions - oldFunctions;
+                        metric.classes = _classes - oldClasses;
+                        //metric.add( Util.getConstantObject() );
+                        //metric.add( Util.getConstantObject() );
+                        _vClasses.add( metric );
+                        _pPackageMetric.functions += _functions - oldFunctions;
+                        _pPackageMetric.classes++;
+
+                        // added by SMS
+                        _pPackageMetric.javadocs += _javadocs;
+                        //_pPackageMetric.javadocsLn += JavaParserTokenManager._iFormalComments - oldFormal;
+                        //_pPackageMetric.singleLn += JavaParserTokenManager._iSingleComments - oldSingle;
+                        //_pPackageMetric.multiLn += JavaParserTokenManager._iMultiComments - oldMulti;
+                        //
+                }
+
+                _functions = oldFunctions;
+                _classes = oldClasses + 1;
+                _sClass = sOldClass;
+        }
+}
+
+void InterfaceMemberDeclaration() :
+{
+   int modifiers;
+}
+{
+  EmptyStatement()
+|
+  LOOKAHEAD( /* Added by REYNAUD Sebastien (LOGICA) */ (Annotation())* /**/ ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "class" )
+  NestedClassDeclaration()
+|
+  LOOKAHEAD( /* Added by REYNAUD Sebastien (LOGICA) */ (Annotation())* /**/ ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface" )
+  NestedInterfaceDeclaration()
+  |
+  LOOKAHEAD( modifiers = Modifiers()
+                 "enum" <IDENTIFIER>
+             //EnumDeclaration(modifiers)
+             )
+   modifiers = Modifiers()
+   EnumDeclaration(modifiers)
+|
+  LOOKAHEAD( MethodDeclarationLookahead() )
+  MethodDeclaration()
+|
+  modifiers = Modifiers()
+  FieldDeclaration()
+}
+
+void FieldDeclaration() :
+{
+    // added by SMS
+    Token tmpToken = null;
+    boolean bPublic = false;
+}
+{
+  ( "public" { bPublic = true; }        // added by SMS
+  | "protected" { bPublic = true; }     // added by SMS
+  | "private" | "static" | "final" | "transient" | "volatile" )*
+
+  // added by SMS
+  {             tmpToken = getToken( 0 );
+
+                while( tmpToken.specialToken != null )
+                {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) )
+                    {
+                        if ((bPublic && _bPublic) || _bPrivate)
+                        {
+                            //_javadocs++;
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
+                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
+                        break;
+                    }
+                    else if ( tmpToken.specialToken.image.startsWith( "/*" ) )
+                    {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+  }
+  (Annotation())* Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"
+  { _ncss++; Util.debug( "_ncss++" ); }
+}
+
+void VariableDeclarator() :
+{}
+{
+  VariableDeclaratorId() [ "=" VariableInitializer() ]
+}
+
+void VariableDeclaratorId() :
+{}
+{
+        ("enum"|Identifier()) ( "[" "]" { _sName += "[]"; })*
+}
+
+void VariableInitializer() :
+{}
+{
+  ArrayInitializer()
+|
+  Expression()
+}
+
+void ArrayInitializer() :
+{}
+{
+  "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}"
+}
+
+void MethodDeclaration() :
+{
+    int oldNcss = _ncss;
+    int oldFunctions = _functions;
+    String sOldFunction = _sFunction;
+    int oldcyc = _cyc;
+    boolean bOldReturn = _bReturn;
+    Token tmpToken = null;
+    int jvdc = 0;
+
+    // added by SMS
+    int jvdcLines = 0;
+    int oldSingle;
+    int oldMulti;
+    boolean bPublic = false;
+    //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	_tmpToken=null;
+	//
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	FunctionMetric functionMetrics = new FunctionMetric();
+	//functionMetrics.firstLine = JavaParserTokenManager.nbligne;
+	//
+}
+{
+    {
+    if ( _tmpToken != null )
+    {
+        tmpToken = _tmpToken;
+    }
+    }
+    (
+	//Added by REYNAUD Sebastien (LOGICA)
+	{myToken = getToken(1);}
+	//
+     Annotation()
+  {
+      if ( tmpToken == null ) {
+
+          //tmpToken = getToken( 0 ); //Removed by REYNAUD Sebastien (LOGICA)
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		tmpToken = myToken;
+		//
+      }
+  }
+     )*
+
+    // we want to count javadoc comments, so we need first token
+  ( "public" { bPublic = true; }        // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+    | "protected" { bPublic = true; }        // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+    | "private"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "static"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "abstract"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "final"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "native"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "synchronized"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "strictfp"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+  )*
+
+    ( Annotation() )*
+
+         /*{
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+      }*/
+
+
+  [ TypeParameters() ]
+
+           {
+               _tmpResultToken = null;
+           }
+  ResultType()
+        {
+            if ( tmpToken == null )
+            {
+                tmpToken = _tmpResultToken;
+                if ( tmpToken == null )
+                {
+                    tmpToken = getToken( 0 );
+                }
+                Util.debug( "result type tmpToken: " + tmpToken );
+            }
+        }
+  MethodDeclarator() [ "throws" NameList() ]
+        {
+                _cyc = 1;
+                _bReturn = false;
+        }
+  ( Block() | ";" )
+         // note: the second ";" is just for a bug in java/sql/Connection.java
+         // at line 182 column 38 as of sun jdk 1.1.5. The same
+         // applies to java/text/DecimalFormat.java at line 629
+         // column 6.
+         //[ ";" ]
+         {
+  // added by SMS
+  {
+      Util.debug( "Token: " + String.valueOf( tmpToken.image ) );
+      while( tmpToken.specialToken != null )
+      {
+          Util.debug( "Token comment: " + String.valueOf( tmpToken.specialToken.image ) );
+          if ( tmpToken.specialToken.image.startsWith( "/**" ) )
+          {
+              _javadocs++;
+              Util.debug( "MethodDeclaration()._javadocs++" );
+              jvdc++;
+              if ((bPublic && _bPublic) || _bPrivate) {
+                  Util.debug( "_jvdc++" );
+                  _jvdc++;
+                  jvdcLines = JavaParserTokenManager._iMultiCommentsLast;
+                  _jvdcLines += jvdcLines;
+                  JavaParserTokenManager._iFormalComments += jvdcLines;
+              }
+              JavaParserTokenManager._iMultiComments -= jvdcLines;
+              break;
+          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+              jvdcLines = 0;
+              break;
+          }
+
+          //System.out.println("\n"+tmpToken.specialToken.image);
+
+          tmpToken = tmpToken.specialToken;
+      }
+
+      oldSingle = JavaParserTokenManager._iSingleComments;
+      oldMulti = JavaParserTokenManager._iMultiComments;
+  }
+
+
+             // removed by ccl
+             /*
+             while( tmpToken.specialToken != null ) {
+                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                     jvdc++;
+                     _javadocs++;
+                 }
+                 tmpToken = tmpToken.specialToken;
+             }
+             */
+             // removed by SMS
+             /*
+               while( tmpToken.specialToken != null ) {
+               if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+               jvdc++;
+               _javadocs++;
+               _bJavadoc = true;
+               }
+
+               tmpToken = tmpToken.specialToken;
+               }
+             */
+
+             if (_bReturn)
+             {
+                 _cyc--;
+             }
+             _ncss++;
+             Util.debug( "MethodDeclaration()._ncss++" );
+
+             //FunctionMetric functionMetrics = new FunctionMetric(); //Removed by REYNAUD Sebastien (LOGICA)
+
+             functionMetrics.name = _sPackage + _sClass + _sFunction;
+             functionMetrics.ncss = _ncss - oldNcss;
+             functionMetrics.ccn = _cyc;
+             functionMetrics.javadocs = jvdc;
+
+             // added by SMS
+             functionMetrics.javadocsLn = 0; //jvdcLines;
+             functionMetrics.singleLn = 0; //JavaParserTokenManager._iSingleComments - oldSingle;
+             functionMetrics.multiLn = 0; //JavaParserTokenManager._iMultiComments - oldMulti;
+             //
+
+             // specially added for Cobertura
+             // Commenting out for now until the rest of patch 2353196 is applied.
+             //functionMetrics.beginLine = (new Integer(beginLine));
+             //functionMetrics.endLine = (new Integer(endLine));
+
+             _vFunctions.add(functionMetrics);
+             _sFunction = sOldFunction;
+             _functions = oldFunctions + 1;
+             _cyc = oldcyc;
+             _bReturn = bOldReturn;
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		_tmpToken = null;
+		//
+         }
+}
+
+void MethodDeclarator() :
+{}
+{
+        {
+                _sFunction = "." + getToken(1).image;
+        }
+  Identifier() FormalParameters()
+        {
+                _sFunction += _sParameter;
+        }
+  ( "[" "]" { _sFunction += "[]"; } )*
+}
+
+void FormalParameters() :
+{}
+{
+        {
+                _sParameter = "(";
+        }
+  "(" [ FormalParameter() { _sParameter += _sName; }
+  ( "," FormalParameter() { _sParameter += "," + _sName; } )* ] ")"
+        {
+                _sParameter += ")";
+        }
+}
+
+void FormalParameter() :
+{}
+{
+    //[ "final" ]
+           Modifiers()
+    Type() [ "..." { _sName += "[]"; } ] VariableDeclaratorId()
+}
+
+void ConstructorDeclaration() :
+{
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        String sOldFunction = _sFunction;
+        int oldcyc = _cyc;
+        boolean bOldReturn = _bReturn;
+        Token tmpToken = null;
+        int jvdc = 0;
+
+        // added by SMS
+        int oldSingle;
+        int oldMulti;
+        int jvdcLines = 0;
+        boolean bPublic = false;
+        //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	//
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	FunctionMetric functionMetrics = new FunctionMetric();
+	//functionMetrics.firstLine = JavaParserTokenManager.nbligne;
+	//
+
+}
+{
+
+//Added by REYNAUD Sebastien (LOGICA)
+	(
+
+	{myToken = getToken(1);}
+
+     	Annotation()
+  	{
+      	if ( tmpToken == null )
+		{
+			tmpToken = myToken;
+      	}
+  	}
+  	)*
+//
+
+  [ "public" { bPublic = true; }        // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "protected" { bPublic = true; }      // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "private"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ ]
+  [ TypeParameters() ]
+  Identifier()
+        {
+            if ( tmpToken == null ) {
+                tmpToken = getToken( 0 );
+            }
+                _cyc = 1;
+                _sFunction = _sPackage + _sClass + "." + getToken(0).image;
+        }
+  FormalParameters()
+        {
+                _sFunction += _sParameter;
+                _bReturn = false;
+        }
+  [ "throws" NameList() ]
+         //{ System.out.println( "\n\nInside ContructorDeclaration\n" ); }
+  "{"
+         //{ System.out.println( "\n\nContructorDeclaration\n" ); }
+//  [ LOOKAHEAD(ExplicitConstructorInvocation()) ExplicitConstructorInvocation() ]
+//  [ LOOKAHEAD(("this" "(") | ([PrimaryExpression() "."]"super" "(")) ExplicitConstructorInvocation() ]
+    [ LOOKAHEAD("this" "(") ExplicitConstructorInvocation() ]
+    [ LOOKAHEAD([PrimaryExpression() "."]"super" "(") ExplicitConstructorInvocation() ]
+//         [ LOOKAHEAD(2) ExplicitConstructorInvocation() ]
+//         { System.out.println( "\n\nBefore BlockStatement\n" ); }
+
+
+         // added by SMS
+  {
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        jvdc++;
+                        if ((bPublic && _bPublic) || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            jvdcLines = JavaParserTokenManager._iMultiCommentsLast;
+                            _jvdcLines += jvdcLines;
+                            JavaParserTokenManager._iFormalComments += jvdcLines;
+                        }
+                        JavaParserTokenManager._iMultiComments -= jvdcLines;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        jvdcLines = 0;
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+
+
+                oldSingle = JavaParserTokenManager._iSingleComments;
+                oldMulti = JavaParserTokenManager._iMultiComments;
+                }
+
+    ( BlockStatement() )*
+         //{ System.out.println( "\n\nAfter BlockStatement\n" ); }
+  "}"
+                        // this is just because of a nonconformance to the JLS
+                        // in java/net/Socket.java at line 148 column 6 as of
+                        // sun jdk 1.1.5
+                        //[ ";" ]
+        {
+
+            /*
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        jvdc++;
+                        _javadocs++;
+                    }
+                    tmpToken = tmpToken.specialToken;
+                }
+            */
+                if (_bReturn) {
+                        _cyc--;
+                }
+                _ncss++;
+                Util.debug( "_ncss++" );
+
+                //FunctionMetric functionMetrics = new FunctionMetric(); //Removed by REYNAUD Sebastien (LOGICA)
+
+                functionMetrics.name = _sFunction;
+                functionMetrics.ncss = _ncss - oldNcss;
+                functionMetrics.ccn = _cyc;
+                functionMetrics.javadocs = jvdc;
+
+                // added by SMS
+                functionMetrics.javadocsLn = jvdcLines;
+                functionMetrics.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
+                functionMetrics.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
+                //
+                // specially added for Cobertura
+                // Commenting out for now until the rest of patch 2353196 is applied.
+                //functionMetrics.endLine = beginLine;
+                //functionMetrics.endLine = endLine;
+
+                _vFunctions.add(functionMetrics);
+                _sFunction = sOldFunction;
+                _functions = oldFunctions + 1;
+                _cyc = oldcyc;
+                _bReturn = bOldReturn;
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		_tmpToken = null;
+		//
+        }
+}
+
+void ExplicitConstructorInvocation() :
+{
+  //System.out.println( "\n\nBefore ExplicitConstructorInvocation 1" );
+}
+{
+  //LOOKAHEAD("this" Arguments() ";")
+  LOOKAHEAD("this" "(" )
+  "this" Arguments() ";"
+         { _ncss++;       Util.debug( "_ncss++" );}
+|
+  [ LOOKAHEAD(PrimaryExpression() ".") PrimaryExpression()
+  //{ System.out.println( "ExplicitConstructorInvocation before ." ); }
+"." ]
+  //{ System.out.println( "ExplicitConstructorInvocation before super" ); }
+  "super" Arguments() ";"
+  { _ncss++;       Util.debug( "_ncss++" );
+//System.out.println( "\n\nAfter ExplicitConstructorInvocation\n" );
+  }
+}
+
+void Initializer() :
+{}
+{
+  [ "static" ] Block()
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+/*
+ * Type, name and expression syntax follows.
+ */
+
+void Type() :
+{ _sName = ""; }
+{
+   LOOKAHEAD(2) ReferenceType()
+ |
+   PrimitiveType()
+          {
+                  _sName = getToken(0).image;
+          }
+}
+/*
+ccl 2008-01-24
+{
+  ( PrimitiveType()
+          {
+                  _sName = getToken(0).image;
+          }
+    | Name()
+    [TypeArguments() ["." Identifier()] ]
+) ( "[" "]" { _sName += "[]"; } )*
+}
+*/
+
+/*
+ * Takes special consideration for assert.
+ */
+
+void FieldTypeLookahead() :
+{}
+{
+  ( PrimitiveType()
+    | FieldTypeNameLookahead()
+ ) ( "[" "]"  )*
+}
+
+void PrimitiveType() :
+{}
+{
+  "boolean"
+|
+  "char"
+|
+  "byte"
+|
+  "short"
+|
+  "int"
+|
+  "long"
+|
+  "float"
+|
+  "double"
+}
+
+void ResultType() :
+{}
+{
+  "void"
+|
+  Type()
+}
+
+void Name() :
+/*
+ * A lookahead of 2 is required below since "Name" can be followed
+ * by a ".*" when used in the context of an "ImportDeclaration".
+ */
+{}
+{
+    ("enum"|Identifier()) //<IDENTIFIER> // no Identifier() because of assert type for field declaration
+        {
+                _sName = getToken(0).image;
+                _tmpResultToken = getToken( 0 );
+                Util.debug( "Name._tmpResultToken: " + _tmpResultToken );
+        }
+    ( LOOKAHEAD(2) "." ("enum"|Identifier())
+        {
+                _sName += "." + getToken(0).image;
+        }
+  )*
+}
+
+/**
+ * Takes special consideration for assert.
+ */
+void FieldTypeNameLookahead() :
+/*
+ * A lookahead of 2 is required below since "Name" can be followed
+ * by a ".*" when used in the context of an "ImportDeclaration".
+ */
+{}
+{
+    <IDENTIFIER> // no Identifier() because of assert type for field declaration
+  ( LOOKAHEAD(2) "." Identifier()
+  )*
+}
+
+void NameList() :
+{}
+{
+    Name() [TypeArguments()]
+   ( "," Name() [TypeArguments()]
+  )*
+}
+
+/*
+ * Expression syntax follows.
+ */
+
+void Expression() :
+{
+    //System.out.println( "Expression start" );
+}
+{
+
+/*Removed by REYNAUD Sebastien (LOGICA)
+
+  LOOKAHEAD( PrimaryExpression() AssignmentOperator() )
+  //{ System.out.println( "Expression" ); }
+  Assignment()
+|
+*/
+
+  ConditionalExpression()
+}
+
+/*Removed by REYNAUD Sebastien (LOGICA)
+void Assignment() :
+{}
+{
+  PrimaryExpression() AssignmentOperator() Expression()
+}
+*/
+
+void AssignmentOperator() :
+{}
+{
+  "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|="
+}
+
+void ConditionalExpression() :
+{}
+{
+  ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() { _cyc++; } ]
+}
+
+void ConditionalOrExpression() :
+{}
+{
+  ConditionalAndExpression() ( "||" { _cyc++; } ConditionalAndExpression() )*
+}
+
+void ConditionalAndExpression() :
+{}
+{
+  InclusiveOrExpression() ( "&&" { _cyc++; } InclusiveOrExpression() )*
+}
+
+void InclusiveOrExpression() :
+{}
+{
+  ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )*
+}
+
+void ExclusiveOrExpression() :
+{}
+{
+  AndExpression() ( "^" AndExpression() )*
+}
+
+void AndExpression() :
+{}
+{
+  EqualityExpression() ( "&" EqualityExpression() )*
+}
+
+/* Removed by REYNAUD Sebastien (LOGICA)
+void EqualityExpression() :
+{}
+{
+  InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )*
+}
+*/
+
+//Added by REYNAUD Sebastien (LOGICA)
+void EqualityExpression() :
+{}
+{
+  AssigmentExpression() ( ( "==" | "!=" | "+=" | "-=" | "*=" | "/=" | "&=" | "|=" | "^=" | "%=" | "<<=" | ">>=" | ">>>=") AssigmentExpression() )*
+}
+
+void AssigmentExpression() :
+{}
+{
+  InstanceOfExpression() (  "="  InstanceOfExpression() )*
+}
+//
+
+void InstanceOfExpression() :
+{}
+{
+  RelationalExpression() [ "instanceof" Type() ]
+}
+
+void RelationalExpression() :
+{}
+{
+  ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )*
+}
+
+void ShiftExpression() :
+{}
+{
+
+//  AdditiveExpression() ( ( "<<" | ">>" | ">>>" ) AdditiveExpression() )* //Removed by REYNAUD Sebastien (LOGICA)
+
+//Added by REYNAUD Sebastien (LOGICA)
+  AdditiveExpression() ( LOOKAHEAD(3) ( "<<" | (">" ">") (">")? ) AdditiveExpression() )*
+//
+
+}
+
+void AdditiveExpression() :
+{}
+{
+  MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )*
+}
+
+void MultiplicativeExpression() :
+{}
+{
+  UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )*
+}
+
+void UnaryExpression() :
+{}
+{
+  ( "+" | "-" ) UnaryExpression()
+|
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  UnaryExpressionNotPlusMinus()
+}
+
+void PreIncrementExpression() :
+{}
+{
+  "++" PrimaryExpression()
+}
+
+void PreDecrementExpression() :
+{}
+{
+  "--" PrimaryExpression()
+}
+
+void UnaryExpressionNotPlusMinus() :
+{}
+{
+  ( "~" | "!" ) UnaryExpression()
+|
+         //  LOOKAHEAD( PostfixLookahead() )
+         //  PostfixExpression()
+         //|
+  LOOKAHEAD( CastLookahead() )
+  CastExpression()
+|
+  PostfixExpression()
+}
+
+// This production is to determine lookahead only.  The LOOKAHEAD specifications
+// below are not used, but they are there just to indicate that we know about
+// this.
+void CastLookahead() :
+{}
+{
+  LOOKAHEAD(2)
+  "(" PrimitiveType()
+|
+         //  LOOKAHEAD("(" Name() "[")
+         //  "(" Name() "[" "]"
+         //|
+         // LOOKAHEAD(3)
+         //  "(" Name() ")" ( "~" | "!" | "(" | Identifier() | "this" | "super" | "new" | Literal() )
+  LOOKAHEAD("(" Type() "[")
+  "(" Type() "[" "]"
+|
+  "(" Type() ")" ( "~" | "!" | "(" | Identifier() | "this" | "super" | "new" | Literal() )
+         //|
+         // LOOKAHEAD(3)
+         // "(" Type() ")"  UnaryExpressionNotPlusMinus()
+}
+
+// To fix bug Test48.java. Clemens [2000-10-03]
+void PostfixLookahead() :
+{}
+{
+  "(" Name() ( LOOKAHEAD(2) "[" "]" )* "."
+}
+
+void PostfixExpression() :
+{}
+{
+  PrimaryExpression() [ "++" | "--" ]
+}
+
+void CastExpression() :
+{}
+{
+  LOOKAHEAD("(" PrimitiveType())
+  "(" Type() ")" UnaryExpression()
+|
+  "(" Type() ")" UnaryExpressionNotPlusMinus()
+}
+
+void PrimaryExpression() :
+{
+//    { System.out.println( "Before PrimaryExpression" ); }
+}
+{
+  PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )*
+}
+
+void PrimaryPrefix() :
+{}
+{
+  Literal()
+|
+//    { System.out.println( "PrimaryPrefix: this" ); }
+  "this" 
+
+   //Added by REYNAUD Sebastien (LOGICA)
+   (".")? ("new")? (Identifier())?
+   //
+
+         //|
+         //LOOKAHEAD( 2 )
+         //"super" "(" Expression() ")"
+         //{ System.out.println( "\n\nAfter PrimaryPrefix super(Expression)\n" ); }
+|
+  LOOKAHEAD(2)
+//  { System.out.println( "Before PrimaryPrefix super." ); }
+
+  //"super" "." Identifier() //removed by REYNAUD Sebastien (LOGICA)
+
+
+//Added by REYNAUD Sebastien (LOGICA)
+"super" (".")? (Identifier())?
+//
+
+|
+         //{ System.out.println( "\n\nBefore PrimaryPrefix (Expression)\n" ); }
+  "(" Expression() ")"
+|
+  AllocationExpression()
+//  { System.out.println( "PrimaryPrefix After AllocationExpression" ); }
+|
+  LOOKAHEAD( ResultType() "." "class" )
+//  { System.out.println( "PrimaryPrefix ResultType" ); }
+  ResultType() "." "class"
+|
+         Name() [ LOOKAHEAD(3) "." "super" "." Identifier() ]
+
+         /* The [ "." "super" "." Identifier() ]
+            has been added to fix a bug reported by
+            Chris Williamson. It might cause other problems,
+            maybe. 2002-05-11 */
+//  { System.out.println( "PrimaryPrefix after Name" ); }
+}
+
+void PrimarySuffix() :
+{}
+{
+  LOOKAHEAD(2)
+  "." "this"
+|
+  LOOKAHEAD(2)
+  "." AllocationExpression()
+|
+  LOOKAHEAD(3)
+  MemberSelector()
+|
+  "[" Expression() "]"
+|
+//  { System.out.println( "PrimarySuffix . Identifier()" ); }
+  "." Identifier()
+|
+  Arguments()
+
+ [ "{" MethodDeclaration() "}"]
+   
+}
+
+void Literal() :
+{
+}
+{
+  <INTEGER_LITERAL>
+|
+  <FLOATING_POINT_LITERAL>
+|
+  <CHARACTER_LITERAL>
+|
+  <STRING_LITERAL>
+|
+  BooleanLiteral()
+|
+  NullLiteral()
+}
+
+void BooleanLiteral() :
+{}
+{
+  "true"
+|
+  "false"
+}
+
+void NullLiteral() :
+{}
+{
+  "null"
+}
+
+void Arguments() :
+{
+// System.out.println( "Arguments start" );
+}
+{
+  "(" [ ArgumentList() ] ")"
+}
+
+void ArgumentList() :
+{
+// System.out.println( "ArgumentList start" );
+}
+{
+  Expression() ( "," Expression() )*
+}
+
+void AllocationExpression() :
+{
+        String sOldClass = _sClass;
+        //int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        int oldClasses = _classes;
+        String sName;
+
+}
+{
+  LOOKAHEAD(2)
+  "new" PrimitiveType() ArrayDimsAndInits()
+|
+         "new" Name()
+                        // this is all for anonymous classes
+                        { sName = _sName; }
+  [TypeArguments()]
+      (
+      ArrayDimsAndInits()
+    |
+      Arguments()
+                [
+                 {
+                         if (!_sClass.equals("")) {
+                                 _sClass += ".";
+                         }
+                         /*_sClass += sName;*/
+                         _sClass += sName + "$" + _anonClassCount ;
+
+                         _classLevel ++;
+                 }
+                        ClassBody()
+                        {
+                                _classLevel--;
+                                _functions = oldFunctions;
+                                _classes = oldClasses + 1;
+                                _sClass = sOldClass;
+                        }
+                ]
+    )
+}
+
+/*
+ * The third LOOKAHEAD specification below is to parse to PrimarySuffix
+ * if there is an expression between the "[...]".
+ */
+void ArrayDimsAndInits() :
+{}
+{
+  LOOKAHEAD(2)
+  ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )*
+|
+  ( "[" "]" )+ ArrayInitializer()
+}
+
+
+/*
+ * Statement syntax follows.
+ */
+
+void Statement() :
+{
+        _bReturn = false;
+        //{ System.out.println( "\n\nBefore Statement\n" ); }
+}
+{
+  LOOKAHEAD(2)
+  LabeledStatement()
+|
+  LOOKAHEAD(AssertStatementLookahead())
+  AssertStatement()
+|
+  Block()
+|
+  EmptyStatement()
+|
+         //{ System.out.println( "\n\nBefore Statement Expression\n" ); }
+  StatementExpression() ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+  //{ System.out.println( "\n\nHit Statement Expression\n" ); }
+|
+  SwitchStatement()
+|
+  IfStatement()
+        { _cyc++; }
+|
+  WhileStatement()
+        { _cyc++; }
+|
+  DoStatement()
+        { _cyc++; }
+|
+  ForStatement()
+        { _cyc++; }
+|
+  BreakStatement()
+|
+  ContinueStatement()
+|
+  ReturnStatement()
+|
+  ThrowStatement()
+|
+  SynchronizedStatement()
+|
+  TryStatement()
+}
+
+void LabeledStatement() :
+{}
+{
+  Identifier() ":" Statement()
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void AssertStatementLookahead() :
+{
+
+}
+{
+  <ASSERT>
+  Expression()
+}
+
+void AssertStatement() :
+{
+}
+{
+  <ASSERT>
+  Expression()
+  [ ":" Expression() ]
+  ";"
+  { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void Block() :
+{}
+{
+  "{"
+         //{_ncss++; Util.debug( "Block()._ncss++" );
+         //}
+   ( BlockStatement() )* "}"
+}
+
+void BlockStatement() :
+{}
+{
+    //LOOKAHEAD([ "final" ] FieldTypeLookahead() Identifier())
+  LOOKAHEAD( Modifiers() Type() ("enum"|<IDENTIFIER>) (";"|"="|","|"[""]") )
+  LocalVariableDeclaration() ";"
+        {
+                _ncss++;       Util.debug( "_ncss++" );
+        }
+|
+  Statement()
+|
+  UnmodifiedClassDeclaration()
+|
+  UnmodifiedInterfaceDeclaration()
+}
+
+/*void LocalVariableDeclaration() :
+{}
+{
+  [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )*
+}*/
+void LocalVariableDeclaration():
+{}
+{
+  Modifiers() Type() VariableDeclarator() ( "," VariableDeclarator() )*
+}
+
+
+void EmptyStatement() :
+{}
+{
+  ";"
+}
+
+void StatementExpression() :
+/*
+ * The last expansion of this production accepts more than the legal
+ * Java expansions for StatementExpression.  This expansion does not
+ * use PostfixExpression for performance reasons.
+ */
+{
+    //{ System.out.println( "\n\nBefore StatementExpression\n" ); }
+}
+{
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  PrimaryExpression()
+  [
+    "++"
+  |
+    "--"
+  |
+    AssignmentOperator() Expression()
+  ]
+}
+
+void SwitchStatement() :
+{}
+{
+        {
+                _localCases = 0;
+        }
+  "switch" "(" Expression() ")" "{"
+    ( SwitchLabel() ( BlockStatement() )* )*
+  "}"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void SwitchLabel() :
+{}
+{
+  "case" Expression() ":"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _localCases++;
+                _cyc++;
+        }
+|
+  "default" ":"
+        {
+                _ncss++;       Util.debug( "_ncss++" );
+        }
+}
+
+void IfStatement() :
+/*
+ * The disambiguating algorithm of JavaCC automatically binds dangling
+ * else's to the innermost if statement.  The LOOKAHEAD specification
+ * is to tell JavaCC that we know what we are doing.
+ */
+{}
+{
+  "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" { _ncss++;       Util.debug( "_ncss++" );} Statement() ]
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void WhileStatement() :
+{}
+{
+  "while" "(" Expression() ")" Statement()
+        { _ncss++;       Util.debug( "_ncss++" ); }
+}
+
+void DoStatement() :
+{}
+{
+  "do" Statement() "while" "(" Expression() ")" ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ForStatement() :
+{}
+{
+  "for" "("
+  (
+      LOOKAHEAD(Modifiers() Type() <IDENTIFIER> ":")
+      Modifiers() Type() <IDENTIFIER> ":" Expression()
+    |
+ [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ]
+      )
+")" Statement()
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ForInit() :
+{}
+{
+  LOOKAHEAD( [ "final" ] Type() ("enum"|Identifier()) )
+  LocalVariableDeclaration()
+|
+  StatementExpressionList()
+}
+
+void StatementExpressionList() :
+{}
+{
+  StatementExpression() ( "," StatementExpression() )*
+}
+
+void ForUpdate() :
+{}
+{
+  StatementExpressionList()
+}
+
+void BreakStatement() :
+{}
+{
+  "break" [ Identifier() ] ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ContinueStatement() :
+{}
+{
+  "continue" [ Identifier() ] ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ReturnStatement() :
+{}
+{
+  "return" [ Expression() ] ";"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _cyc++;
+                _bReturn = true;
+        }
+}
+
+void ThrowStatement() :
+{}
+{
+  "throw" Expression() ";"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _cyc++;
+        }
+}
+
+void SynchronizedStatement() :
+{}
+{
+  "synchronized" "(" Expression() ")" Block()
+        { _ncss++;       Util.debug( "_ncss++" ); }
+}
+
+void TryStatement() :
+/*
+ * Semantic check required here to make sure that at least one
+ * finally/catch is present.
+ */
+{}
+{
+  "try" TryWithResources() Block()
+  ( "catch" "(" CatchParameter() ")" Block() { _ncss++;       Util.debug( "_ncss++" ); _cyc++; } )*
+  [ "finally" Block() { _ncss++;       Util.debug( "_ncss++" );} ]
+}
+
+/** Try-with-resource parameter with jdk 7**/
+void TryWithResources() :
+{}
+{
+ ["(" ( "final" )* (Expression() [";"] )* ")"]
+}
+
+/** Multi-catch parameter with jdk 7 **/
+void CatchParameter() :
+{}
+{
+  Modifiers() ReferenceType() ("|" ReferenceType())* VariableDeclaratorId()
+}
+
+void Identifier() :
+{}
+{
+    <IDENTIFIER>
+|
+    <ASSERT>
+}
+
+/* Annotation syntax follows. */
+
+void Annotation():
+{}
+{
+   LOOKAHEAD( "@" Name() "(" ( <IDENTIFIER> "=" | ")" ))
+   NormalAnnotation()
+ |
+   LOOKAHEAD( "@" Name() "(" )
+   SingleMemberAnnotation()
+ |
+   MarkerAnnotation()
+}
+
+void NormalAnnotation():
+{}
+{
+   "@" Name() "(" [ MemberValuePairs() ] ")"
+}
+
+void MarkerAnnotation():
+{}
+{
+  "@" Name()
+}
+
+void SingleMemberAnnotation():
+{}
+{
+  "@" Name() "(" MemberValue() ")"
+}
+
+void MemberValuePairs():
+{}
+{
+   MemberValuePair() ( "," MemberValuePair() )*
+}
+
+void MemberValuePair():
+{}
+{
+    <IDENTIFIER> "=" MemberValue()
+}
+
+void MemberValue():
+{}
+{
+   Annotation()
+ |
+   MemberValueArrayInitializer()
+ |
+   ConditionalExpression()
+}
+
+void  MemberValueArrayInitializer():
+{}
+{
+  "{" [MemberValue()] ( LOOKAHEAD(2) "," MemberValue() )* [ "," ] "}"
+}
+
+
+/*
+ =================================================
+ Java 1.5 stuff starts here
+ =================================================
+*/
+
+/* Annotation Types. */
+
+//Added by REYNAUD Sebastien (LOGICA)
+void CreationAnnotation():
+{}
+{
+   "@" "interface" <IDENTIFIER> "{" (AnnotationTypeMemberDeclaration())*"}"
+}
+//
+
+void AnnotationTypeDeclaration(int modifiers):
+{}
+{
+  "@" "interface" <IDENTIFIER> AnnotationTypeBody()
+}
+
+void AnnotationTypeBody():
+{}
+{
+  "{" {_ncss++;       Util.debug( "_ncss++" );} ( AnnotationTypeMemberDeclaration() )* "}"
+}
+
+void AnnotationTypeMemberDeclaration():
+{
+   int modifiers;
+}
+{
+ modifiers = Modifiers()
+ (
+   LOOKAHEAD(Type() <IDENTIFIER> "(")
+   Type() <IDENTIFIER> "(" ")" [ DefaultValue() ] ";"
+        {
+            _ncss++;
+            Util.debug( "_ncss++" );
+        }
+
+  |
+   ClassOrInterfaceDeclaration(modifiers)
+  |
+   EnumDeclaration(modifiers)
+  |
+   AnnotationTypeDeclaration(modifiers)
+  |
+   FieldDeclaration15(modifiers)
+ )
+ |
+        ( ";" )
+        {
+            _ncss++;
+            Util.debug( "_ncss++" );
+        }
+
+}
+
+void DefaultValue():
+{}
+{
+  "default" MemberValue()
+}
+
+/*
+ * Modifiers. We match all modifiers in a single rule to reduce the chances of
+ * syntax errors for simple modifier mistakes. It will also enable us to give
+ * better error messages.
+ */
+
+int Modifiers():
+{
+   int modifiers = 0;
+   _tmpToken = null;
+}
+{
+ (
+  LOOKAHEAD(2)
+  (
+   "public" { modifiers |= ModifierSet.PUBLIC;
+      if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "static" { modifiers |= ModifierSet.STATIC;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "protected" { modifiers |= ModifierSet.PROTECTED;       if ( _tmpToken == null ) {
+       _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "private" { modifiers |= ModifierSet.PRIVATE;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "final" { modifiers |= ModifierSet.FINAL;       if ( _tmpToken == null ) {
+       _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "abstract" { modifiers |= ModifierSet.ABSTRACT;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "synchronized" { modifiers |= ModifierSet.SYNCHRONIZED;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "native" { modifiers |= ModifierSet.NATIVE;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "transient" { modifiers |= ModifierSet.TRANSIENT;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "volatile" { modifiers |= ModifierSet.VOLATILE;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "strictfp" { modifiers |= ModifierSet.STRICTFP;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   Annotation()
+  )
+ )*
+
+ {
+    return modifiers;
+ }
+}
+
+void ClassOrInterfaceDeclaration(int modifiers):
+{
+   boolean isInterface = false;
+}
+{
+  ( "class" | "interface" { isInterface = true; } )
+  <IDENTIFIER>
+  [ TypeParameters() ]
+  [ ExtendsList(isInterface) ]
+  [ ImplementsList(isInterface) ]
+  ClassOrInterfaceBody(isInterface)
+}
+
+void EnumDeclaration(int modifiers):
+{
+        String sOldClass = _sClass;
+        int oldClasses = _classes;
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+
+        // Chris Povirk
+        int oldSingle;
+        int oldMulti;
+}
+{
+    { Util.debug( "EnumDeclaration().START" ); }
+    "enum" <IDENTIFIER>
+         {
+                if (!_sClass.equals("")) {
+                        _sClass += ".";
+                }
+                _sClass += getToken(0).image;
+                _classLevel ++;
+         }
+  [ ImplementsList(false) ]
+{
+        // Chris Povirk
+      oldSingle = JavaParserTokenManager._iSingleComments;
+      oldMulti = JavaParserTokenManager._iMultiComments;
+}
+  EnumBody()
+         {
+             _classLevel--;
+             if (_classLevel == 0) {
+                 //_topLevelClasses++;
+                 ObjectMetric metric = new ObjectMetric();
+                 metric.name = _sPackage + _sClass;
+                 metric.ncss = _ncss - oldNcss;
+                 metric.functions = _functions - oldFunctions;
+                 metric.classes = _classes - oldClasses;
+                 Token lastToken = getToken( 0 );
+                 //metric.add( new Integer( lastToken.endLine ) );
+                 //metric.add( new Integer( lastToken.endColumn ) );
+                 metric.javadocs = _javadocs;
+
+                 // Chris Povirk
+                 metric.javadocsLn = _jvdcLines;
+                 metric.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
+                 metric.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
+
+                 _vClasses.add(metric);
+                 _pPackageMetric.functions += _functions - oldFunctions;
+                 _pPackageMetric.classes++;
+
+                 // added by SMS
+                 _pPackageMetric.javadocs += _javadocs;
+                 //_pPackageMetric.javadocsLn += JavaParserTokenManager._iFormalComments - oldFormal;
+                 //_pPackageMetric.singleLn += JavaParserTokenManager._iSingleComments - oldSingle;
+                 //_pPackageMetric.multiLn += Manager._iMultiComments - oldMulti;
+                 //
+             }
+             _functions = oldFunctions;
+             _classes = oldClasses + 1;
+             _sClass = sOldClass;
+         }
+}
+
+void TypeParameters():
+{}
+{
+//    "<" TypeParameter() ( "," TypeParameter() )* [">>>"|">>"|">"]// [LOOKAHEAD(2)">"] [LOOKAHEAD(2)">>"] //Removed by REYNAUD Sebastien (LOGICA)
+
+//Added by REYNAUD Sebastien (LOGICA)
+"<" TypeParameter() ( "," TypeParameter() )* ">"
+//
+
+}
+
+void ExtendsList(boolean isInterface):
+{
+   boolean extendsMoreThanOne = false;
+}
+{
+   "extends" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() { extendsMoreThanOne = true; } )*
+   {
+      if (extendsMoreThanOne && !isInterface)
+         throw new ParseException("A class cannot extend more than one other class");
+   }
+}
+
+void ImplementsList(boolean isInterface):
+{}
+{
+   "implements" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() )*
+   {
+      if (isInterface)
+         throw new ParseException("An interface cannot implement other interfaces");
+   }
+}
+
+void ClassOrInterfaceBody(boolean isInterface):
+{}
+{
+  "{"
+         { _ncss++; Util.debug( "ClassOrInterfaceBody()._ncss++" ); }
+ ( ClassOrInterfaceBodyDeclaration(isInterface) )* "}"
+}
+
+void EnumBody():
+{}
+{
+    "{"
+           {
+               _ncss++;
+               Util.debug( "_ncss++" );
+           }
+
+   [ EnumConstant() ( LOOKAHEAD(2) "," EnumConstant() )* ]
+        [ "," ]
+   [ ";" ( ClassOrInterfaceBodyDeclaration(false) )* ]
+   "}"
+}
+
+void TypeParameter():
+{}
+{
+    <IDENTIFIER> [ TypeBound() ]
+}
+
+void ClassOrInterfaceType():
+{}
+{
+  <IDENTIFIER>
+{
+                _sName += getToken(0).image;
+                if ( _tmpResultToken == null )
+                {
+                  _tmpResultToken = getToken( 0 );
+                  Util.debug( "ClassOrInterfaceType._tmpResultToken: " + _tmpResultToken );
+                }
+}
+[ LOOKAHEAD(4) TypeArguments() ]
+  ( LOOKAHEAD(2) "." <IDENTIFIER>
+        {
+                _sName += "." + getToken(0).image;
+        }
+ [ LOOKAHEAD(2) TypeArguments() ] )*
+}
+
+void ClassOrInterfaceBodyDeclaration(boolean isInterface):
+{
+   //boolean isNestedInterface = false;
+   int modifiers;
+}
+{
+  LOOKAHEAD(2)
+  Initializer()
+  {
+     if (isInterface)
+        throw new ParseException("An interface cannot have initializers");
+  }
+|
+  modifiers = Modifiers() // Just get all the modifiers out of the way. If you want to do
+              // more checks, pass the modifiers down to the member
+  (
+      ClassOrInterfaceDeclaration(modifiers)
+    |
+      EnumDeclaration(modifiers)
+    |
+      LOOKAHEAD( [ TypeParameters() ] <IDENTIFIER> "(" )
+      ConstructorDeclaration()
+    |
+      LOOKAHEAD( Type() <IDENTIFIER> ( "[" "]" )* ( "," | "=" | ";" ) )
+      FieldDeclaration15(modifiers)
+    |
+      MethodDeclaration15(modifiers)
+  )
+|
+  ";"
+}
+
+void EnumConstant():
+{}
+{
+  Modifiers() <IDENTIFIER> [ Arguments() ] [ ClassOrInterfaceBody(false) ]
+}
+
+void TypeBound():
+{}
+{
+   "extends" ClassOrInterfaceType() ( "&" ClassOrInterfaceType() )*
+}
+
+void TypeArguments():
+{}
+{
+//    "<" TypeArgument() ( LOOKAHEAD(2) "," TypeArgument() )* [LOOKAHEAD(3)">"] [LOOKAHEAD(3)">>"] [LOOKAHEAD(3)">>>"] //Removed by REYNAUD Sebastien (LOGICA)
+
+//Added by REYNAUD Sebastien (LOGICA)
+	"<" { _sName += "<"; } (TypeArgument() ( LOOKAHEAD(2) "," { _sName += ","; } TypeArgument() )* )* ">" { _sName += ">"; }
+//
+
+}
+
+void TypeArgument():
+{}
+{
+/* ccl 2008-01-24
+    LOOKAHEAD(2)
+    <IDENTIFIER> TypeArguments()
+ |*/
+   ReferenceType()
+ |
+   "?" [ WildcardBounds() ]
+
+}
+
+void ReferenceType():
+{}
+{
+/* ccl 2008-01-23 */
+   PrimitiveType()  { _sName = getToken(0).image; } ( LOOKAHEAD(2) "[" "]" { _sName += "[]"; } )+
+  |
+   ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" { _sName += "[]"; } )*
+}
+
+void WildcardBounds():
+{}
+{
+   "extends" ReferenceType()
+ |
+   "super" ReferenceType()
+}
+
+void FieldDeclaration15(int modifiers):
+{}
+{
+  // Modifiers are already matched in the caller
+  Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"
+}
+
+void MethodDeclaration15(int modifiers):
+{}
+{
+    MethodDeclaration()
+    /*
+  // Modifiers already matched in the caller!
+  [ TypeParameters() ]
+  ResultType()
+  MethodDeclarator15() [ "throws" NameList() ]
+         ( Block() | ";" ) { _ncss++; Util.debug( "MethodDeclaration15()._ncss++" ); }
+    */
+}
+
+void MethodDeclarator15():
+{}
+{
+  <IDENTIFIER> FormalParameters() ( "[" "]" )*
+}
+
+void FormalParameters15():
+{}
+{
+  "(" [ FormalParameter15() ( "," FormalParameter15() )* ] ")"
+}
+
+void FormalParameter15():
+{}
+{
+  Modifiers() Type() [ "..." ] VariableDeclaratorId()
+}
+
+void MemberSelector():
+{}
+{
+  "." TypeArguments() <IDENTIFIER>
+}
+
diff --git a/cobertura/src/main/javacc/JavaParserInterface.java b/cobertura/src/main/javacc/JavaParserInterface.java
new file mode 100644
index 0000000..c45766c
--- /dev/null
+++ b/cobertura/src/main/javacc/JavaParserInterface.java
@@ -0,0 +1,47 @@
+package net.sourceforge.cobertura.javancss.parser;
+
+import java.util.*;
+
+public interface JavaParserInterface
+{
+    public void parse() throws Exception;
+    public void parseImportUnit() throws Exception;
+
+    public int getNcss();
+    
+    public int getLOC();
+
+    // added by SMS
+    public int getJvdc();
+
+    /*public int getTopLevelClasses() {
+      return _topLevelClasses;
+      }*/
+    
+    public List/*<FunctionMetric>*/ getFunction();
+    
+    /**
+     * @return Top level classes in sorted order
+     */
+    public List/*<ObjectMetric>*/ getObject();
+    
+    /**
+     * @return The empty package consists of the name ".".
+     */
+    public Map/*<String,PackageMetric>*/ getPackage();
+    
+    public List getImports();
+
+    /**
+     * name, beginLine, ...
+     */
+    public Object[] getPackageObjects();
+
+    /**
+     * if javancss is used with cat *.java a long
+     * input stream might get generated, so line
+     * number information in case of an parse exception
+     * is not very useful.
+     */
+    public String getLastFunction();
+}
diff --git a/cobertura/src/main/javacc/debug/JavaDebug1.1.jj b/cobertura/src/main/javacc/debug/JavaDebug1.1.jj
new file mode 100644
index 0000000..7e068c6
--- /dev/null
+++ b/cobertura/src/main/javacc/debug/JavaDebug1.1.jj
@@ -0,0 +1,3465 @@
+/**
+ *
+ * Copyright (C) 1996, 1997 Sun Microsystems Inc.
+ *
+ * Use of this file and the system it is part of is constrained by the
+ * file COPYRIGHT in the root directory of this system.  You may, however,
+ * make any modifications you wish to this file.
+ *
+ * Java files generated by running JavaCC on this file (or modified versions
+ * of this file) may be used in exactly the same manner as Java files
+ * generated from any grammar developed by you.
+ *
+ * Author: Sriram Sankar
+ * Date: 3/5/97
+ *
+ * This file contains a Java grammar and actions that implement a front-end.
+ *
+ *
+ * Changes applied to this grammar are for the JavaNCSS
+ * application: http://www.kclee.com/clemens/java/javancss/
+ * Author: Chr. Clemens Lee, 2000-01-31
+ * Additional counting of javadoc comments done by
+ *    Emilio Gongora, <emilio at sms.nl> and
+ *    Guillermo Rodriguez, <guille at sms.nl>.
+ * Anonymous class count patch by Vesa Karvonnen, <vesa_karvonen at hotmail.com> 2002-10-30.
+ */
+
+options {
+  JAVA_UNICODE_ESCAPE = true;
+  STATIC = false;
+  //* // DEBUG MODE
+  DEBUG_PARSER = true;
+  // */
+}
+
+PARSER_BEGIN(JavaParserDebug)
+
+//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
+package net.sourceforge.cobertura.javancss.parser.debug;
+
+import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
+
+import java.util.*;
+
+import net.sourceforge.cobertura.javancss.ccl.Util;
+
+import net.sourceforge.cobertura.javancss.FunctionMetric;
+import net.sourceforge.cobertura.javancss.ObjectMetric;
+import net.sourceforge.cobertura.javancss.PackageMetric;
+
+/**
+ * Java source code parser based on a grammar compiled by
+ * JavaCC from Java1.1.jj to the JavaParserDebug class.<p>
+ *
+ * This class is responsible for parsing Java code and counting
+ * all metrics during this parsing process.
+ * The rest of the application is only responsible for invoking
+ * this parser in a convenient way and to present the results
+ * to the user.<p>
+ *
+ * This grammar is based on the Java grammar that comes as an
+ * example with JavaCC, but has been extended to collect the
+ * metrics data (and adapted to support real life and jdk 1.4
+ * Java sources as well).
+ *
+ * @author    Sriram Sankar (original JavaCC grammar)
+ *            , Chr. Clemens Lee <clemens at kclee.com> (JavaNCSS metrics)
+ *            , additional counting of javadoc comments done by
+ *              Emilio Gongora, <emilio at sms.nl> and
+ *              Guillermo Rodriguez, <guille at sms.nl>.
+ *            Anonymous class count patch by Vesa Karvonnen, <vesa_karvonen at hotmail.com> 2002-10-30.
+ * @version   2000-01-31 $Id: Java1.1.jj 159 2009-05-27 22:18:55Z hboutemy $
+ */
+public class JavaParserDebug implements JavaParserInterface
+{
+    {
+        //* // DEBUG MODE
+        Util.setDebug( true );
+        // */
+    }
+    private boolean _bReturn         = false;
+    private int     _ncss            = 0;     // general counter
+    private int     _loc             = 0;
+    private int     _cyc             = 1;
+    private int     _localCases      = 0;
+    private String  _sName           = "";    // name of last token
+    private String  _sParameter      = "";
+    private String  _sPackage        = "";
+    private String  _sClass          = "";
+    private String  _sFunction       = "";
+    private int     _functions       = 0;     // number of functions in this class
+    //private int     _topLevelClasses = 0;
+    private int     _classes         = 0;
+    private int     _classLevel      = 0;
+    private int     _anonClassCount  = 1;
+
+    private int     _jvdcLines = 0;           // added by SMS
+    private int     _jvdc      = 0;
+    private boolean _bPrivate  = true;//false;        // added by SMS
+    private boolean _bPublic   = true;        // added by SMS
+
+    /**
+     * For each class the number of formal
+     * comments in toplevel methods, constructors, inner
+     * classes, and for the class itself are counted.
+     * The top level comment has to be directly before
+     * the class definition, not before the package or
+     * import statement as it is often seen in source code
+     * examples (at the beginning of your source files you
+     * should instead put your copyright notice).
+     */
+    private int    _javadocs   = 0;              // global javadocs
+    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
+
+    /**
+     * Metrics for each class/interface are stored in this
+     * vector.
+     */
+    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
+    private List _vImports = new ArrayList();
+    private Object[] _aoPackage = null;
+    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
+    private PackageMetric _pPackageMetric;
+
+    private Token _tmpToken = null;
+    /** Argh, too much of a state machine. */
+    private Token _tmpResultToken = null;
+
+    private String _formatPackage(String sPackage_) {
+        if (sPackage_.equals("")) {
+            return ".";
+        }
+
+        return sPackage_.substring(0, sPackage_.length() - 1);
+    }
+
+    public void parse() throws Exception {
+      CompilationUnit();
+    }
+
+    public void parseImportUnit() throws Exception {
+      ImportUnit();
+    }
+
+    public int getNcss() {
+        return _ncss;
+    }
+
+    public int getLOC() {
+        return _loc;
+    }
+
+    // added by SMS
+    public int getJvdc() {
+        return _jvdc;
+    }
+
+    /*public int getTopLevelClasses() {
+      return _topLevelClasses;
+      }*/
+
+    public List/*<FunctionMetric>*/ getFunction() {
+        return _vFunctions;
+    }
+
+    /**
+     * @return Top level classes in sorted order
+     */
+    public List/*<ObjectMetric>*/ getObject() {
+        Collections.sort(_vClasses);
+        return _vClasses;
+    }
+
+    /**
+     * @return The empty package consists of the name ".".
+     */
+    public Map/*<String,PackageMetric>*/ getPackage() {
+        return _htPackage;
+    }
+
+    public List getImports() {
+        return _vImports;
+    }
+
+    /**
+     * name, beginLine, ...
+     */
+    public Object[] getPackageObjects() {
+        return _aoPackage;
+    }
+
+    /**
+     * if javancss is used with cat *.java a long
+     * input stream might get generated, so line
+     * number information in case of an parse exception
+     * is not very useful.
+     */
+    public String getLastFunction() {
+        return _sPackage + _sClass + _sFunction;
+    }
+
+   /**
+    * Class to hold modifiers.
+    */
+   static public final class ModifierSet
+   {
+     /* Definitions of the bits in the modifiers field.  */
+     public static final int PUBLIC = 0x0001;
+     public static final int PROTECTED = 0x0002;
+     public static final int PRIVATE = 0x0004;
+     public static final int ABSTRACT = 0x0008;
+     public static final int STATIC = 0x0010;
+     public static final int FINAL = 0x0020;
+     public static final int SYNCHRONIZED = 0x0040;
+     public static final int NATIVE = 0x0080;
+     public static final int TRANSIENT = 0x0100;
+     public static final int VOLATILE = 0x0200;
+     public static final int STRICTFP = 0x1000;
+
+     /** A set of accessors that indicate whether the specified modifier
+         is in the set. */
+
+     public boolean isPublic(int modifiers)
+     {
+       return (modifiers & PUBLIC) != 0;
+     }
+
+     public boolean isProtected(int modifiers)
+     {
+       return (modifiers & PROTECTED) != 0;
+     }
+
+     public boolean isPrivate(int modifiers)
+     {
+       return (modifiers & PRIVATE) != 0;
+     }
+
+     public boolean isStatic(int modifiers)
+     {
+       return (modifiers & STATIC) != 0;
+     }
+
+     public boolean isAbstract(int modifiers)
+     {
+       return (modifiers & ABSTRACT) != 0;
+     }
+
+     public boolean isFinal(int modifiers)
+     {
+       return (modifiers & FINAL) != 0;
+     }
+
+     public boolean isNative(int modifiers)
+     {
+       return (modifiers & NATIVE) != 0;
+     }
+
+     public boolean isStrictfp(int modifiers)
+     {
+       return (modifiers & STRICTFP) != 0;
+     }
+
+     public boolean isSynchronized(int modifiers)
+     {
+       return (modifiers & SYNCHRONIZED) != 0;
+     }
+
+     public boolean isTransient(int modifiers)
+      {
+       return (modifiers & TRANSIENT) != 0;
+     }
+
+     public boolean isVolatile(int modifiers)
+     {
+       return (modifiers & VOLATILE) != 0;
+     }
+
+     /**
+      * Removes the given modifier.
+      */
+     static int removeModifier(int modifiers, int mod)
+     {
+        return modifiers & ~mod;
+     }
+   }
+}
+
+PARSER_END(JavaParserDebug)
+
+TOKEN_MGR_DECLS :
+{
+    // added by SMS
+
+    public static int  _iSingleComments = 0;
+    public static int  _iMultiComments = 0;
+    public static int  _iFormalComments = 0;
+
+    public static int  _iMultiCommentsLast = 0;
+}
+
+/* WHITE SPACE */
+
+SKIP :
+{
+  " "
+| "\t"
+| "\n"
+| "\r"
+| "\f"
+| "\u001a"
+}
+
+/* COMMENTS */
+
+MORE :
+{
+   //   "//" : IN_SINGLE_LINE_COMMENT
+   //|
+    //  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+    //|
+  "/*" { _iMultiCommentsLast = 0; } : IN_MULTI_LINE_COMMENT     // MODIFIED by SMS
+}
+
+SPECIAL_TOKEN :
+{
+   <SINGLE_LINE_COMMENT: "//"> { _iSingleComments++; } : IN_SINGLE_LINE_COMMENT       // MODIFIED by SMS:  the global counter is incremented
+}
+
+<IN_SINGLE_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+    <SINGLE_LINE_COMMENT2: (~["\n","\r"])* ("\n"|"\r"|"\r\n")?>: DEFAULT
+}
+
+//<IN_SINGLE_LINE_COMMENT>
+//SPECIAL_TOKEN :
+//{
+//   <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : DEFAULT
+   //<SINGLE_LINE_COMMENT: (~["\n", "\r"])* ("\n" | "\r" | "\r\n")? >
+   /*"\n" : DEFAULT
+      | "\r" : DEFAULT
+      | "\r\n" : DEFAULT
+      | <~[]>*/
+//}
+
+//<IN_FORMAL_COMMENT>
+//SPECIAL_TOKEN :
+//{
+//  <FORMAL_COMMENT: "*/" > : DEFAULT
+//}
+
+<IN_MULTI_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+  <END_OF_LINE_MULTI: "\n" | "\r" | "\r\n" > { _iMultiComments++; _iMultiCommentsLast++; } : IN_MULTI_LINE_COMMENT      // added by SMS
+  | <MULTI_LINE_COMMENT: "*/" > { _iMultiComments++; _iMultiCommentsLast++; } : DEFAULT                                 // the global counter is incremented
+}
+
+//<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
+<IN_SINGLE_LINE_COMMENT,IN_MULTI_LINE_COMMENT>
+MORE :
+{
+  < ~[] >
+}
+
+/* RESERVED WORDS AND LITERALS */
+
+TOKEN :
+{
+  < ABSTRACT: "abstract" >
+| < ASSERT: "assert" >
+| < BOOLEAN: "boolean" >
+| < BREAK: "break" >
+| < BYTE: "byte" >
+| < CASE: "case" >
+| < CATCH: "catch" >
+| < CHAR: "char" >
+| < CLASS: "class" >
+| < CONST: "const" >
+| < CONTINUE: "continue" >
+| < _DEFAULT: "default" >
+| < DO: "do" >
+| < DOUBLE: "double" >
+| < ELSE: "else" >
+| < ENUM: "enum" >
+| < EXTENDS: "extends" >
+| < FALSE: "false" >
+| < FINAL: "final" >
+| < FINALLY: "finally" >
+| < FLOAT: "float" >
+| < FOR: "for" >
+| < GOTO: "goto" >
+| < IF: "if" >
+| < IMPLEMENTS: "implements" >
+| < IMPORT: "import" >
+| < INSTANCEOF: "instanceof" >
+| < INT: "int" >
+| < INTERFACE: "interface" >
+| < LONG: "long" >
+| < NATIVE: "native" >
+| < NEW: "new" >
+| < NULL: "null" >
+| < PACKAGE: "package">
+| < PRIVATE: "private" >
+| < PROTECTED: "protected" >
+| < PUBLIC: "public" >
+| < RETURN: "return" >
+| < SHORT: "short" >
+| < STATIC: "static" >
+| < TESTAAAA: "strictfp" > // STRICTFP lets the linux jdk1.1 compiler fail
+| < SUPER: "super" >
+| < SWITCH: "switch" >
+| < SYNCHRONIZED: "synchronized" >
+| < THIS: "this" >
+| < THROW: "throw" >
+| < THROWS: "throws" >
+| < TRANSIENT: "transient" >
+| < TRUE: "true" >
+| < TRY: "try" >
+| < VOID: "void" >
+| < VOLATILE: "volatile" >
+| < WHILE: "while" >
+}
+
+/* LITERALS */
+
+TOKEN :
+{
+  < INTEGER_LITERAL:
+        <DECIMAL_LITERAL> (["l","L"])?
+      | <HEX_LITERAL> (["l","L"])?
+      | <OCTAL_LITERAL> (["l","L"])?
+  >
+|
+  < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
+|
+  < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
+|
+  < #OCTAL_LITERAL: "0" (["0"-"7"])* >
+|
+  < FLOATING_POINT_LITERAL:
+        (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])?
+      | "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])?
+      | (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])?
+      | (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]
+  >
+|
+  < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+|
+  < CHARACTER_LITERAL:
+      "'"
+                                         // "\r" eigendlich noch dazu, aber wegen bug
+                                         // in java/text/TextBoundaryData.java
+                                         // in zeile 55 columne 12 und zeile 69
+                                         // columne 12 hier entfernt.
+                                         // (   (~["'","\\","\n","\r"])
+      (   (~["\\","\n"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )
+      "'"
+  >
+|
+  < STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\""
+  >
+}
+
+/* IDENTIFIERS */
+
+TOKEN :
+{
+  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
+|
+  < #LETTER:
+      [  // all chars for which Character.isIdentifierStart is true
+         "$",
+         "A"-"Z",
+         "_",
+         "a"-"z",
+         "\u00a2"-"\u00a5",
+         "\u00aa",
+         "\u00b5",
+         "\u00ba",
+         "\u00c0"-"\u00d6",
+         "\u00d8"-"\u00f6",
+         "\u00f8"-"\u021f",
+         "\u0222"-"\u0233",
+         "\u0250"-"\u02ad",
+         "\u02b0"-"\u02b8",
+         "\u02bb"-"\u02c1",
+         "\u02d0"-"\u02d1",
+         "\u02e0"-"\u02e4",
+         "\u02ee",
+         "\u037a",
+         "\u0386",
+         "\u0388"-"\u038a",
+         "\u038c",
+         "\u038e"-"\u03a1",
+         "\u03a3"-"\u03ce",
+         "\u03d0"-"\u03d7",
+         "\u03da"-"\u03f3",
+         "\u0400"-"\u0481",
+         "\u048c"-"\u04c4",
+         "\u04c7"-"\u04c8",
+         "\u04cb"-"\u04cc",
+         "\u04d0"-"\u04f5",
+         "\u04f8"-"\u04f9",
+         "\u0531"-"\u0556",
+         "\u0559",
+         "\u0561"-"\u0587",
+         "\u05d0"-"\u05ea",
+         "\u05f0"-"\u05f2",
+         "\u0621"-"\u063a",
+         "\u0640"-"\u064a",
+         "\u0671"-"\u06d3",
+         "\u06d5",
+         "\u06e5"-"\u06e6",
+         "\u06fa"-"\u06fc",
+         "\u0710",
+         "\u0712"-"\u072c",
+         "\u0780"-"\u07a5",
+         "\u0905"-"\u0939",
+         "\u093d",
+         "\u0950",
+         "\u0958"-"\u0961",
+         "\u0985"-"\u098c",
+         "\u098f"-"\u0990",
+         "\u0993"-"\u09a8",
+         "\u09aa"-"\u09b0",
+         "\u09b2",
+         "\u09b6"-"\u09b9",
+         "\u09dc"-"\u09dd",
+         "\u09df"-"\u09e1",
+         "\u09f0"-"\u09f3",
+         "\u0a05"-"\u0a0a",
+         "\u0a0f"-"\u0a10",
+         "\u0a13"-"\u0a28",
+         "\u0a2a"-"\u0a30",
+         "\u0a32"-"\u0a33",
+         "\u0a35"-"\u0a36",
+         "\u0a38"-"\u0a39",
+         "\u0a59"-"\u0a5c",
+         "\u0a5e",
+         "\u0a72"-"\u0a74",
+         "\u0a85"-"\u0a8b",
+         "\u0a8d",
+         "\u0a8f"-"\u0a91",
+         "\u0a93"-"\u0aa8",
+         "\u0aaa"-"\u0ab0",
+         "\u0ab2"-"\u0ab3",
+         "\u0ab5"-"\u0ab9",
+         "\u0abd",
+         "\u0ad0",
+         "\u0ae0",
+         "\u0b05"-"\u0b0c",
+         "\u0b0f"-"\u0b10",
+         "\u0b13"-"\u0b28",
+         "\u0b2a"-"\u0b30",
+         "\u0b32"-"\u0b33",
+         "\u0b36"-"\u0b39",
+         "\u0b3d",
+         "\u0b5c"-"\u0b5d",
+         "\u0b5f"-"\u0b61",
+         "\u0b85"-"\u0b8a",
+         "\u0b8e"-"\u0b90",
+         "\u0b92"-"\u0b95",
+         "\u0b99"-"\u0b9a",
+         "\u0b9c",
+         "\u0b9e"-"\u0b9f",
+         "\u0ba3"-"\u0ba4",
+         "\u0ba8"-"\u0baa",
+         "\u0bae"-"\u0bb5",
+         "\u0bb7"-"\u0bb9",
+         "\u0c05"-"\u0c0c",
+         "\u0c0e"-"\u0c10",
+         "\u0c12"-"\u0c28",
+         "\u0c2a"-"\u0c33",
+         "\u0c35"-"\u0c39",
+         "\u0c60"-"\u0c61",
+         "\u0c85"-"\u0c8c",
+         "\u0c8e"-"\u0c90",
+         "\u0c92"-"\u0ca8",
+         "\u0caa"-"\u0cb3",
+         "\u0cb5"-"\u0cb9",
+         "\u0cde",
+         "\u0ce0"-"\u0ce1",
+         "\u0d05"-"\u0d0c",
+         "\u0d0e"-"\u0d10",
+         "\u0d12"-"\u0d28",
+         "\u0d2a"-"\u0d39",
+         "\u0d60"-"\u0d61",
+         "\u0d85"-"\u0d96",
+         "\u0d9a"-"\u0db1",
+         "\u0db3"-"\u0dbb",
+         "\u0dbd",
+         "\u0dc0"-"\u0dc6",
+         "\u0e01"-"\u0e30",
+         "\u0e32"-"\u0e33",
+         "\u0e3f"-"\u0e46",
+         "\u0e81"-"\u0e82",
+         "\u0e84",
+         "\u0e87"-"\u0e88",
+         "\u0e8a",
+         "\u0e8d",
+         "\u0e94"-"\u0e97",
+         "\u0e99"-"\u0e9f",
+         "\u0ea1"-"\u0ea3",
+         "\u0ea5",
+         "\u0ea7",
+         "\u0eaa"-"\u0eab",
+         "\u0ead"-"\u0eb0",
+         "\u0eb2"-"\u0eb3",
+         "\u0ebd",
+         "\u0ec0"-"\u0ec4",
+         "\u0ec6",
+         "\u0edc"-"\u0edd",
+         "\u0f00",
+         "\u0f40"-"\u0f47",
+         "\u0f49"-"\u0f6a",
+         "\u0f88"-"\u0f8b",
+         "\u1000"-"\u1021",
+         "\u1023"-"\u1027",
+         "\u1029"-"\u102a",
+         "\u1050"-"\u1055",
+         "\u10a0"-"\u10c5",
+         "\u10d0"-"\u10f6",
+         "\u1100"-"\u1159",
+         "\u115f"-"\u11a2",
+         "\u11a8"-"\u11f9",
+         "\u1200"-"\u1206",
+         "\u1208"-"\u1246",
+         "\u1248",
+         "\u124a"-"\u124d",
+         "\u1250"-"\u1256",
+         "\u1258",
+         "\u125a"-"\u125d",
+         "\u1260"-"\u1286",
+         "\u1288",
+         "\u128a"-"\u128d",
+         "\u1290"-"\u12ae",
+         "\u12b0",
+         "\u12b2"-"\u12b5",
+         "\u12b8"-"\u12be",
+         "\u12c0",
+         "\u12c2"-"\u12c5",
+         "\u12c8"-"\u12ce",
+         "\u12d0"-"\u12d6",
+         "\u12d8"-"\u12ee",
+         "\u12f0"-"\u130e",
+         "\u1310",
+         "\u1312"-"\u1315",
+         "\u1318"-"\u131e",
+         "\u1320"-"\u1346",
+         "\u1348"-"\u135a",
+         "\u13a0"-"\u13f4",
+         "\u1401"-"\u166c",
+         "\u166f"-"\u1676",
+         "\u1681"-"\u169a",
+         "\u16a0"-"\u16ea",
+         "\u1780"-"\u17b3",
+         "\u17db",
+         "\u1820"-"\u1877",
+         "\u1880"-"\u18a8",
+         "\u1e00"-"\u1e9b",
+         "\u1ea0"-"\u1ef9",
+         "\u1f00"-"\u1f15",
+         "\u1f18"-"\u1f1d",
+         "\u1f20"-"\u1f45",
+         "\u1f48"-"\u1f4d",
+         "\u1f50"-"\u1f57",
+         "\u1f59",
+         "\u1f5b",
+         "\u1f5d",
+         "\u1f5f"-"\u1f7d",
+         "\u1f80"-"\u1fb4",
+         "\u1fb6"-"\u1fbc",
+         "\u1fbe",
+         "\u1fc2"-"\u1fc4",
+         "\u1fc6"-"\u1fcc",
+         "\u1fd0"-"\u1fd3",
+         "\u1fd6"-"\u1fdb",
+         "\u1fe0"-"\u1fec",
+         "\u1ff2"-"\u1ff4",
+         "\u1ff6"-"\u1ffc",
+         "\u203f"-"\u2040",
+         "\u207f",
+         "\u20a0"-"\u20af",
+         "\u2102",
+         "\u2107",
+         "\u210a"-"\u2113",
+         "\u2115",
+         "\u2119"-"\u211d",
+         "\u2124",
+         "\u2126",
+         "\u2128",
+         "\u212a"-"\u212d",
+         "\u212f"-"\u2131",
+         "\u2133"-"\u2139",
+         "\u2160"-"\u2183",
+         "\u3005"-"\u3007",
+         "\u3021"-"\u3029",
+         "\u3031"-"\u3035",
+         "\u3038"-"\u303a",
+         "\u3041"-"\u3094",
+         "\u309d"-"\u309e",
+         "\u30a1"-"\u30fe",
+         "\u3105"-"\u312c",
+         "\u3131"-"\u318e",
+         "\u31a0"-"\u31b7",
+         "\u3400"-"\u4db5",
+         "\u4e00"-"\u9fa5",
+         "\ua000"-"\ua48c",
+         "\uac00"-"\ud7a3",
+         "\uf900"-"\ufa2d",
+         "\ufb00"-"\ufb06",
+         "\ufb13"-"\ufb17",
+         "\ufb1d",
+         "\ufb1f"-"\ufb28",
+         "\ufb2a"-"\ufb36",
+         "\ufb38"-"\ufb3c",
+         "\ufb3e",
+         "\ufb40"-"\ufb41",
+         "\ufb43"-"\ufb44",
+         "\ufb46"-"\ufbb1",
+         "\ufbd3"-"\ufd3d",
+         "\ufd50"-"\ufd8f",
+         "\ufd92"-"\ufdc7",
+         "\ufdf0"-"\ufdfb",
+         "\ufe33"-"\ufe34",
+         "\ufe4d"-"\ufe4f",
+         "\ufe69",
+         "\ufe70"-"\ufe72",
+         "\ufe74",
+         "\ufe76"-"\ufefc",
+         "\uff04",
+         "\uff21"-"\uff3a",
+         "\uff3f",
+         "\uff41"-"\uff5a",
+         "\uff65"-"\uffbe",
+         "\uffc2"-"\uffc7",
+         "\uffca"-"\uffcf",
+         "\uffd2"-"\uffd7",
+         "\uffda"-"\uffdc",
+         "\uffe0"-"\uffe1",
+         "\uffe5"-"\uffe6"
+      ]
+  >
+|
+  < #DIGIT:
+      [
+       "\u0030"-"\u0039",
+       "\u0660"-"\u0669",
+       "\u06f0"-"\u06f9",
+       "\u0966"-"\u096f",
+       "\u09e6"-"\u09ef",
+       "\u0a66"-"\u0a6f",
+       "\u0ae6"-"\u0aef",
+       "\u0b66"-"\u0b6f",
+       "\u0be7"-"\u0bef",
+       "\u0c66"-"\u0c6f",
+       "\u0ce6"-"\u0cef",
+       "\u0d66"-"\u0d6f",
+       "\u0e50"-"\u0e59",
+       "\u0ed0"-"\u0ed9",
+       "\u1040"-"\u1049"
+      ]
+  >
+}
+
+/* SEPARATORS */
+
+TOKEN :
+{
+  < LPAREN: "(" >
+| < RPAREN: ")" >
+| < LBRACE: "{" >
+| < RBRACE: "}" >
+| < LBRACKET: "[" >
+| < RBRACKET: "]" >
+| < SEMICOLON: ";" >
+| < COMMA: "," >
+| < DOT: "." >
+| < AT: "@" >
+}
+
+/* OPERATORS */
+
+TOKEN :
+{
+  < ASSIGN: "=" >
+| < GT: ">" >
+| < LT: "<" >
+| < BANG: "!" >
+| < TILDE: "~" >
+| < HOOK: "?" >
+| < COLON: ":" >
+| < EQ: "==" >
+| < LE: "<=" >
+| < GE: ">=" >
+| < NE: "!=" >
+| < SC_OR: "||" >
+| < SC_AND: "&&" >
+| < INCR: "++" >
+| < DECR: "--" >
+| < PLUS: "+" >
+| < MINUS: "-" >
+| < STAR: "*" >
+| < SLASH: "/" >
+| < BIT_AND: "&" >
+| < BIT_OR: "|" >
+| < XOR: "^" >
+| < REM: "%" >
+| < LSHIFT: "<<" >
+
+// | < RSIGNEDSHIFT: ">>" > //Removed by REYNAUD Sebastien (LOGICA)
+
+// | < RUNSIGNEDSHIFT: ">>>" > //Removed by REYNAUD Sebastien (LOGICA)
+
+| < PLUSASSIGN: "+=" >
+| < MINUSASSIGN: "-=" >
+| < STARASSIGN: "*=" >
+| < SLASHASSIGN: "/=" >
+| < ANDASSIGN: "&=" >
+| < ORASSIGN: "|=" >
+| < XORASSIGN: "^=" >
+| < REMASSIGN: "%=" >
+| < LSHIFTASSIGN: "<<=" >
+| < RSIGNEDSHIFTASSIGN: ">>=" >
+| < RUNSIGNEDSHIFTASSIGN: ">>>=" >
+| < ELLIPSIS: "..." >
+}
+
+
+/*****************************************
+ * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
+ *****************************************/
+
+/*
+ * Program structuring syntax follows.
+ */
+
+void CompilationUnit() :
+{
+    int oldNcss = 0;
+
+    // added by SMS
+    int oldFormal = 0;
+    int oldSingle = 0;
+    int oldMulti  = 0;
+
+    JavaParserDebugTokenManager._iSingleComments = 0;
+    JavaParserDebugTokenManager._iMultiComments = 0;
+    JavaParserDebugTokenManager._iFormalComments = 0;
+
+    JavaParserDebugTokenManager._iMultiCommentsLast = 0;
+
+    _bPrivate = true;//false;
+}
+{
+        {
+                _sPackage = "";
+                _pPackageMetric = new PackageMetric();      // this object manages the metrics
+        }
+  [ LOOKAHEAD( ( Annotation() )* "package" ) PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( TypeDeclaration()
+    //{ System.out.println( "Token: " + getToken( 0 ) ); }
+    )*
+         {
+             // Package classes and functions are set inside
+             // class and interface bodies.
+             _pPackageMetric.ncss = _ncss;
+
+             // added by SMS
+             _pPackageMetric.javadocsLn = JavaParserDebugTokenManager._iFormalComments;
+             _pPackageMetric.singleLn   = JavaParserDebugTokenManager._iSingleComments;
+             _pPackageMetric.multiLn    = JavaParserDebugTokenManager._iMultiComments;
+             //
+
+             _htPackage.put(_formatPackage(_sPackage),
+                            _pPackageMetric);
+         }
+  (
+  {
+      oldNcss = _ncss;
+      _sPackage = "";
+      _pPackageMetric = new PackageMetric();
+
+      // added by SMS
+      oldFormal = JavaParserDebugTokenManager._iFormalComments;
+      oldSingle = JavaParserDebugTokenManager._iSingleComments;
+      oldMulti  = JavaParserDebugTokenManager._iMultiComments;
+  }
+  (PackageDeclaration()
+   |
+   ( ImportDeclaration() )
+   )
+  ( ImportDeclaration() )*
+  ( TypeDeclaration() )+
+  {
+      // Package classes and functions are set inside
+      // class and interface bodies.
+      _pPackageMetric.ncss = _ncss - oldNcss;
+
+      // added by SMS
+      _pPackageMetric.javadocsLn = JavaParserDebugTokenManager._iFormalComments - oldFormal;
+      _pPackageMetric.singleLn   = JavaParserDebugTokenManager._iSingleComments - oldSingle;
+      _pPackageMetric.multiLn    = JavaParserDebugTokenManager._iMultiComments  - oldMulti;
+      //
+
+      PackageMetric pckmPrevious = (PackageMetric)_htPackage.
+             get(_formatPackage(_sPackage));
+      _pPackageMetric.add(pckmPrevious);
+      _htPackage.put(_formatPackage(_sPackage),
+                     _pPackageMetric);
+  }
+  )*
+  <EOF>
+         {
+             Token pToken = getToken(1);
+             _loc = pToken.endLine;
+         }
+}
+
+void ImportUnit() :
+{
+}
+{
+  [ PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )*
+  ( "class" | "interface" )
+}
+
+void PackageDeclaration() :
+{
+    int beginLine = 1;
+    int beginColumn = 1;
+}
+{
+    (Annotation())*
+  "package"
+  {
+      _anonClassCount = 1;
+
+      Token pToken = getToken( 0 );
+      beginLine = pToken.beginLine ;
+      beginColumn = pToken.beginColumn;
+      _aoPackage = new Object[ 5 ];
+  }
+  Name()
+  {
+      _aoPackage[ 0 ] = _sName;
+      _aoPackage[ 1 ] = new Integer( beginLine );
+      _aoPackage[ 2 ] = new Integer( beginColumn );
+  }
+  ";"
+  {
+      _aoPackage[ 3 ] = new Integer( getToken( 0 ).endLine );
+      _aoPackage[ 4 ] = new Integer( getToken( 0 ).endColumn );
+      _ncss++;
+      Util.debug( "_ncss++" );
+      _sPackage = _sName + ".";
+  }
+}
+
+void ImportDeclaration() :
+{
+    int beginLine = 1;
+    int beginColumn = 1;
+    Object[] aoImport = null;
+}
+{
+  "import"
+  {
+      Token pToken = getToken( 0 );
+      beginLine = pToken.beginLine ;
+      beginColumn = pToken.beginColumn;
+  }
+[ "static" ]
+  Name()
+  {
+      aoImport = new Object[ 5 ];
+      aoImport[ 0 ] = _sName;
+      aoImport[ 1 ] = new Integer( beginLine );
+      aoImport[ 2 ] = new Integer( beginColumn );
+  }
+  [ "." "*" { aoImport[ 0 ] = aoImport[ 0 ].toString() + ".*"; } ] ";"
+  {
+      aoImport[ 3 ] = new Integer( getToken( 0 ).endLine );
+      aoImport[ 4 ] = new Integer( getToken( 0 ).endColumn );
+      _vImports.add( aoImport );
+      _ncss++;
+      Util.debug( "_ncss++" );
+  }
+}
+
+void TypeDeclaration() :
+{
+   int modifiers;
+}
+{
+  LOOKAHEAD( (Annotation())* ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )* "class" )
+
+	//(Annotation())*	//Removed by REYNAUD Sebastien (LOGICA)
+
+  ClassDeclaration()
+|
+  LOOKAHEAD( modifiers = Modifiers()
+                 "enum" <IDENTIFIER>
+             //EnumDeclaration(modifiers)
+             )
+  modifiers = Modifiers()
+  EnumDeclaration(modifiers)
+|
+         LOOKAHEAD( Modifiers() "interface" )
+
+	//(Annotation())*	//Removed by REYNAUD Sebastien (LOGICA)
+
+  InterfaceDeclaration()
+   |
+  modifiers = Modifiers()
+     AnnotationTypeDeclaration(modifiers)
+|
+  ";"
+}
+
+
+/*
+ * Declaration syntax follows.
+ */
+
+void ClassDeclaration() :
+{
+    Token tmpToken = null;
+    _javadocs = 0;
+    ObjectMetric metric = null;
+
+    // added by SMS
+    int oldSingle = 0;
+    int oldMulti  = 0;
+
+    _jvdcLines    = 0;
+    boolean bTemp = _bPublic;
+    _bPublic      = false;
+    //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	//
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+	//
+
+  ( "abstract"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "final"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "public"
+  {
+      _bPublic = true;         // added by SMS
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "synchronized"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "strictfp"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ )*
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 1 );
+      }
+  }
+
+  // added by SMS
+  {
+      while( tmpToken.specialToken != null ) {
+          if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+              _javadocs++;
+              Util.debug( "ClassDeclaration()._javadocs++" );
+              if (_bPublic || _bPrivate) {
+                  Util.debug( "_jvdc++" );
+                  _jvdc++;
+                  _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
+                  JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
+              }
+              JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
+              break;
+          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+              break;
+          }
+
+          //System.out.println("\n"+tmpToken.specialToken.image);
+
+          tmpToken = tmpToken.specialToken;
+      }
+
+      oldSingle = JavaParserDebugTokenManager._iSingleComments;
+      oldMulti = JavaParserDebugTokenManager._iMultiComments;
+  }
+
+  UnmodifiedClassDeclaration()
+         {
+             /* removed by SMS
+             while( tmpToken.specialToken != null ) {
+                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                     _javadocs++;
+                 }
+                 tmpToken = tmpToken.specialToken;
+             }
+             */
+             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1);
+             metric.javadocs = _javadocs;
+
+             // added by SMS
+             metric.javadocsLn = _jvdcLines;
+             metric.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
+             metric.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
+             //
+
+            // added by SMS
+            _bPublic = bTemp;
+         }
+}
+
+void UnmodifiedClassDeclaration() :
+{
+        String sOldClass = _sClass;
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        int oldClasses = _classes;
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		int oldJavadocs = _javadocs;
+		//
+}
+{
+        {
+                if (!_sClass.equals("")) {
+                        _sClass += ".";
+                }
+                _sClass += getToken(2).image;
+                _classLevel ++;
+        }
+        Modifiers()
+  "class" Identifier() [TypeParameters()] [ "extends" Name() [TypeArguments()] /*Added by REYNAUD Sebastien (LOGICA)*/ ("." Name() [TypeArguments()] )* /**/ ] [ "implements" NameList() ]
+  ClassBody()
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _classLevel--;
+                if (_classLevel == 0) {
+                        //_topLevelClasses++;
+                        ObjectMetric metric = new ObjectMetric();
+                        metric.name = _sPackage + _sClass;
+                        metric.ncss = _ncss - oldNcss;
+                        metric.functions = _functions - oldFunctions;
+                        metric.classes = _classes - oldClasses;
+                        Token lastToken = getToken( 0 );
+                        //metric.add( new Integer( lastToken.endLine ) );
+                        //metric.add( new Integer( lastToken.endColumn ) );
+                        //metric.add( new Integer( _javadocs ) );
+                        _vClasses.add( metric );
+                        _pPackageMetric.functions += _functions - oldFunctions;
+                        _pPackageMetric.classes++;
+
+                        // added by SMS
+                        _pPackageMetric.javadocs += _javadocs;
+                        //_pPackageMetric.javadocsLn += JavaParserDebugTokenManager._iFormalComments - oldFormal;
+                        //_pPackageMetric.singleLn += JavaParserDebugTokenManager._iSingleComments - oldSingle;
+                        //_pPackageMetric.multiLn += JavaParserDebugTokenManager._iMultiComments - oldMulti;
+                        //
+                }
+			//Added by REYNAUD Sebastien (LOGICA)
+			else
+			{
+			ObjectMetric metric1 = new ObjectMetric();
+                  metric1.name = _sPackage + _sClass ;
+			metric1.ncss = _ncss - oldNcss;
+                  metric1.functions = _functions - oldFunctions;
+                  metric1.classes = _classes - oldClasses;
+                  Token lastToken = getToken( 0 );
+                  _vClasses.add( metric1 );
+                  _pPackageMetric.functions += _functions - oldFunctions;
+                  _pPackageMetric.classes++;
+			metric1.javadocs = _javadocs - oldJavadocs;
+			}
+			//
+
+                _functions = oldFunctions;
+                _classes = oldClasses + 1;
+                _sClass = sOldClass;
+        }
+}
+
+void ClassBody() :
+{}
+{
+  "{" ( ClassBodyDeclaration() )* "}"
+}
+
+void NestedClassDeclaration() :
+
+{
+    // added by SMS
+    Token tmpToken = null;
+
+    boolean bTemp = _bPublic;
+    _bPublic = false;
+    boolean bPublic = false;
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	//
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+
+	{
+	if(tmpToken==null)
+	{
+		tmpToken = getToken( 1 );
+	}
+	}
+	//
+
+  ( "static" | "abstract" | "final"
+  | "public" { bPublic = true; }        // added by SMS
+  | "protected" { bPublic = true; }     // added by SMS
+  | "private" | "strictfp" )*
+
+
+  // added by SMS
+  {
+
+			//tmpToken = getToken( 0 );//Removed by REYNAUD Sebastien (LOGICA)
+
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        Util.debug( "NestedClassDeclaration()._javadocs++" );
+                        if ((_bPublic && bPublic) || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
+                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+    }
+
+  UnmodifiedClassDeclaration()
+  {
+       //added by SMS
+      _bPublic = bTemp;
+  }
+}
+
+void ClassBodyDeclaration() :
+{
+    int modifiers;
+}
+{
+  EmptyStatement()
+|
+  LOOKAHEAD(2)
+  Initializer()
+
+//Added by REYNAUD Sebastien (LOGICA)
+|
+  LOOKAHEAD((Annotation())* ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )*  "@" "interface")
+  modifiers = Modifiers()
+  AnnotationTypeDeclaration(modifiers)
+|
+  LOOKAHEAD((Annotation())* "@" "interface")
+  CreationAnnotation()
+//
+
+|
+  LOOKAHEAD( (Annotation())* ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "class" )
+
+	//(Annotation())*	//Removed by REYNAUD Sebastien (LOGICA)
+
+  NestedClassDeclaration()
+|
+  LOOKAHEAD( Modifiers() "interface" )
+  //LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface" )
+  modifiers = Modifiers()
+  NestedInterfaceDeclaration()
+  |
+   LOOKAHEAD( Modifiers() "enum" )
+   modifiers = Modifiers()
+   EnumDeclaration(modifiers)
+|
+         //LOOKAHEAD( [ TypeParameters() ] <IDENTIFIER> "(" )
+         LOOKAHEAD( (Annotation())* [ "public" | "protected" | "private" ] [ TypeParameters() ] Name() "(" )
+         //{ System.out.println( "\n\nClassDeclaration\n" ); }
+
+	//(Annotation())* //Removed by REYNAUD Sebastien (LOGICA)
+
+  ConstructorDeclaration()
+|
+  LOOKAHEAD( MethodDeclarationLookahead() )
+         //{ System.out.println( "\n\nMethodDeclaration\n" ); }
+  MethodDeclaration()
+|
+  (Annotation())* FieldDeclaration()
+}
+
+// This production is to determine lookahead only.
+void MethodDeclarationLookahead() :
+{}
+{
+    ( Annotation() )*
+    ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" | "strictfp" )*
+    ( Annotation() )*
+  [ TypeParameters() ]
+  ResultType() Identifier() "("
+}
+
+void InterfaceDeclaration() :
+{
+        Token tmpToken = null;
+        _javadocs = 0;
+        //boolean bClassComment = false;
+        ObjectMetric metric = null;
+
+        // added by SMS
+        int oldSingle;
+        int oldMulti;
+
+        _jvdcLines = 0;
+        boolean bTemp = _bPublic;
+        _bPublic = false;
+        //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken=null;
+	//
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+	//
+
+  ( "strictfp" | "abstract"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "public"
+  {
+      _bPublic = true;         // added by SMS
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ )*
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 1 );
+      }
+  }
+
+
+  // added by SMS
+  // added by SMS
+  {
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        Util.debug( "InterfaceDeclaration()._javadocs++" );
+                        if (_bPublic || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
+                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+
+                oldSingle = JavaParserDebugTokenManager._iSingleComments;
+                oldMulti = JavaParserDebugTokenManager._iMultiComments;
+    }
+
+  UnmodifiedInterfaceDeclaration()
+         {
+             /* removed by SMS
+             while( tmpToken.specialToken != null ) {
+                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                     _javadocs++;
+                     bClassComment = true;
+                 }
+                 tmpToken = tmpToken.specialToken;
+                 }*/
+             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1 );
+             metric.javadocs = _javadocs;
+
+             // added by SMS
+             metric.javadocsLn = _jvdcLines;
+             metric.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
+             metric.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
+             //
+
+            // added by SMS
+            _bPublic = bTemp;
+         }
+}
+
+void NestedInterfaceDeclaration() :
+
+{
+    // added by SMS
+    Token tmpToken = null;
+
+    boolean bTemp = _bPublic;
+    _bPublic = false;
+    boolean bPublic = false;
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken=null;
+	//
+
+}
+{
+	//Added by REYNAUD Sebastien (LOGICA)
+	(
+	{myToken = getToken(1);}
+	Annotation()
+	{tmpToken = myToken;}
+	)?
+
+	(Annotation())*
+	{
+	if(tmpToken==null)
+	{
+		tmpToken = getToken( 1 );
+	}
+	}
+	//
+
+
+  ( "static" | "abstract" | "final"
+  | "public" { bPublic = true; }        // added by SMS
+  | "protected" { bPublic = true; }     // added by SMS
+  | "private" | "strictfp" )*
+
+  // added by SMS
+  {
+
+			//tmpToken = getToken( 0 );	//Removed by REYNAUD Sebastien (LOGICA)
+
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        if ((_bPublic && bPublic) || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
+                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+
+    }
+
+  UnmodifiedInterfaceDeclaration()
+
+  {
+      // added by SMS
+      _bPublic = bTemp;
+  }
+}
+
+void UnmodifiedInterfaceDeclaration() :
+{
+        String sOldClass = _sClass;
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        int oldClasses = _classes;
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		int oldJavadocs = _javadocs;
+		//
+}
+{
+        {
+                if (!_sClass.equals("")) {
+                        _sClass += ".";
+                }
+                _sClass += getToken(2).image;
+                _classLevel ++;
+        }
+  "interface" Identifier() [TypeParameters()] [ "extends" NameList() ]
+  "{" ( InterfaceMemberDeclaration() )* "}"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _classLevel--;
+                if (_classLevel == 0)
+                {
+                        //_topLevelClasses++;
+                        ObjectMetric metric = new ObjectMetric();
+                        metric.name = _sPackage + _sClass;
+                        metric.ncss = _ncss - oldNcss;
+                        metric.functions = _functions - oldFunctions;
+                        metric.classes = _classes - oldClasses;
+                        //metric.add( Util.getConstantObject() );
+                        //metric.add( Util.getConstantObject() );
+                        _vClasses.add( metric );
+                        _pPackageMetric.functions += _functions - oldFunctions;
+                        _pPackageMetric.classes++;
+
+                        // added by SMS
+                        _pPackageMetric.javadocs += _javadocs;
+                        //_pPackageMetric.javadocsLn += JavaParserDebugTokenManager._iFormalComments - oldFormal;
+                        //_pPackageMetric.singleLn += JavaParserDebugTokenManager._iSingleComments - oldSingle;
+                        //_pPackageMetric.multiLn += JavaParserDebugTokenManager._iMultiComments - oldMulti;
+                        //
+                }
+			//Added by REYNAUD Sebastien (LOGICA)
+			else
+			{
+			ObjectMetric metric1 = new ObjectMetric();
+                  metric1.name = _sPackage + _sClass;
+			metric1.ncss = _ncss - oldNcss;
+                  metric1.functions = _functions - oldFunctions;
+                  metric1.classes = _classes - oldClasses;
+                  Token lastToken = getToken( 0 );
+                  _vClasses.add( metric1 );
+                  _pPackageMetric.functions += _functions - oldFunctions;
+                  _pPackageMetric.classes++;
+			//_pPackageMetric.javadocs += _javadocs;
+			metric1.javadocs = _javadocs - oldJavadocs;
+			}
+			//
+
+                _functions = oldFunctions;
+                _classes = oldClasses + 1;
+                _sClass = sOldClass;
+        }
+}
+
+void InterfaceMemberDeclaration() :
+{
+   int modifiers;
+}
+{
+  EmptyStatement()
+|
+  LOOKAHEAD( /* Added by REYNAUD Sebastien (LOGICA) */ (Annotation())* /**/ ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "class" )
+  NestedClassDeclaration()
+|
+  LOOKAHEAD( /* Added by REYNAUD Sebastien (LOGICA) */ (Annotation())* /**/ ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface" )
+  NestedInterfaceDeclaration()
+  |
+  LOOKAHEAD( modifiers = Modifiers()
+                 "enum" <IDENTIFIER>
+             //EnumDeclaration(modifiers)
+             )
+   modifiers = Modifiers()
+   EnumDeclaration(modifiers)
+|
+  LOOKAHEAD( MethodDeclarationLookahead() )
+  MethodDeclaration()
+|
+  modifiers = Modifiers()
+  FieldDeclaration()
+}
+
+void FieldDeclaration() :
+{
+    // added by SMS
+    Token tmpToken = null;
+    boolean bPublic = false;
+}
+{
+  ( "public" { bPublic = true; }        // added by SMS
+  | "protected" { bPublic = true; }     // added by SMS
+  | "private" | "static" | "final" | "transient" | "volatile" )*
+
+  // added by SMS
+  {             tmpToken = getToken( 0 );
+
+                while( tmpToken.specialToken != null )
+                {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) )
+                    {
+                        if ((bPublic && _bPublic) || _bPrivate)
+                        {
+                            //_javadocs++;
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
+                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
+                        }
+                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
+                        break;
+                    }
+                    else if ( tmpToken.specialToken.image.startsWith( "/*" ) )
+                    {
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+  }
+  (Annotation())* Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"
+  { _ncss++; Util.debug( "_ncss++" ); }
+}
+
+void VariableDeclarator() :
+{}
+{
+  VariableDeclaratorId() [ "=" VariableInitializer() ]
+}
+
+void VariableDeclaratorId() :
+{}
+{
+        ("enum"|Identifier()) ( "[" "]" { _sName += "[]"; })*
+}
+
+void VariableInitializer() :
+{}
+{
+  ArrayInitializer()
+|
+  Expression()
+}
+
+void ArrayInitializer() :
+{}
+{
+  "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}"
+}
+
+void MethodDeclaration() :
+{
+    int oldNcss = _ncss;
+    int oldFunctions = _functions;
+    String sOldFunction = _sFunction;
+    int oldcyc = _cyc;
+    boolean bOldReturn = _bReturn;
+    Token tmpToken = null;
+    int jvdc = 0;
+
+    // added by SMS
+    int jvdcLines = 0;
+    int oldSingle;
+    int oldMulti;
+    boolean bPublic = false;
+    //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	_tmpToken=null;
+	//
+}
+{
+    {
+    if ( _tmpToken != null )
+    {
+        tmpToken = _tmpToken;
+    }
+    }
+    (
+	//Added by REYNAUD Sebastien (LOGICA)
+	{myToken = getToken(1);}
+	//
+     Annotation()
+  {
+      if ( tmpToken == null ) {
+
+          //tmpToken = getToken( 0 ); //Removed by REYNAUD Sebastien (LOGICA)
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		tmpToken = myToken;
+		//
+      }
+  }
+     )*
+
+    // we want to count javadoc comments, so we need first token
+  ( "public" { bPublic = true; }        // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+    | "protected" { bPublic = true; }        // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+    | "private"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "static"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "abstract"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "final"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "native"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "synchronized"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+| "strictfp"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+  )*
+
+    ( Annotation() )*
+
+         /*{
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+      }*/
+
+
+  [ TypeParameters() ]
+
+           {
+               _tmpResultToken = null;
+           }
+  ResultType()
+        {
+            if ( tmpToken == null )
+            {
+                tmpToken = _tmpResultToken;
+                if ( tmpToken == null )
+                {
+                    tmpToken = getToken( 0 );
+                }
+                Util.debug( "result type tmpToken: " + tmpToken );
+            }
+        }
+  MethodDeclarator() [ "throws" NameList() ]
+        {
+                _cyc = 1;
+                _bReturn = false;
+        }
+  ( Block() | ";" )
+         // note: the second ";" is just for a bug in java/sql/Connection.java
+         // at line 182 column 38 as of sun jdk 1.1.5. The same
+         // applies to java/text/DecimalFormat.java at line 629
+         // column 6.
+         //[ ";" ]
+         {
+  // added by SMS
+  {
+      Util.debug( "Token: " + String.valueOf( tmpToken.image ) );
+      while( tmpToken.specialToken != null )
+      {
+          Util.debug( "Token comment: " + String.valueOf( tmpToken.specialToken.image ) );
+          if ( tmpToken.specialToken.image.startsWith( "/**" ) )
+          {
+              _javadocs++;
+              Util.debug( "MethodDeclaration()._javadocs++" );
+              jvdc++;
+              if ((bPublic && _bPublic) || _bPrivate) {
+                  Util.debug( "_jvdc++" );
+                  _jvdc++;
+                  jvdcLines = JavaParserDebugTokenManager._iMultiCommentsLast;
+                  _jvdcLines += jvdcLines;
+                  JavaParserDebugTokenManager._iFormalComments += jvdcLines;
+              }
+              JavaParserDebugTokenManager._iMultiComments -= jvdcLines;
+              break;
+          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+              jvdcLines = 0;
+              break;
+          }
+
+          //System.out.println("\n"+tmpToken.specialToken.image);
+
+          tmpToken = tmpToken.specialToken;
+      }
+
+      oldSingle = JavaParserDebugTokenManager._iSingleComments;
+      oldMulti = JavaParserDebugTokenManager._iMultiComments;
+  }
+
+
+             // removed by ccl
+             /*
+             while( tmpToken.specialToken != null ) {
+                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                     jvdc++;
+                     _javadocs++;
+                 }
+                 tmpToken = tmpToken.specialToken;
+             }
+             */
+             // removed by SMS
+             /*
+               while( tmpToken.specialToken != null ) {
+               if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+               jvdc++;
+               _javadocs++;
+               _bJavadoc = true;
+               }
+
+               tmpToken = tmpToken.specialToken;
+               }
+             */
+
+             if (_bReturn)
+             {
+                 _cyc--;
+             }
+             _ncss++;
+             Util.debug( "MethodDeclaration()._ncss++" );
+
+             FunctionMetric functionMetrics = new FunctionMetric();
+             functionMetrics.name = _sPackage + _sClass + _sFunction;
+             functionMetrics.ncss = _ncss - oldNcss;
+             functionMetrics.ccn = _cyc;
+             functionMetrics.javadocs = jvdc;
+
+             // added by SMS
+             functionMetrics.javadocsLn = 0; //jvdcLines;
+             functionMetrics.singleLn = 0; //JavaParserDebugTokenManager._iSingleComments - oldSingle;
+             functionMetrics.multiLn = 0; //JavaParserDebugTokenManager._iMultiComments - oldMulti;
+             //
+
+             _vFunctions.add(functionMetrics);
+             _sFunction = sOldFunction;
+             _functions = oldFunctions + 1;
+             _cyc = oldcyc;
+             _bReturn = bOldReturn;
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		_tmpToken = null;
+		//
+         }
+}
+
+void MethodDeclarator() :
+{}
+{
+        {
+                _sFunction = "." + getToken(1).image;
+        }
+  Identifier() FormalParameters()
+        {
+                _sFunction += _sParameter;
+        }
+  ( "[" "]" { _sFunction += "[]"; } )*
+}
+
+void FormalParameters() :
+{}
+{
+        {
+                _sParameter = "(";
+        }
+  "(" [ FormalParameter() { _sParameter += _sName; }
+  ( "," FormalParameter() { _sParameter += "," + _sName; } )* ] ")"
+        {
+                _sParameter += ")";
+        }
+}
+
+void FormalParameter() :
+{}
+{
+    //[ "final" ]
+           Modifiers()
+    Type() [ "..." ] VariableDeclaratorId()
+}
+
+void ConstructorDeclaration() :
+{
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        String sOldFunction = _sFunction;
+        int oldcyc = _cyc;
+        boolean bOldReturn = _bReturn;
+        Token tmpToken = null;
+        int jvdc = 0;
+
+        // added by SMS
+        int oldSingle;
+        int oldMulti;
+        int jvdcLines = 0;
+        boolean bPublic = false;
+        //
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	Token myToken = null;
+	//
+
+}
+{
+
+//Added by REYNAUD Sebastien (LOGICA)
+	(
+
+	{myToken = getToken(1);}
+
+     	Annotation()
+  	{
+      	if ( tmpToken == null )
+		{
+			tmpToken = myToken;
+      	}
+  	}
+  	)*
+//
+
+  [ "public" { bPublic = true; }        // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "protected" { bPublic = true; }      // added by SMS
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ | "private"
+  {
+      if ( tmpToken == null ) {
+          tmpToken = getToken( 0 );
+      }
+  }
+ ]
+  [ TypeParameters() ]
+  Identifier()
+        {
+            if ( tmpToken == null ) {
+                tmpToken = getToken( 0 );
+            }
+                _cyc = 1;
+                _sFunction = _sPackage + _sClass + "." + getToken(0).image;
+        }
+  FormalParameters()
+        {
+                _sFunction += _sParameter;
+                _bReturn = false;
+        }
+  [ "throws" NameList() ]
+         //{ System.out.println( "\n\nInside ContructorDeclaration\n" ); }
+  "{"
+         //{ System.out.println( "\n\nContructorDeclaration\n" ); }
+//  [ LOOKAHEAD(ExplicitConstructorInvocation()) ExplicitConstructorInvocation() ]
+//  [ LOOKAHEAD(("this" "(") | ([PrimaryExpression() "."]"super" "(")) ExplicitConstructorInvocation() ]
+    [ LOOKAHEAD("this" "(") ExplicitConstructorInvocation() ]
+    [ LOOKAHEAD([PrimaryExpression() "."]"super" "(") ExplicitConstructorInvocation() ]
+//         [ LOOKAHEAD(2) ExplicitConstructorInvocation() ]
+//         { System.out.println( "\n\nBefore BlockStatement\n" ); }
+
+
+         // added by SMS
+  {
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        _javadocs++;
+                        jvdc++;
+                        if ((bPublic && _bPublic) || _bPrivate) {
+                            Util.debug( "_jvdc++" );
+                            _jvdc++;
+                            jvdcLines = JavaParserDebugTokenManager._iMultiCommentsLast;
+                            _jvdcLines += jvdcLines;
+                            JavaParserDebugTokenManager._iFormalComments += jvdcLines;
+                        }
+                        JavaParserDebugTokenManager._iMultiComments -= jvdcLines;
+                        break;
+                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
+                        jvdcLines = 0;
+                        break;
+                    }
+
+                    //System.out.println("\n"+tmpToken.specialToken.image);
+
+                    tmpToken = tmpToken.specialToken;
+                }
+
+
+                oldSingle = JavaParserDebugTokenManager._iSingleComments;
+                oldMulti = JavaParserDebugTokenManager._iMultiComments;
+                }
+
+    ( BlockStatement() )*
+         //{ System.out.println( "\n\nAfter BlockStatement\n" ); }
+  "}"
+                        // this is just because of a nonconformance to the JLS
+                        // in java/net/Socket.java at line 148 column 6 as of
+                        // sun jdk 1.1.5
+                        //[ ";" ]
+        {
+
+            /*
+                while( tmpToken.specialToken != null ) {
+                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
+                        jvdc++;
+                        _javadocs++;
+                    }
+                    tmpToken = tmpToken.specialToken;
+                }
+            */
+                if (_bReturn) {
+                        _cyc--;
+                }
+                _ncss++;
+                Util.debug( "_ncss++" );
+
+                FunctionMetric functionMetrics = new FunctionMetric();
+                functionMetrics.name = _sFunction;
+                functionMetrics.ncss = _ncss - oldNcss;
+                functionMetrics.ccn = _cyc;
+                functionMetrics.javadocs = jvdc;
+
+                // added by SMS
+                functionMetrics.javadocsLn = jvdcLines;
+                functionMetrics.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
+                functionMetrics.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
+                //
+
+                _vFunctions.add(functionMetrics);
+                _sFunction = sOldFunction;
+                _functions = oldFunctions + 1;
+                _cyc = oldcyc;
+                _bReturn = bOldReturn;
+
+		//Added by REYNAUD Sebastien (LOGICA)
+		_tmpToken = null;
+		//
+        }
+}
+
+void ExplicitConstructorInvocation() :
+{
+  //System.out.println( "\n\nBefore ExplicitConstructorInvocation 1" );
+}
+{
+  //LOOKAHEAD("this" Arguments() ";")
+  LOOKAHEAD("this" "(" )
+  "this" Arguments() ";"
+         { _ncss++;       Util.debug( "_ncss++" );}
+|
+  [ LOOKAHEAD(PrimaryExpression() ".") PrimaryExpression()
+  //{ System.out.println( "ExplicitConstructorInvocation before ." ); }
+"." ]
+  //{ System.out.println( "ExplicitConstructorInvocation before super" ); }
+  "super" Arguments() ";"
+  { _ncss++;       Util.debug( "_ncss++" );
+//System.out.println( "\n\nAfter ExplicitConstructorInvocation\n" );
+  }
+}
+
+void Initializer() :
+{}
+{
+  [ "static" ] Block()
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+/*
+ * Type, name and expression syntax follows.
+ */
+
+void Type() :
+{}
+{
+   LOOKAHEAD(2) ReferenceType()
+ |
+   PrimitiveType()
+          {
+                  _sName = getToken(0).image;
+          }
+}
+/*
+ccl 2008-01-24
+{
+  ( PrimitiveType()
+          {
+                  _sName = getToken(0).image;
+          }
+    | Name()
+    [TypeArguments() ["." Identifier()] ]
+) ( "[" "]" { _sName += "[]"; } )*
+}
+*/
+
+/*
+ * Takes special consideration for assert.
+ */
+
+void FieldTypeLookahead() :
+{}
+{
+  ( PrimitiveType()
+    | FieldTypeNameLookahead()
+ ) ( "[" "]"  )*
+}
+
+void PrimitiveType() :
+{}
+{
+  "boolean"
+|
+  "char"
+|
+  "byte"
+|
+  "short"
+|
+  "int"
+|
+  "long"
+|
+  "float"
+|
+  "double"
+}
+
+void ResultType() :
+{}
+{
+  "void"
+|
+  Type()
+}
+
+void Name() :
+/*
+ * A lookahead of 2 is required below since "Name" can be followed
+ * by a ".*" when used in the context of an "ImportDeclaration".
+ */
+{}
+{
+    ("enum"|Identifier()) //<IDENTIFIER> // no Identifier() because of assert type for field declaration
+        {
+                _sName = getToken(0).image;
+                _tmpResultToken = getToken( 0 );
+                Util.debug( "Name._tmpResultToken: " + _tmpResultToken );
+        }
+    ( LOOKAHEAD(2) "." ("enum"|Identifier())
+        {
+                _sName += "." + getToken(0).image;
+        }
+  )*
+}
+
+/**
+ * Takes special consideration for assert.
+ */
+void FieldTypeNameLookahead() :
+/*
+ * A lookahead of 2 is required below since "Name" can be followed
+ * by a ".*" when used in the context of an "ImportDeclaration".
+ */
+{}
+{
+    <IDENTIFIER> // no Identifier() because of assert type for field declaration
+  ( LOOKAHEAD(2) "." Identifier()
+  )*
+}
+
+void NameList() :
+{}
+{
+    Name() [TypeArguments()]
+   ( "," Name() [TypeArguments()]
+  )*
+}
+
+/*
+ * Expression syntax follows.
+ */
+
+void Expression() :
+{
+    //System.out.println( "Expression start" );
+}
+{
+  LOOKAHEAD( PrimaryExpression() AssignmentOperator() )
+  //{ System.out.println( "Expression" ); }
+  Assignment()
+|
+  ConditionalExpression()
+}
+
+void Assignment() :
+{}
+{
+  PrimaryExpression() AssignmentOperator() Expression()
+}
+
+void AssignmentOperator() :
+{}
+{
+  "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|="
+}
+
+void ConditionalExpression() :
+{}
+{
+  ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() { _cyc++; } ]
+}
+
+void ConditionalOrExpression() :
+{}
+{
+  ConditionalAndExpression() ( "||" { _cyc++; } ConditionalAndExpression() )*
+}
+
+void ConditionalAndExpression() :
+{}
+{
+  InclusiveOrExpression() ( "&&" { _cyc++; } InclusiveOrExpression() )*
+}
+
+void InclusiveOrExpression() :
+{}
+{
+  ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )*
+}
+
+void ExclusiveOrExpression() :
+{}
+{
+  AndExpression() ( "^" AndExpression() )*
+}
+
+void AndExpression() :
+{}
+{
+  EqualityExpression() ( "&" EqualityExpression() )*
+}
+
+void EqualityExpression() :
+{}
+{
+  InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )*
+}
+
+void InstanceOfExpression() :
+{}
+{
+  RelationalExpression() [ "instanceof" Type() ]
+}
+
+void RelationalExpression() :
+{}
+{
+  ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )*
+}
+
+void ShiftExpression() :
+{}
+{
+
+//  AdditiveExpression() ( ( "<<" | ">>" | ">>>" ) AdditiveExpression() )* //Removed by REYNAUD Sebastien (LOGICA)
+
+//Added by REYNAUD Sebastien (LOGICA)
+  AdditiveExpression() ( LOOKAHEAD(3) ( "<<" | (">" ">") (">")? ) AdditiveExpression() )*
+//
+
+}
+
+void AdditiveExpression() :
+{}
+{
+  MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )*
+}
+
+void MultiplicativeExpression() :
+{}
+{
+  UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )*
+}
+
+void UnaryExpression() :
+{}
+{
+  ( "+" | "-" ) UnaryExpression()
+|
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  UnaryExpressionNotPlusMinus()
+}
+
+void PreIncrementExpression() :
+{}
+{
+  "++" PrimaryExpression()
+}
+
+void PreDecrementExpression() :
+{}
+{
+  "--" PrimaryExpression()
+}
+
+void UnaryExpressionNotPlusMinus() :
+{}
+{
+  ( "~" | "!" ) UnaryExpression()
+|
+         //  LOOKAHEAD( PostfixLookahead() )
+         //  PostfixExpression()
+         //|
+  LOOKAHEAD( CastLookahead() )
+  CastExpression()
+|
+  PostfixExpression()
+}
+
+// This production is to determine lookahead only.  The LOOKAHEAD specifications
+// below are not used, but they are there just to indicate that we know about
+// this.
+void CastLookahead() :
+{}
+{
+  LOOKAHEAD(2)
+  "(" PrimitiveType()
+|
+         //  LOOKAHEAD("(" Name() "[")
+         //  "(" Name() "[" "]"
+         //|
+         // LOOKAHEAD(3)
+         //  "(" Name() ")" ( "~" | "!" | "(" | Identifier() | "this" | "super" | "new" | Literal() )
+  LOOKAHEAD("(" Type() "[")
+  "(" Type() "[" "]"
+|
+  "(" Type() ")" ( "~" | "!" | "(" | Identifier() | "this" | "super" | "new" | Literal() )
+         //|
+         // LOOKAHEAD(3)
+         // "(" Type() ")"  UnaryExpressionNotPlusMinus()
+}
+
+// To fix bug Test48.java. Clemens [2000-10-03]
+void PostfixLookahead() :
+{}
+{
+  "(" Name() ( LOOKAHEAD(2) "[" "]" )* "."
+}
+
+void PostfixExpression() :
+{}
+{
+  PrimaryExpression() [ "++" | "--" ]
+}
+
+void CastExpression() :
+{}
+{
+  LOOKAHEAD("(" PrimitiveType())
+  "(" Type() ")" UnaryExpression()
+|
+  "(" Type() ")" UnaryExpressionNotPlusMinus()
+}
+
+void PrimaryExpression() :
+{
+//    { System.out.println( "Before PrimaryExpression" ); }
+}
+{
+  PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )*
+}
+
+void PrimaryPrefix() :
+{}
+{
+  Literal()
+|
+//    { System.out.println( "PrimaryPrefix: this" ); }
+  "this" 
+
+   //Added by REYNAUD Sebastien (LOGICA)
+   (".")? (Identifier())?
+   //
+
+         //|
+         //LOOKAHEAD( 2 )
+         //"super" "(" Expression() ")"
+         //{ System.out.println( "\n\nAfter PrimaryPrefix super(Expression)\n" ); }
+|
+  LOOKAHEAD(2)
+//  { System.out.println( "Before PrimaryPrefix super." ); }
+
+  //"super" "." Identifier() //removed by REYNAUD Sebastien (LOGICA)
+
+
+//Added by REYNAUD Sebastien (LOGICA)
+"super" (".")? (Identifier())?
+//
+
+|
+         //{ System.out.println( "\n\nBefore PrimaryPrefix (Expression)\n" ); }
+  "(" Expression() ")"
+|
+  AllocationExpression()
+//  { System.out.println( "PrimaryPrefix After AllocationExpression" ); }
+|
+  LOOKAHEAD( ResultType() "." "class" )
+//  { System.out.println( "PrimaryPrefix ResultType" ); }
+  ResultType() "." "class"
+|
+         Name() [ LOOKAHEAD(3) "." "super" "." Identifier() ]
+
+         /* The [ "." "super" "." Identifier() ]
+            has been added to fix a bug reported by
+            Chris Williamson. It might cause other problems,
+            maybe. 2002-05-11 */
+//  { System.out.println( "PrimaryPrefix after Name" ); }
+}
+
+void PrimarySuffix() :
+{}
+{
+  LOOKAHEAD(2)
+  "." "this"
+|
+  LOOKAHEAD(2)
+  "." AllocationExpression()
+|
+  LOOKAHEAD(3)
+  MemberSelector()
+|
+  "[" Expression() "]"
+|
+//  { System.out.println( "PrimarySuffix . Identifier()" ); }
+  "." Identifier()
+|
+  Arguments()
+}
+
+void Literal() :
+{
+}
+{
+  <INTEGER_LITERAL>
+|
+  <FLOATING_POINT_LITERAL>
+|
+  <CHARACTER_LITERAL>
+|
+  <STRING_LITERAL>
+|
+  BooleanLiteral()
+|
+  NullLiteral()
+}
+
+void BooleanLiteral() :
+{}
+{
+  "true"
+|
+  "false"
+}
+
+void NullLiteral() :
+{}
+{
+  "null"
+}
+
+void Arguments() :
+{
+// System.out.println( "Arguments start" );
+}
+{
+  "(" [ ArgumentList() ] ")"
+}
+
+void ArgumentList() :
+{
+// System.out.println( "ArgumentList start" );
+}
+{
+  Expression() ( "," Expression() )*
+}
+
+void AllocationExpression() :
+{
+        String sOldClass = _sClass;
+        //int oldNcss = _ncss;
+        int oldFunctions = _functions;
+        int oldClasses = _classes;
+        String sName;
+
+	//Added by REYNAUD Sebastien (LOGICA)
+	int oldJavadocs = _javadocs;
+	int oldNcss = _ncss;
+	//
+}
+{
+  LOOKAHEAD(2)
+  "new" PrimitiveType() ArrayDimsAndInits()
+|
+         "new" Name()
+                        // this is all for anonymous classes
+                        { sName = _sName; }
+  [TypeArguments()]
+      (
+      ArrayDimsAndInits()
+    |
+      Arguments()
+                [
+                 {
+                         if (!_sClass.equals("")) {
+                                 _sClass += ".";
+                         }
+                         /*_sClass += sName;*/
+                         //_sClass += sName + "$" + _anonClassCount ;//Removed by REYNAUD Sebastien (LOGICA)
+
+				//Added by REYNAUD Sebastien (LOGICA)
+				_sClass += sName;
+				//
+                         _classLevel ++;
+                 }
+                        ClassBody()
+                        {
+
+				//Added by REYNAUD Sebastien (LOGICA)
+				ObjectMetric metric = new ObjectMetric();
+				metric.name = _sPackage + _sClass;
+				metric.ncss = _ncss - oldNcss;
+		            metric.functions = _functions - oldFunctions;
+            	      metric.classes = _classes - oldClasses;
+                  	Token lastToken = getToken( 0 );
+                  	_vClasses.add( metric );
+                  	_pPackageMetric.functions += _functions - oldFunctions;
+                  	_pPackageMetric.classes++;
+				metric.javadocs = _javadocs - oldJavadocs;
+				//
+                                _classLevel--;
+                                _functions = oldFunctions;
+                                _classes = oldClasses + 1;
+                                _sClass = sOldClass;
+                        }
+                ]
+    )
+}
+
+/*
+ * The third LOOKAHEAD specification below is to parse to PrimarySuffix
+ * if there is an expression between the "[...]".
+ */
+void ArrayDimsAndInits() :
+{}
+{
+  LOOKAHEAD(2)
+  ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )*
+|
+  ( "[" "]" )+ ArrayInitializer()
+}
+
+
+/*
+ * Statement syntax follows.
+ */
+
+void Statement() :
+{
+        _bReturn = false;
+        //{ System.out.println( "\n\nBefore Statement\n" ); }
+}
+{
+  LOOKAHEAD(2)
+  LabeledStatement()
+|
+  LOOKAHEAD(AssertStatementLookahead())
+  AssertStatement()
+|
+  Block()
+|
+  EmptyStatement()
+|
+         //{ System.out.println( "\n\nBefore Statement Expression\n" ); }
+  StatementExpression() ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+  //{ System.out.println( "\n\nHit Statement Expression\n" ); }
+|
+  SwitchStatement()
+|
+  IfStatement()
+        { _cyc++; }
+|
+  WhileStatement()
+        { _cyc++; }
+|
+  DoStatement()
+        { _cyc++; }
+|
+  ForStatement()
+        { _cyc++; }
+|
+  BreakStatement()
+|
+  ContinueStatement()
+|
+  ReturnStatement()
+|
+  ThrowStatement()
+|
+  SynchronizedStatement()
+|
+  TryStatement()
+}
+
+void LabeledStatement() :
+{}
+{
+  Identifier() ":" Statement()
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void AssertStatementLookahead() :
+{
+
+}
+{
+  <ASSERT>
+  Expression()
+}
+
+void AssertStatement() :
+{
+}
+{
+  <ASSERT>
+  Expression()
+  [ ":" Expression() ]
+  ";"
+  { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void Block() :
+{}
+{
+  "{"
+         //{_ncss++; Util.debug( "Block()._ncss++" );
+         //}
+   ( BlockStatement() )* "}"
+}
+
+void BlockStatement() :
+{}
+{
+    //LOOKAHEAD([ "final" ] FieldTypeLookahead() Identifier())
+  LOOKAHEAD( Modifiers() Type() ("enum"|<IDENTIFIER>) (";"|"="|","|"[""]") )
+  LocalVariableDeclaration() ";"
+        {
+                _ncss++;       Util.debug( "_ncss++" );
+        }
+|
+  Statement()
+|
+  UnmodifiedClassDeclaration()
+|
+  UnmodifiedInterfaceDeclaration()
+}
+
+/*void LocalVariableDeclaration() :
+{}
+{
+  [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )*
+}*/
+void LocalVariableDeclaration():
+{}
+{
+  Modifiers() Type() VariableDeclarator() ( "," VariableDeclarator() )*
+}
+
+
+void EmptyStatement() :
+{}
+{
+  ";"
+}
+
+void StatementExpression() :
+/*
+ * The last expansion of this production accepts more than the legal
+ * Java expansions for StatementExpression.  This expansion does not
+ * use PostfixExpression for performance reasons.
+ */
+{
+    //{ System.out.println( "\n\nBefore StatementExpression\n" ); }
+}
+{
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  PrimaryExpression()
+  [
+    "++"
+  |
+    "--"
+  |
+    AssignmentOperator() Expression()
+  ]
+}
+
+void SwitchStatement() :
+{}
+{
+        {
+                _localCases = 0;
+        }
+  "switch" "(" Expression() ")" "{"
+    ( SwitchLabel() ( BlockStatement() )* )*
+  "}"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void SwitchLabel() :
+{}
+{
+  "case" Expression() ":"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _localCases++;
+                _cyc++;
+        }
+|
+  "default" ":"
+        {
+                _ncss++;       Util.debug( "_ncss++" );
+        }
+}
+
+void IfStatement() :
+/*
+ * The disambiguating algorithm of JavaCC automatically binds dangling
+ * else's to the innermost if statement.  The LOOKAHEAD specification
+ * is to tell JavaCC that we know what we are doing.
+ */
+{}
+{
+  "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" { _ncss++;       Util.debug( "_ncss++" );} Statement() ]
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void WhileStatement() :
+{}
+{
+  "while" "(" Expression() ")" Statement()
+        { _ncss++;       Util.debug( "_ncss++" ); }
+}
+
+void DoStatement() :
+{}
+{
+  "do" Statement() "while" "(" Expression() ")" ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ForStatement() :
+{}
+{
+  "for" "("
+  (
+      LOOKAHEAD(Modifiers() Type() <IDENTIFIER> ":")
+      Modifiers() Type() <IDENTIFIER> ":" Expression()
+    |
+ [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ]
+      )
+")" Statement()
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ForInit() :
+{}
+{
+  LOOKAHEAD( [ "final" ] Type() ("enum"|Identifier()) )
+  LocalVariableDeclaration()
+|
+  StatementExpressionList()
+}
+
+void StatementExpressionList() :
+{}
+{
+  StatementExpression() ( "," StatementExpression() )*
+}
+
+void ForUpdate() :
+{}
+{
+  StatementExpressionList()
+}
+
+void BreakStatement() :
+{}
+{
+  "break" [ Identifier() ] ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ContinueStatement() :
+{}
+{
+  "continue" [ Identifier() ] ";"
+        { _ncss++;       Util.debug( "_ncss++" );}
+}
+
+void ReturnStatement() :
+{}
+{
+  "return" [ Expression() ] ";"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _cyc++;
+                _bReturn = true;
+        }
+}
+
+void ThrowStatement() :
+{}
+{
+  "throw" Expression() ";"
+        {
+                _ncss++;
+                Util.debug( "_ncss++" );
+                _cyc++;
+        }
+}
+
+void SynchronizedStatement() :
+{}
+{
+  "synchronized" "(" Expression() ")" Block()
+        { _ncss++;       Util.debug( "_ncss++" ); }
+}
+
+void TryStatement() :
+/*
+ * Semantic check required here to make sure that at least one
+ * finally/catch is present.
+ */
+{}
+{
+  "try" Block()
+  ( "catch" "(" FormalParameter() ")" Block() { _ncss++;       Util.debug( "_ncss++" ); _cyc++; } )*
+  [ "finally" Block() { _ncss++;       Util.debug( "_ncss++" );} ]
+}
+
+void Identifier() :
+{}
+{
+    <IDENTIFIER>
+|
+    <ASSERT>
+}
+
+/* Annotation syntax follows. */
+
+void Annotation():
+{}
+{
+   LOOKAHEAD( "@" Name() "(" ( <IDENTIFIER> "=" | ")" ))
+   NormalAnnotation()
+ |
+   LOOKAHEAD( "@" Name() "(" )
+   SingleMemberAnnotation()
+ |
+   MarkerAnnotation()
+}
+
+void NormalAnnotation():
+{}
+{
+   "@" Name() "(" [ MemberValuePairs() ] ")"
+}
+
+void MarkerAnnotation():
+{}
+{
+  "@" Name()
+}
+
+void SingleMemberAnnotation():
+{}
+{
+  "@" Name() "(" MemberValue() ")"
+}
+
+void MemberValuePairs():
+{}
+{
+   MemberValuePair() ( "," MemberValuePair() )*
+}
+
+void MemberValuePair():
+{}
+{
+    <IDENTIFIER> "=" MemberValue()
+}
+
+void MemberValue():
+{}
+{
+   Annotation()
+ |
+   MemberValueArrayInitializer()
+ |
+   ConditionalExpression()
+}
+
+void  MemberValueArrayInitializer():
+{}
+{
+  "{" [MemberValue()] ( LOOKAHEAD(2) "," MemberValue() )* [ "," ] "}"
+}
+
+
+/*
+ =================================================
+ Java 1.5 stuff starts here
+ =================================================
+*/
+
+/* Annotation Types. */
+
+//Added by REYNAUD Sebastien (LOGICA)
+void CreationAnnotation():
+{}
+{
+   "@" "interface" <IDENTIFIER> "{" (AnnotationTypeMemberDeclaration())*"}"
+}
+//
+
+void AnnotationTypeDeclaration(int modifiers):
+{}
+{
+  "@" "interface" <IDENTIFIER> AnnotationTypeBody()
+}
+
+void AnnotationTypeBody():
+{}
+{
+  "{" {_ncss++;       Util.debug( "_ncss++" );} ( AnnotationTypeMemberDeclaration() )* "}"
+}
+
+void AnnotationTypeMemberDeclaration():
+{
+   int modifiers;
+}
+{
+ modifiers = Modifiers()
+ (
+   LOOKAHEAD(Type() <IDENTIFIER> "(")
+   Type() <IDENTIFIER> "(" ")" [ DefaultValue() ] ";"
+        {
+            _ncss++;
+            Util.debug( "_ncss++" );
+        }
+
+  |
+   ClassOrInterfaceDeclaration(modifiers)
+  |
+   EnumDeclaration(modifiers)
+  |
+   AnnotationTypeDeclaration(modifiers)
+  |
+   FieldDeclaration15(modifiers)
+ )
+ |
+        ( ";" )
+        {
+            _ncss++;
+            Util.debug( "_ncss++" );
+        }
+
+}
+
+void DefaultValue():
+{}
+{
+  "default" MemberValue()
+}
+
+/*
+ * Modifiers. We match all modifiers in a single rule to reduce the chances of
+ * syntax errors for simple modifier mistakes. It will also enable us to give
+ * better error messages.
+ */
+
+int Modifiers():
+{
+   int modifiers = 0;
+   _tmpToken = null;
+}
+{
+ (
+  LOOKAHEAD(2)
+  (
+   "public" { modifiers |= ModifierSet.PUBLIC;
+      if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "static" { modifiers |= ModifierSet.STATIC;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "protected" { modifiers |= ModifierSet.PROTECTED;       if ( _tmpToken == null ) {
+       _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "private" { modifiers |= ModifierSet.PRIVATE;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "final" { modifiers |= ModifierSet.FINAL;       if ( _tmpToken == null ) {
+       _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "abstract" { modifiers |= ModifierSet.ABSTRACT;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "synchronized" { modifiers |= ModifierSet.SYNCHRONIZED;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "native" { modifiers |= ModifierSet.NATIVE;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "transient" { modifiers |= ModifierSet.TRANSIENT;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "volatile" { modifiers |= ModifierSet.VOLATILE;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   "strictfp" { modifiers |= ModifierSet.STRICTFP;       if ( _tmpToken == null ) {
+          _tmpToken = getToken( 0 );
+      }
+}
+  |
+   Annotation()
+  )
+ )*
+
+ {
+    return modifiers;
+ }
+}
+
+void ClassOrInterfaceDeclaration(int modifiers):
+{
+   boolean isInterface = false;
+}
+{
+  ( "class" | "interface" { isInterface = true; } )
+  <IDENTIFIER>
+  [ TypeParameters() ]
+  [ ExtendsList(isInterface) ]
+  [ ImplementsList(isInterface) ]
+  ClassOrInterfaceBody(isInterface)
+}
+
+void EnumDeclaration(int modifiers):
+{
+        String sOldClass = _sClass;
+        int oldClasses = _classes;
+        int oldNcss = _ncss;
+        int oldFunctions = _functions;
+
+        // Chris Povirk
+        int oldSingle;
+        int oldMulti;
+}
+{
+    { Util.debug( "EnumDeclaration().START" ); }
+    "enum" <IDENTIFIER>
+         {
+                if (!_sClass.equals("")) {
+                        _sClass += ".";
+                }
+                _sClass += getToken(0).image;
+                _classLevel ++;
+         }
+  [ ImplementsList(false) ]
+{
+        // Chris Povirk
+      oldSingle = JavaParserDebugTokenManager._iSingleComments;
+      oldMulti = JavaParserDebugTokenManager._iMultiComments;
+}
+  EnumBody()
+         {
+             _classLevel--;
+             if (_classLevel == 0) {
+                 //_topLevelClasses++;
+                 ObjectMetric metric = new ObjectMetric();
+                 metric.name = _sPackage + _sClass;
+                 metric.ncss = _ncss - oldNcss;
+                 metric.functions = _functions - oldFunctions;
+                 metric.classes = _classes - oldClasses;
+                 Token lastToken = getToken( 0 );
+                 //metric.add( new Integer( lastToken.endLine ) );
+                 //metric.add( new Integer( lastToken.endColumn ) );
+                 metric.javadocs = _javadocs;
+
+                 // Chris Povirk
+                 metric.javadocsLn = _jvdcLines;
+                 metric.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
+                 metric.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
+
+                 _vClasses.add(metric);
+                 _pPackageMetric.functions += _functions - oldFunctions;
+                 _pPackageMetric.classes++;
+
+                 // added by SMS
+                 _pPackageMetric.javadocs += _javadocs;
+                 //_pPackageMetric.javadocsLn += JavaParserDebugTokenManager._iFormalComments - oldFormal;
+                 //_pPackageMetric.singleLn += JavaParserDebugTokenManager._iSingleComments - oldSingle;
+                 //_pPackageMetric.multiLn += Manager._iMultiComments - oldMulti;
+                 //
+             }
+             _functions = oldFunctions;
+             _classes = oldClasses + 1;
+             _sClass = sOldClass;
+         }
+}
+
+void TypeParameters():
+{}
+{
+//    "<" TypeParameter() ( "," TypeParameter() )* [">>>"|">>"|">"]// [LOOKAHEAD(2)">"] [LOOKAHEAD(2)">>"] //Removed by REYNAUD Sebastien (LOGICA)
+
+//Added by REYNAUD Sebastien (LOGICA)
+"<" TypeParameter() ( "," TypeParameter() )* ">"
+//
+
+}
+
+void ExtendsList(boolean isInterface):
+{
+   boolean extendsMoreThanOne = false;
+}
+{
+   "extends" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() { extendsMoreThanOne = true; } )*
+   {
+      if (extendsMoreThanOne && !isInterface)
+         throw new ParseException("A class cannot extend more than one other class");
+   }
+}
+
+void ImplementsList(boolean isInterface):
+{}
+{
+   "implements" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() )*
+   {
+      if (isInterface)
+         throw new ParseException("An interface cannot implement other interfaces");
+   }
+}
+
+void ClassOrInterfaceBody(boolean isInterface):
+{}
+{
+  "{"
+         { _ncss++; Util.debug( "ClassOrInterfaceBody()._ncss++" ); }
+ ( ClassOrInterfaceBodyDeclaration(isInterface) )* "}"
+}
+
+void EnumBody():
+{}
+{
+    "{"
+           {
+               _ncss++;
+               Util.debug( "_ncss++" );
+           }
+
+   [ EnumConstant() ( LOOKAHEAD(2) "," EnumConstant() )* ]
+        [ "," ]
+   [ ";" ( ClassOrInterfaceBodyDeclaration(false) )* ]
+   "}"
+}
+
+void TypeParameter():
+{}
+{
+    <IDENTIFIER> [ TypeBound() ]
+}
+
+void ClassOrInterfaceType():
+{}
+{
+  <IDENTIFIER>
+{
+                _sName = getToken(0).image;
+                if ( _tmpResultToken == null )
+                {
+                  _tmpResultToken = getToken( 0 );
+                  Util.debug( "ClassOrInterfaceType._tmpResultToken: " + _tmpResultToken );
+                }
+}
+[ LOOKAHEAD(4) TypeArguments() ]
+  ( LOOKAHEAD(2) "." <IDENTIFIER>
+        {
+                _sName += "." + getToken(0).image;
+        }
+ [ LOOKAHEAD(2) TypeArguments() ] )*
+}
+
+void ClassOrInterfaceBodyDeclaration(boolean isInterface):
+{
+   //boolean isNestedInterface = false;
+   int modifiers;
+}
+{
+  LOOKAHEAD(2)
+  Initializer()
+  {
+     if (isInterface)
+        throw new ParseException("An interface cannot have initializers");
+  }
+|
+  modifiers = Modifiers() // Just get all the modifiers out of the way. If you want to do
+              // more checks, pass the modifiers down to the member
+  (
+      ClassOrInterfaceDeclaration(modifiers)
+    |
+      EnumDeclaration(modifiers)
+    |
+      LOOKAHEAD( [ TypeParameters() ] <IDENTIFIER> "(" )
+      ConstructorDeclaration()
+    |
+      LOOKAHEAD( Type() <IDENTIFIER> ( "[" "]" )* ( "," | "=" | ";" ) )
+      FieldDeclaration15(modifiers)
+    |
+      MethodDeclaration15(modifiers)
+  )
+|
+  ";"
+}
+
+void EnumConstant():
+{}
+{
+  Modifiers() <IDENTIFIER> [ Arguments() ] [ ClassOrInterfaceBody(false) ]
+}
+
+void TypeBound():
+{}
+{
+   "extends" ClassOrInterfaceType() ( "&" ClassOrInterfaceType() )*
+}
+
+void TypeArguments():
+{}
+{
+//    "<" TypeArgument() ( LOOKAHEAD(2) "," TypeArgument() )* [LOOKAHEAD(3)">"] [LOOKAHEAD(3)">>"] [LOOKAHEAD(3)">>>"] //Removed by REYNAUD Sebastien (LOGICA)
+
+//Added by REYNAUD Sebastien (LOGICA)
+	"<" TypeArgument() ( LOOKAHEAD(2) "," TypeArgument() )* ">"
+//
+
+}
+
+void TypeArgument():
+{}
+{
+/* ccl 2008-01-24
+    LOOKAHEAD(2)
+    <IDENTIFIER> TypeArguments()
+ |*/
+   ReferenceType()
+ |
+   "?" [ WildcardBounds() ]
+
+}
+
+void ReferenceType():
+{}
+{
+/* ccl 2008-01-23 */
+   PrimitiveType() ( LOOKAHEAD(2) "[" "]" { _sName += "[]"; } )+
+  |
+   ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" { _sName += "[]"; } )*
+}
+
+void WildcardBounds():
+{}
+{
+   "extends" ReferenceType()
+ |
+   "super" ReferenceType()
+}
+
+void FieldDeclaration15(int modifiers):
+{}
+{
+  // Modifiers are already matched in the caller
+  Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"
+}
+
+void MethodDeclaration15(int modifiers):
+{}
+{
+    MethodDeclaration()
+    /*
+  // Modifiers already matched in the caller!
+  [ TypeParameters() ]
+  ResultType()
+  MethodDeclarator15() [ "throws" NameList() ]
+         ( Block() | ";" ) { _ncss++; Util.debug( "MethodDeclaration15()._ncss++" ); }
+    */
+}
+
+void MethodDeclarator15():
+{}
+{
+  <IDENTIFIER> FormalParameters() ( "[" "]" )*
+}
+
+void FormalParameters15():
+{}
+{
+  "(" [ FormalParameter15() ( "," FormalParameter15() )* ] ")"
+}
+
+void FormalParameter15():
+{}
+{
+  Modifiers() Type() [ "..." ] VariableDeclaratorId()
+}
+
+void MemberSelector():
+{}
+{
+  "." TypeArguments() <IDENTIFIER>
+}
+
diff --git a/cobertura/src/main/javacc/java1.5/GTToken.java b/cobertura/src/main/javacc/java1.5/GTToken.java
new file mode 100644
index 0000000..cb654ae
--- /dev/null
+++ b/cobertura/src/main/javacc/java1.5/GTToken.java
@@ -0,0 +1,5 @@
+package net.sourceforge.cobertura.javancss.parser.java15;
+
+public class GTToken extends Token {
+  int realKind = JavaParser15Constants.GT;
+}
diff --git a/cobertura/src/main/javacc/java1.5/Java1.5.jj b/cobertura/src/main/javacc/java1.5/Java1.5.jj
new file mode 100644
index 0000000..0ffaafb
--- /dev/null
+++ b/cobertura/src/main/javacc/java1.5/Java1.5.jj
@@ -0,0 +1,2237 @@
+
+/*
+ * Copyright © 2002 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * California 95054, U.S.A. All rights reserved.  Sun Microsystems, Inc. has
+ * intellectual property rights relating to technology embodied in the product
+ * that is described in this document. In particular, and without limitation,
+ * these intellectual property rights may include one or more of the U.S.
+ * patents listed at http://www.sun.com/patents and one or more additional
+ * patents or pending patent applications in the U.S. and in other countries.
+ * U.S. Government Rights - Commercial software. Government users are subject
+ * to the Sun Microsystems, Inc. standard license agreement and applicable
+ * provisions of the FAR and its supplements.  Use is subject to license terms.
+ * Sun,  Sun Microsystems,  the Sun logo and  Java are trademarks or registered
+ * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.  This
+ * product is covered and controlled by U.S. Export Control laws and may be
+ * subject to the export or import laws in other countries.  Nuclear, missile,
+ * chemical biological weapons or nuclear maritime end uses or end users,
+ * whether direct or indirect, are strictly prohibited.  Export or reexport
+ * to countries subject to U.S. embargo or to entities identified on U.S.
+ * export exclusion lists, including, but not limited to, the denied persons
+ * and specially designated nationals lists is strictly prohibited.
+ */
+
+options {
+  JAVA_UNICODE_ESCAPE = true;
+  ERROR_REPORTING = false;
+  STATIC = false;
+  JDK_VERSION = "1.5";
+  /*
+  DEBUG_PARSER = true;
+  // */
+}
+
+PARSER_BEGIN(JavaParser15)
+
+package net.sourceforge.cobertura.javancss.parser.java15;
+
+import java.io.*;
+
+import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
+import java.util.*;
+
+import net.sourceforge.cobertura.javancss.FunctionMetric;
+import net.sourceforge.cobertura.javancss.ObjectMetric;
+import net.sourceforge.cobertura.javancss.PackageMetric;
+
+/**
+ * Grammar to parse Java version 1.5
+ * @author Sreenivasa Viswanadha - Simplified and enhanced for 1.5
+ */
+public class JavaParser15 implements JavaParserInterface
+{
+    private boolean _bReturn         = false;
+    private int     _ncss            = 0;     // general counter
+    private int     _loc             = 0;
+    private int     _cyc             = 1;
+    private int     _localCases      = 0;
+    private String  _sName           = "";    // name of last token
+    private String  _sParameter      = "";
+    private String  _sPackage        = "";
+    private String  _sClass          = "";
+    private String  _sFunction       = "";
+    private int     _functions       = 0;     // number of functions in this class
+    //private int     _topLevelClasses = 0;
+    private int     _classes         = 0;
+    private int     _classLevel      = 0;
+    private int     _anonClassCount  = 1;
+
+    private int     _jvdcLines = 0;           // added by SMS
+    private int     _jvdc      = 0;
+    private boolean _bPrivate  = true;//false;        // added by SMS
+    private boolean _bPublic   = true;        // added by SMS
+
+    /**
+     * For each class the number of formal
+     * comments in toplevel methods, constructors, inner
+     * classes, and for the class itself are counted.
+     * The top level comment has to be directly before
+     * the class definition, not before the package or
+     * import statement as it is often seen in source code
+     * examples (at the beginning of your source files you
+     * should instead put your copyright notice).
+     */ 
+    private int    _javadocs   = 0;              // global javadocs
+    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
+
+    /** 
+     * Metrics for each class/interface are stored in this
+     * vector.
+     */
+    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
+    private List _vImports = new ArrayList();
+    private Object[] _aoPackage = null;
+    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
+    private PackageMetric _pPackageMetric;
+
+    private Token _tmpToken = null;
+    /** Argh, too much of a state machine. */
+    private Token _tmpResultToken = null;
+    
+    private String _formatPackage(String sPackage_) {
+        if (sPackage_.equals("")) {
+            return ".";
+        }
+        
+        return sPackage_.substring(0, sPackage_.length() - 1);
+    }
+    
+
+    public void parse() throws Exception {
+      CompilationUnit();
+    }
+
+    public void parseImportUnit() throws Exception {
+      ImportUnit();
+    }
+
+    public int getNcss() {
+        return _ncss;
+    }
+    
+    public int getLOC() {
+        return _loc;
+    }
+
+    // added by SMS
+    public int getJvdc() {
+        return _jvdc;
+    }
+
+    /*public int getTopLevelClasses() {
+      return _topLevelClasses;
+      }*/
+    
+    public List/*<FunctionMetric>*/ getFunction() {
+        return _vFunctions;
+    }
+    
+    /**
+     * @return Top level classes in sorted order
+     */
+    public List/*<ObjectMetric>*/ getObject() {
+        Collections.sort(_vClasses);
+        return _vClasses;
+    }
+    
+    /**
+     * @return The empty package consists of the name ".".
+     */
+    public Map/*<String,PackageMetric>*/ getPackage() {
+        return _htPackage;
+    }
+    
+    public List getImports() {
+        return _vImports;
+    }
+
+    /**
+     * name, beginLine, ...
+     */
+    public Object[] getPackageObjects() {
+        return _aoPackage;
+    }
+
+    /**
+     * if javancss is used with cat *.java a long
+     * input stream might get generated, so line
+     * number information in case of an parse exception
+     * is not very useful.
+     */
+    public String getLastFunction() {
+        return _sPackage + _sClass + _sFunction;
+    }
+   /**
+    * Class to hold modifiers.
+    */
+   static public final class ModifierSet
+   {
+     /* Definitions of the bits in the modifiers field.  */
+     public static final int PUBLIC = 0x0001;
+     public static final int PROTECTED = 0x0002;
+     public static final int PRIVATE = 0x0004;
+     public static final int ABSTRACT = 0x0008;
+     public static final int STATIC = 0x0010;
+     public static final int FINAL = 0x0020;
+     public static final int SYNCHRONIZED = 0x0040;
+     public static final int NATIVE = 0x0080;
+     public static final int TRANSIENT = 0x0100;
+     public static final int VOLATILE = 0x0200;
+     public static final int STRICTFP = 0x1000;
+
+     /** A set of accessors that indicate whether the specified modifier
+         is in the set. */
+
+     public boolean isPublic(int modifiers)
+     {
+       return (modifiers & PUBLIC) != 0;
+     }
+
+     public boolean isProtected(int modifiers)
+     {
+       return (modifiers & PROTECTED) != 0;
+     }
+
+     public boolean isPrivate(int modifiers)
+     {
+       return (modifiers & PRIVATE) != 0;
+     }
+
+     public boolean isStatic(int modifiers)
+     {
+       return (modifiers & STATIC) != 0;
+     }
+
+     public boolean isAbstract(int modifiers)
+     {
+       return (modifiers & ABSTRACT) != 0;
+     }
+
+     public boolean isFinal(int modifiers)
+     {
+       return (modifiers & FINAL) != 0;
+     }
+
+     public boolean isNative(int modifiers)
+     {
+       return (modifiers & NATIVE) != 0;
+     }
+
+     public boolean isStrictfp(int modifiers)
+     {
+       return (modifiers & STRICTFP) != 0;
+     }
+
+     public boolean isSynchronized(int modifiers)
+     {
+       return (modifiers & SYNCHRONIZED) != 0;
+     }
+
+     public boolean isTransient(int modifiers)
+      {
+       return (modifiers & TRANSIENT) != 0;
+     }
+
+     public boolean isVolatile(int modifiers)
+     {
+       return (modifiers & VOLATILE) != 0;
+     }
+
+     /**
+      * Removes the given modifier.
+      */
+     static int removeModifier(int modifiers, int mod)
+     {
+        return modifiers & ~mod;
+     }
+   }
+
+   public JavaParser15(String fileName)
+   {
+      this(System.in);
+      try { ReInit(new FileInputStream(new File(fileName))); }
+      catch(Exception e) { e.printStackTrace(); }
+   }
+
+  public static void main(String args[]) {
+    JavaParser15 parser;
+    if (args.length == 0) {
+      System.out.println("Java Parser Version 1.5:  Reading from standard input . . .");
+      parser = new JavaParser15(System.in);
+    } else if (args.length == 1) {
+      System.out.println("Java Parser Version 1.5:  Reading from file " + args[0] + " . . .");
+      try {
+        parser = new JavaParser15(new java.io.FileInputStream(args[0]));
+      } catch (java.io.FileNotFoundException e) {
+        System.out.println("Java Parser Version 1.5:  File " + args[0] + " not found.");
+        return;
+      }
+    } else {
+      System.out.println("Java Parser Version 1.5:  Usage is one of:");
+      System.out.println("         java javancss.parser.java15.JavaParser15 < inputfile");
+      System.out.println("OR");
+      System.out.println("         java javancss.parser.java15.JavaParser15 inputfile");
+      return;
+    }
+    try {
+      parser.CompilationUnit();
+      System.out.println("Java Parser Version 1.1:  Java program parsed successfully.");
+    } catch (ParseException e) {
+      System.out.println(e.getMessage());
+      System.out.println("Java Parser Version 1.1:  Encountered errors during parse.");
+    }
+  }
+
+}
+
+PARSER_END(JavaParser15)
+
+/* WHITE SPACE */
+
+SKIP :
+{
+  " "
+| "\t"
+| "\n"
+| "\r"
+| "\f"
+}
+
+/* COMMENTS */
+
+MORE :
+{
+  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+|
+  "/*" : IN_MULTI_LINE_COMMENT
+}
+
+SPECIAL_TOKEN :
+{
+  <SINGLE_LINE_COMMENT: "//" (~["\n", "\r"])* ("\n" | "\r" | "\r\n")?>
+}
+
+<IN_FORMAL_COMMENT>
+SPECIAL_TOKEN :
+{
+  <FORMAL_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_MULTI_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+  <MULTI_LINE_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
+MORE :
+{
+  < ~[] >
+}
+
+/* RESERVED WORDS AND LITERALS */
+
+TOKEN :
+{
+  < ABSTRACT: "abstract" >
+| < ASSERT: "assert" >
+| < BOOLEAN: "boolean" >
+| < BREAK: "break" >
+| < BYTE: "byte" >
+| < CASE: "case" >
+| < CATCH: "catch" >
+| < CHAR: "char" >
+| < CLASS: "class" >
+| < CONST: "const" >
+| < CONTINUE: "continue" >
+| < _DEFAULT: "default" >
+| < DO: "do" >
+| < DOUBLE: "double" >
+| < ELSE: "else" >
+| < ENUM: "enum" >
+| < EXTENDS: "extends" >
+| < FALSE: "false" >
+| < FINAL: "final" >
+| < FINALLY: "finally" >
+| < FLOAT: "float" >
+| < FOR: "for" >
+| < GOTO: "goto" >
+| < IF: "if" >
+| < IMPLEMENTS: "implements" >
+| < IMPORT: "import" >
+| < INSTANCEOF: "instanceof" >
+| < INT: "int" >
+| < INTERFACE: "interface" >
+| < LONG: "long" >
+| < NATIVE: "native" >
+| < NEW: "new" >
+| < NULL: "null" >
+| < PACKAGE: "package">
+| < PRIVATE: "private" >
+| < PROTECTED: "protected" >
+| < PUBLIC: "public" >
+| < RETURN: "return" >
+| < SHORT: "short" >
+| < STATIC: "static" >
+| < STRICTFP: "strictfp" >
+| < SUPER: "super" >
+| < SWITCH: "switch" >
+| < SYNCHRONIZED: "synchronized" >
+| < THIS: "this" >
+| < THROW: "throw" >
+| < THROWS: "throws" >
+| < TRANSIENT: "transient" >
+| < TRUE: "true" >
+| < TRY: "try" >
+| < VOID: "void" >
+| < VOLATILE: "volatile" >
+| < WHILE: "while" >
+}
+
+/* LITERALS */
+
+TOKEN :
+{
+  < INTEGER_LITERAL:
+        <DECIMAL_LITERAL> (["l","L"])?
+      | <HEX_LITERAL> (["l","L"])?
+      | <OCTAL_LITERAL> (["l","L"])?
+  >
+|
+  < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
+|
+  < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
+|
+  < #OCTAL_LITERAL: "0" (["0"-"7"])* >
+|
+  < FLOATING_POINT_LITERAL:
+        <DECIMAL_FLOATING_POINT_LITERAL>
+      | <HEXADECIMAL_FLOATING_POINT_LITERAL>
+  >
+|
+  < #DECIMAL_FLOATING_POINT_LITERAL:
+        (["0"-"9"])+ "." (["0"-"9"])* (<DECIMAL_EXPONENT>)? (["f","F","d","D"])?
+      | "." (["0"-"9"])+ (<DECIMAL_EXPONENT>)? (["f","F","d","D"])?
+      | (["0"-"9"])+ <DECIMAL_EXPONENT> (["f","F","d","D"])?
+      | (["0"-"9"])+ (<DECIMAL_EXPONENT>)? ["f","F","d","D"]
+  >
+|
+  < #DECIMAL_EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+|
+  < #HEXADECIMAL_FLOATING_POINT_LITERAL:
+        "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])+ (".")? <HEXADECIMAL_EXPONENT> (["f","F","d","D"])?
+      | "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])* "." (["0"-"9","a"-"f","A"-"F"])+ <HEXADECIMAL_EXPONENT> (["f","F","d","D"])?
+  >
+|
+  < #HEXADECIMAL_EXPONENT: ["p","P"] (["+","-"])? (["0"-"9"])+ >
+|
+  < CHARACTER_LITERAL:
+      "'"
+      (   (~["'","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )
+      "'"
+  >
+|
+  < STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\""
+  >
+}
+
+/* IDENTIFIERS */
+
+TOKEN :
+{
+  < IDENTIFIER: <LETTER> (<PART_LETTER>)* >
+|
+  < #LETTER:
+      [  // all chars for which Character.isIdentifierStart is true
+         "$",
+         "A"-"Z",
+         "_",
+         "a"-"z",
+         "\u00a2"-"\u00a5",
+         "\u00aa",
+         "\u00b5",
+         "\u00ba",
+         "\u00c0"-"\u00d6",
+         "\u00d8"-"\u00f6",
+         "\u00f8"-"\u021f",
+         "\u0222"-"\u0233",
+         "\u0250"-"\u02ad",
+         "\u02b0"-"\u02b8",
+         "\u02bb"-"\u02c1",
+         "\u02d0"-"\u02d1",
+         "\u02e0"-"\u02e4",
+         "\u02ee",
+         "\u037a",
+         "\u0386",
+         "\u0388"-"\u038a",
+         "\u038c",
+         "\u038e"-"\u03a1",
+         "\u03a3"-"\u03ce",
+         "\u03d0"-"\u03d7",
+         "\u03da"-"\u03f3",
+         "\u0400"-"\u0481",
+         "\u048c"-"\u04c4",
+         "\u04c7"-"\u04c8",
+         "\u04cb"-"\u04cc",
+         "\u04d0"-"\u04f5",
+         "\u04f8"-"\u04f9",
+         "\u0531"-"\u0556",
+         "\u0559",
+         "\u0561"-"\u0587",
+         "\u05d0"-"\u05ea",
+         "\u05f0"-"\u05f2",
+         "\u0621"-"\u063a",
+         "\u0640"-"\u064a",
+         "\u0671"-"\u06d3",
+         "\u06d5",
+         "\u06e5"-"\u06e6",
+         "\u06fa"-"\u06fc",
+         "\u0710",
+         "\u0712"-"\u072c",
+         "\u0780"-"\u07a5",
+         "\u0905"-"\u0939",
+         "\u093d",
+         "\u0950",
+         "\u0958"-"\u0961",
+         "\u0985"-"\u098c",
+         "\u098f"-"\u0990",
+         "\u0993"-"\u09a8",
+         "\u09aa"-"\u09b0",
+         "\u09b2",
+         "\u09b6"-"\u09b9",
+         "\u09dc"-"\u09dd",
+         "\u09df"-"\u09e1",
+         "\u09f0"-"\u09f3",
+         "\u0a05"-"\u0a0a",
+         "\u0a0f"-"\u0a10",
+         "\u0a13"-"\u0a28",
+         "\u0a2a"-"\u0a30",
+         "\u0a32"-"\u0a33",
+         "\u0a35"-"\u0a36",
+         "\u0a38"-"\u0a39",
+         "\u0a59"-"\u0a5c",
+         "\u0a5e",
+         "\u0a72"-"\u0a74",
+         "\u0a85"-"\u0a8b",
+         "\u0a8d",
+         "\u0a8f"-"\u0a91",
+         "\u0a93"-"\u0aa8",
+         "\u0aaa"-"\u0ab0",
+         "\u0ab2"-"\u0ab3",
+         "\u0ab5"-"\u0ab9",
+         "\u0abd",
+         "\u0ad0",
+         "\u0ae0",
+         "\u0b05"-"\u0b0c",
+         "\u0b0f"-"\u0b10",
+         "\u0b13"-"\u0b28",
+         "\u0b2a"-"\u0b30",
+         "\u0b32"-"\u0b33",
+         "\u0b36"-"\u0b39",
+         "\u0b3d",
+         "\u0b5c"-"\u0b5d",
+         "\u0b5f"-"\u0b61",
+         "\u0b85"-"\u0b8a",
+         "\u0b8e"-"\u0b90",
+         "\u0b92"-"\u0b95",
+         "\u0b99"-"\u0b9a",
+         "\u0b9c",
+         "\u0b9e"-"\u0b9f",
+         "\u0ba3"-"\u0ba4",
+         "\u0ba8"-"\u0baa",
+         "\u0bae"-"\u0bb5",
+         "\u0bb7"-"\u0bb9",
+         "\u0c05"-"\u0c0c",
+         "\u0c0e"-"\u0c10",
+         "\u0c12"-"\u0c28",
+         "\u0c2a"-"\u0c33",
+         "\u0c35"-"\u0c39",
+         "\u0c60"-"\u0c61",
+         "\u0c85"-"\u0c8c",
+         "\u0c8e"-"\u0c90",
+         "\u0c92"-"\u0ca8",
+         "\u0caa"-"\u0cb3",
+         "\u0cb5"-"\u0cb9",
+         "\u0cde",
+         "\u0ce0"-"\u0ce1",
+         "\u0d05"-"\u0d0c",
+         "\u0d0e"-"\u0d10",
+         "\u0d12"-"\u0d28",
+         "\u0d2a"-"\u0d39",
+         "\u0d60"-"\u0d61",
+         "\u0d85"-"\u0d96",
+         "\u0d9a"-"\u0db1",
+         "\u0db3"-"\u0dbb",
+         "\u0dbd",
+         "\u0dc0"-"\u0dc6",
+         "\u0e01"-"\u0e30",
+         "\u0e32"-"\u0e33",
+         "\u0e3f"-"\u0e46",
+         "\u0e81"-"\u0e82",
+         "\u0e84",
+         "\u0e87"-"\u0e88",
+         "\u0e8a",
+         "\u0e8d",
+         "\u0e94"-"\u0e97",
+         "\u0e99"-"\u0e9f",
+         "\u0ea1"-"\u0ea3",
+         "\u0ea5",
+         "\u0ea7",
+         "\u0eaa"-"\u0eab",
+         "\u0ead"-"\u0eb0",
+         "\u0eb2"-"\u0eb3",
+         "\u0ebd",
+         "\u0ec0"-"\u0ec4",
+         "\u0ec6",
+         "\u0edc"-"\u0edd",
+         "\u0f00",
+         "\u0f40"-"\u0f47",
+         "\u0f49"-"\u0f6a",
+         "\u0f88"-"\u0f8b",
+         "\u1000"-"\u1021",
+         "\u1023"-"\u1027",
+         "\u1029"-"\u102a",
+         "\u1050"-"\u1055",
+         "\u10a0"-"\u10c5",
+         "\u10d0"-"\u10f6",
+         "\u1100"-"\u1159",
+         "\u115f"-"\u11a2",
+         "\u11a8"-"\u11f9",
+         "\u1200"-"\u1206",
+         "\u1208"-"\u1246",
+         "\u1248",
+         "\u124a"-"\u124d",
+         "\u1250"-"\u1256",
+         "\u1258",
+         "\u125a"-"\u125d",
+         "\u1260"-"\u1286",
+         "\u1288",
+         "\u128a"-"\u128d",
+         "\u1290"-"\u12ae",
+         "\u12b0",
+         "\u12b2"-"\u12b5",
+         "\u12b8"-"\u12be",
+         "\u12c0",
+         "\u12c2"-"\u12c5",
+         "\u12c8"-"\u12ce",
+         "\u12d0"-"\u12d6",
+         "\u12d8"-"\u12ee",
+         "\u12f0"-"\u130e",
+         "\u1310",
+         "\u1312"-"\u1315",
+         "\u1318"-"\u131e",
+         "\u1320"-"\u1346",
+         "\u1348"-"\u135a",
+         "\u13a0"-"\u13f4",
+         "\u1401"-"\u166c",
+         "\u166f"-"\u1676",
+         "\u1681"-"\u169a",
+         "\u16a0"-"\u16ea",
+         "\u1780"-"\u17b3",
+         "\u17db",
+         "\u1820"-"\u1877",
+         "\u1880"-"\u18a8",
+         "\u1e00"-"\u1e9b",
+         "\u1ea0"-"\u1ef9",
+         "\u1f00"-"\u1f15",
+         "\u1f18"-"\u1f1d",
+         "\u1f20"-"\u1f45",
+         "\u1f48"-"\u1f4d",
+         "\u1f50"-"\u1f57",
+         "\u1f59",
+         "\u1f5b",
+         "\u1f5d",
+         "\u1f5f"-"\u1f7d",
+         "\u1f80"-"\u1fb4",
+         "\u1fb6"-"\u1fbc",
+         "\u1fbe",
+         "\u1fc2"-"\u1fc4",
+         "\u1fc6"-"\u1fcc",
+         "\u1fd0"-"\u1fd3",
+         "\u1fd6"-"\u1fdb",
+         "\u1fe0"-"\u1fec",
+         "\u1ff2"-"\u1ff4",
+         "\u1ff6"-"\u1ffc",
+         "\u203f"-"\u2040",
+         "\u207f",
+         "\u20a0"-"\u20af",
+         "\u2102",
+         "\u2107",
+         "\u210a"-"\u2113",
+         "\u2115",
+         "\u2119"-"\u211d",
+         "\u2124",
+         "\u2126",
+         "\u2128",
+         "\u212a"-"\u212d",
+         "\u212f"-"\u2131",
+         "\u2133"-"\u2139",
+         "\u2160"-"\u2183",
+         "\u3005"-"\u3007",
+         "\u3021"-"\u3029",
+         "\u3031"-"\u3035",
+         "\u3038"-"\u303a",
+         "\u3041"-"\u3094",
+         "\u309d"-"\u309e",
+         "\u30a1"-"\u30fe",
+         "\u3105"-"\u312c",
+         "\u3131"-"\u318e",
+         "\u31a0"-"\u31b7",
+         "\u3400"-"\u4db5",
+         "\u4e00"-"\u9fa5",
+         "\ua000"-"\ua48c",
+         "\uac00"-"\ud7a3",
+         "\uf900"-"\ufa2d",
+         "\ufb00"-"\ufb06",
+         "\ufb13"-"\ufb17",
+         "\ufb1d",
+         "\ufb1f"-"\ufb28",
+         "\ufb2a"-"\ufb36",
+         "\ufb38"-"\ufb3c",
+         "\ufb3e",
+         "\ufb40"-"\ufb41",
+         "\ufb43"-"\ufb44",
+         "\ufb46"-"\ufbb1",
+         "\ufbd3"-"\ufd3d",
+         "\ufd50"-"\ufd8f",
+         "\ufd92"-"\ufdc7",
+         "\ufdf0"-"\ufdfb",
+         "\ufe33"-"\ufe34",
+         "\ufe4d"-"\ufe4f",
+         "\ufe69",
+         "\ufe70"-"\ufe72",
+         "\ufe74",
+         "\ufe76"-"\ufefc",
+         "\uff04",
+         "\uff21"-"\uff3a",
+         "\uff3f",
+         "\uff41"-"\uff5a",
+         "\uff65"-"\uffbe",
+         "\uffc2"-"\uffc7",
+         "\uffca"-"\uffcf",
+         "\uffd2"-"\uffd7",
+         "\uffda"-"\uffdc",
+         "\uffe0"-"\uffe1",
+         "\uffe5"-"\uffe6"
+      ]
+  >
+|
+  < #PART_LETTER:
+      [  // all chars for which Character.isIdentifierPart is true
+         "\u0000"-"\u0008",
+         "\u000e"-"\u001b",
+         "$",
+         "0"-"9",
+         "A"-"Z",
+         "_",
+         "a"-"z",
+         "\u007f"-"\u009f",
+         "\u00a2"-"\u00a5",
+         "\u00aa",
+         "\u00b5",
+         "\u00ba",
+         "\u00c0"-"\u00d6",
+         "\u00d8"-"\u00f6",
+         "\u00f8"-"\u021f",
+         "\u0222"-"\u0233",
+         "\u0250"-"\u02ad",
+         "\u02b0"-"\u02b8",
+         "\u02bb"-"\u02c1",
+         "\u02d0"-"\u02d1",
+         "\u02e0"-"\u02e4",
+         "\u02ee",
+         "\u0300"-"\u034e",
+         "\u0360"-"\u0362",
+         "\u037a",
+         "\u0386",
+         "\u0388"-"\u038a",
+         "\u038c",
+         "\u038e"-"\u03a1",
+         "\u03a3"-"\u03ce",
+         "\u03d0"-"\u03d7",
+         "\u03da"-"\u03f3",
+         "\u0400"-"\u0481",
+         "\u0483"-"\u0486",
+         "\u048c"-"\u04c4",
+         "\u04c7"-"\u04c8",
+         "\u04cb"-"\u04cc",
+         "\u04d0"-"\u04f5",
+         "\u04f8"-"\u04f9",
+         "\u0531"-"\u0556",
+         "\u0559",
+         "\u0561"-"\u0587",
+         "\u0591"-"\u05a1",
+         "\u05a3"-"\u05b9",
+         "\u05bb"-"\u05bd",
+         "\u05bf",
+         "\u05c1"-"\u05c2",
+         "\u05c4",
+         "\u05d0"-"\u05ea",
+         "\u05f0"-"\u05f2",
+         "\u0621"-"\u063a",
+         "\u0640"-"\u0655",
+         "\u0660"-"\u0669",
+         "\u0670"-"\u06d3",
+         "\u06d5"-"\u06dc",
+         "\u06df"-"\u06e8",
+         "\u06ea"-"\u06ed",
+         "\u06f0"-"\u06fc",
+         "\u070f"-"\u072c",
+         "\u0730"-"\u074a",
+         "\u0780"-"\u07b0",
+         "\u0901"-"\u0903",
+         "\u0905"-"\u0939",
+         "\u093c"-"\u094d",
+         "\u0950"-"\u0954",
+         "\u0958"-"\u0963",
+         "\u0966"-"\u096f",
+         "\u0981"-"\u0983",
+         "\u0985"-"\u098c",
+         "\u098f"-"\u0990",
+         "\u0993"-"\u09a8",
+         "\u09aa"-"\u09b0",
+         "\u09b2",
+         "\u09b6"-"\u09b9",
+         "\u09bc",
+         "\u09be"-"\u09c4",
+         "\u09c7"-"\u09c8",
+         "\u09cb"-"\u09cd",
+         "\u09d7",
+         "\u09dc"-"\u09dd",
+         "\u09df"-"\u09e3",
+         "\u09e6"-"\u09f3",
+         "\u0a02",
+         "\u0a05"-"\u0a0a",
+         "\u0a0f"-"\u0a10",
+         "\u0a13"-"\u0a28",
+         "\u0a2a"-"\u0a30",
+         "\u0a32"-"\u0a33",
+         "\u0a35"-"\u0a36",
+         "\u0a38"-"\u0a39",
+         "\u0a3c",
+         "\u0a3e"-"\u0a42",
+         "\u0a47"-"\u0a48",
+         "\u0a4b"-"\u0a4d",
+         "\u0a59"-"\u0a5c",
+         "\u0a5e",
+         "\u0a66"-"\u0a74",
+         "\u0a81"-"\u0a83",
+         "\u0a85"-"\u0a8b",
+         "\u0a8d",
+         "\u0a8f"-"\u0a91",
+         "\u0a93"-"\u0aa8",
+         "\u0aaa"-"\u0ab0",
+         "\u0ab2"-"\u0ab3",
+         "\u0ab5"-"\u0ab9",
+         "\u0abc"-"\u0ac5",
+         "\u0ac7"-"\u0ac9",
+         "\u0acb"-"\u0acd",
+         "\u0ad0",
+         "\u0ae0",
+         "\u0ae6"-"\u0aef",
+         "\u0b01"-"\u0b03",
+         "\u0b05"-"\u0b0c",
+         "\u0b0f"-"\u0b10",
+         "\u0b13"-"\u0b28",
+         "\u0b2a"-"\u0b30",
+         "\u0b32"-"\u0b33",
+         "\u0b36"-"\u0b39",
+         "\u0b3c"-"\u0b43",
+         "\u0b47"-"\u0b48",
+         "\u0b4b"-"\u0b4d",
+         "\u0b56"-"\u0b57",
+         "\u0b5c"-"\u0b5d",
+         "\u0b5f"-"\u0b61",
+         "\u0b66"-"\u0b6f",
+         "\u0b82"-"\u0b83",
+         "\u0b85"-"\u0b8a",
+         "\u0b8e"-"\u0b90",
+         "\u0b92"-"\u0b95",
+         "\u0b99"-"\u0b9a",
+         "\u0b9c",
+         "\u0b9e"-"\u0b9f",
+         "\u0ba3"-"\u0ba4",
+         "\u0ba8"-"\u0baa",
+         "\u0bae"-"\u0bb5",
+         "\u0bb7"-"\u0bb9",
+         "\u0bbe"-"\u0bc2",
+         "\u0bc6"-"\u0bc8",
+         "\u0bca"-"\u0bcd",
+         "\u0bd7",
+         "\u0be7"-"\u0bef",
+         "\u0c01"-"\u0c03",
+         "\u0c05"-"\u0c0c",
+         "\u0c0e"-"\u0c10",
+         "\u0c12"-"\u0c28",
+         "\u0c2a"-"\u0c33",
+         "\u0c35"-"\u0c39",
+         "\u0c3e"-"\u0c44",
+         "\u0c46"-"\u0c48",
+         "\u0c4a"-"\u0c4d",
+         "\u0c55"-"\u0c56",
+         "\u0c60"-"\u0c61",
+         "\u0c66"-"\u0c6f",
+         "\u0c82"-"\u0c83",
+         "\u0c85"-"\u0c8c",
+         "\u0c8e"-"\u0c90",
+         "\u0c92"-"\u0ca8",
+         "\u0caa"-"\u0cb3",
+         "\u0cb5"-"\u0cb9",
+         "\u0cbe"-"\u0cc4",
+         "\u0cc6"-"\u0cc8",
+         "\u0cca"-"\u0ccd",
+         "\u0cd5"-"\u0cd6",
+         "\u0cde",
+         "\u0ce0"-"\u0ce1",
+         "\u0ce6"-"\u0cef",
+         "\u0d02"-"\u0d03",
+         "\u0d05"-"\u0d0c",
+         "\u0d0e"-"\u0d10",
+         "\u0d12"-"\u0d28",
+         "\u0d2a"-"\u0d39",
+         "\u0d3e"-"\u0d43",
+         "\u0d46"-"\u0d48",
+         "\u0d4a"-"\u0d4d",
+         "\u0d57",
+         "\u0d60"-"\u0d61",
+         "\u0d66"-"\u0d6f",
+         "\u0d82"-"\u0d83",
+         "\u0d85"-"\u0d96",
+         "\u0d9a"-"\u0db1",
+         "\u0db3"-"\u0dbb",
+         "\u0dbd",
+         "\u0dc0"-"\u0dc6",
+         "\u0dca",
+         "\u0dcf"-"\u0dd4",
+         "\u0dd6",
+         "\u0dd8"-"\u0ddf",
+         "\u0df2"-"\u0df3",
+         "\u0e01"-"\u0e3a",
+         "\u0e3f"-"\u0e4e",
+         "\u0e50"-"\u0e59",
+         "\u0e81"-"\u0e82",
+         "\u0e84",
+         "\u0e87"-"\u0e88",
+         "\u0e8a",
+         "\u0e8d",
+         "\u0e94"-"\u0e97",
+         "\u0e99"-"\u0e9f",
+         "\u0ea1"-"\u0ea3",
+         "\u0ea5",
+         "\u0ea7",
+         "\u0eaa"-"\u0eab",
+         "\u0ead"-"\u0eb9",
+         "\u0ebb"-"\u0ebd",
+         "\u0ec0"-"\u0ec4",
+         "\u0ec6",
+         "\u0ec8"-"\u0ecd",
+         "\u0ed0"-"\u0ed9",
+         "\u0edc"-"\u0edd",
+         "\u0f00",
+         "\u0f18"-"\u0f19",
+         "\u0f20"-"\u0f29",
+         "\u0f35",
+         "\u0f37",
+         "\u0f39",
+         "\u0f3e"-"\u0f47",
+         "\u0f49"-"\u0f6a",
+         "\u0f71"-"\u0f84",
+         "\u0f86"-"\u0f8b",
+         "\u0f90"-"\u0f97",
+         "\u0f99"-"\u0fbc",
+         "\u0fc6",
+         "\u1000"-"\u1021",
+         "\u1023"-"\u1027",
+         "\u1029"-"\u102a",
+         "\u102c"-"\u1032",
+         "\u1036"-"\u1039",
+         "\u1040"-"\u1049",
+         "\u1050"-"\u1059",
+         "\u10a0"-"\u10c5",
+         "\u10d0"-"\u10f6",
+         "\u1100"-"\u1159",
+         "\u115f"-"\u11a2",
+         "\u11a8"-"\u11f9",
+         "\u1200"-"\u1206",
+         "\u1208"-"\u1246",
+         "\u1248",
+         "\u124a"-"\u124d",
+         "\u1250"-"\u1256",
+         "\u1258",
+         "\u125a"-"\u125d",
+         "\u1260"-"\u1286",
+         "\u1288",
+         "\u128a"-"\u128d",
+         "\u1290"-"\u12ae",
+         "\u12b0",
+         "\u12b2"-"\u12b5",
+         "\u12b8"-"\u12be",
+         "\u12c0",
+         "\u12c2"-"\u12c5",
+         "\u12c8"-"\u12ce",
+         "\u12d0"-"\u12d6",
+         "\u12d8"-"\u12ee",
+         "\u12f0"-"\u130e",
+         "\u1310",
+         "\u1312"-"\u1315",
+         "\u1318"-"\u131e",
+         "\u1320"-"\u1346",
+         "\u1348"-"\u135a",
+         "\u1369"-"\u1371",
+         "\u13a0"-"\u13f4",
+         "\u1401"-"\u166c",
+         "\u166f"-"\u1676",
+         "\u1681"-"\u169a",
+         "\u16a0"-"\u16ea",
+         "\u1780"-"\u17d3",
+         "\u17db",
+         "\u17e0"-"\u17e9",
+         "\u180b"-"\u180e",
+         "\u1810"-"\u1819",
+         "\u1820"-"\u1877",
+         "\u1880"-"\u18a9",
+         "\u1e00"-"\u1e9b",
+         "\u1ea0"-"\u1ef9",
+         "\u1f00"-"\u1f15",
+         "\u1f18"-"\u1f1d",
+         "\u1f20"-"\u1f45",
+         "\u1f48"-"\u1f4d",
+         "\u1f50"-"\u1f57",
+         "\u1f59",
+         "\u1f5b",
+         "\u1f5d",
+         "\u1f5f"-"\u1f7d",
+         "\u1f80"-"\u1fb4",
+         "\u1fb6"-"\u1fbc",
+         "\u1fbe",
+         "\u1fc2"-"\u1fc4",
+         "\u1fc6"-"\u1fcc",
+         "\u1fd0"-"\u1fd3",
+         "\u1fd6"-"\u1fdb",
+         "\u1fe0"-"\u1fec",
+         "\u1ff2"-"\u1ff4",
+         "\u1ff6"-"\u1ffc",
+         "\u200c"-"\u200f",
+         "\u202a"-"\u202e",
+         "\u203f"-"\u2040",
+         "\u206a"-"\u206f",
+         "\u207f",
+         "\u20a0"-"\u20af",
+         "\u20d0"-"\u20dc",
+         "\u20e1",
+         "\u2102",
+         "\u2107",
+         "\u210a"-"\u2113",
+         "\u2115",
+         "\u2119"-"\u211d",
+         "\u2124",
+         "\u2126",
+         "\u2128",
+         "\u212a"-"\u212d",
+         "\u212f"-"\u2131",
+         "\u2133"-"\u2139",
+         "\u2160"-"\u2183",
+         "\u3005"-"\u3007",
+         "\u3021"-"\u302f",
+         "\u3031"-"\u3035",
+         "\u3038"-"\u303a",
+         "\u3041"-"\u3094",
+         "\u3099"-"\u309a",
+         "\u309d"-"\u309e",
+         "\u30a1"-"\u30fe",
+         "\u3105"-"\u312c",
+         "\u3131"-"\u318e",
+         "\u31a0"-"\u31b7",
+         "\u3400"-"\u4db5",
+         "\u4e00"-"\u9fa5",
+         "\ua000"-"\ua48c",
+         "\uac00"-"\ud7a3",
+         "\uf900"-"\ufa2d",
+         "\ufb00"-"\ufb06",
+         "\ufb13"-"\ufb17",
+         "\ufb1d"-"\ufb28",
+         "\ufb2a"-"\ufb36",
+         "\ufb38"-"\ufb3c",
+         "\ufb3e",
+         "\ufb40"-"\ufb41",
+         "\ufb43"-"\ufb44",
+         "\ufb46"-"\ufbb1",
+         "\ufbd3"-"\ufd3d",
+         "\ufd50"-"\ufd8f",
+         "\ufd92"-"\ufdc7",
+         "\ufdf0"-"\ufdfb",
+         "\ufe20"-"\ufe23",
+         "\ufe33"-"\ufe34",
+         "\ufe4d"-"\ufe4f",
+         "\ufe69",
+         "\ufe70"-"\ufe72",
+         "\ufe74",
+         "\ufe76"-"\ufefc",
+         "\ufeff",
+         "\uff04",
+         "\uff10"-"\uff19",
+         "\uff21"-"\uff3a",
+         "\uff3f",
+         "\uff41"-"\uff5a",
+         "\uff65"-"\uffbe",
+         "\uffc2"-"\uffc7",
+         "\uffca"-"\uffcf",
+         "\uffd2"-"\uffd7",
+         "\uffda"-"\uffdc",
+         "\uffe0"-"\uffe1",
+         "\uffe5"-"\uffe6",
+         "\ufff9"-"\ufffb"
+      ]
+  >
+}
+
+/* SEPARATORS */
+
+TOKEN :
+{
+  < LPAREN: "(" >
+| < RPAREN: ")" >
+| < LBRACE: "{" >
+| < RBRACE: "}" >
+| < LBRACKET: "[" >
+| < RBRACKET: "]" >
+| < SEMICOLON: ";" >
+| < COMMA: "," >
+| < DOT: "." >
+| < AT: "@" >
+}
+
+/* OPERATORS */
+
+TOKEN :
+{
+  < ASSIGN: "=" >
+| < LT: "<" >
+| < BANG: "!" >
+| < TILDE: "~" >
+| < HOOK: "?" >
+| < COLON: ":" >
+| < EQ: "==" >
+| < LE: "<=" >
+| < GE: ">=" >
+| < NE: "!=" >
+| < SC_OR: "||" >
+| < SC_AND: "&&" >
+| < INCR: "++" >
+| < DECR: "--" >
+| < PLUS: "+" >
+| < MINUS: "-" >
+| < STAR: "*" >
+| < SLASH: "/" >
+| < BIT_AND: "&" >
+| < BIT_OR: "|" >
+| < XOR: "^" >
+| < REM: "%" >
+| < LSHIFT: "<<" >
+| < PLUSASSIGN: "+=" >
+| < MINUSASSIGN: "-=" >
+| < STARASSIGN: "*=" >
+| < SLASHASSIGN: "/=" >
+| < ANDASSIGN: "&=" >
+| < ORASSIGN: "|=" >
+| < XORASSIGN: "^=" >
+| < REMASSIGN: "%=" >
+| < LSHIFTASSIGN: "<<=" >
+| < RSIGNEDSHIFTASSIGN: ">>=" >
+| < RUNSIGNEDSHIFTASSIGN: ">>>=" >
+| < ELLIPSIS: "..." >
+}
+
+/* >'s need special attention due to generics syntax. */
+TOKEN :
+{
+  < RUNSIGNEDSHIFT: ">>>" >
+  {
+     matchedToken.kind = GT;
+     ((GTToken)matchedToken).realKind = RUNSIGNEDSHIFT;
+     input_stream.backup(2);
+     matchedToken.image = ">";
+  }
+| < RSIGNEDSHIFT: ">>" >
+  {
+     matchedToken.kind = GT;
+     ((GTToken)matchedToken).realKind = RSIGNEDSHIFT;
+     input_stream.backup(1);
+     matchedToken.image = ">";
+  }
+| < GT: ">" >
+}
+
+
+/*****************************************
+ * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
+ *****************************************/
+
+/*
+ * Program structuring syntax follows.
+ */
+
+void CompilationUnit():
+{}
+{
+  [ LOOKAHEAD( ( Annotation() )* "package" ) PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( TypeDeclaration() )*
+  ( < "\u001a" > )?
+  ( <STUFF_TO_IGNORE: ~[]> )?
+  <EOF>
+}
+
+void PackageDeclaration():
+{}
+{
+  Modifiers() "package" Name() ";"
+}
+
+void ImportUnit():
+{}
+{
+  [ PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )* 
+  ( "class" | "interface" )
+}
+
+void ImportDeclaration():
+{}
+{
+  "import" [ "static" ] Name() [ "." "*" ] ";"
+}
+
+/*
+ * Modifiers. We match all modifiers in a single rule to reduce the chances of
+ * syntax errors for simple modifier mistakes. It will also enable us to give
+ * better error messages.
+ */
+
+int Modifiers():
+{
+   int modifiers = 0;
+}
+{
+ (
+  LOOKAHEAD(2)
+  (
+   "public" { modifiers |= ModifierSet.PUBLIC; }
+  |
+   "static" { modifiers |= ModifierSet.STATIC; }
+  |
+   "protected" { modifiers |= ModifierSet.PROTECTED; }
+  |
+   "private" { modifiers |= ModifierSet.PRIVATE; }
+  |
+   "final" { modifiers |= ModifierSet.FINAL; }
+  |
+   "abstract" { modifiers |= ModifierSet.ABSTRACT; }
+  |
+   "synchronized" { modifiers |= ModifierSet.SYNCHRONIZED; }
+  |
+   "native" { modifiers |= ModifierSet.NATIVE; }
+  |
+   "transient" { modifiers |= ModifierSet.TRANSIENT; }
+  |
+   "volatile" { modifiers |= ModifierSet.VOLATILE; }
+  |
+   "strictfp" { modifiers |= ModifierSet.STRICTFP; }
+  |
+   Annotation()
+  )
+ )*
+
+ {
+    return modifiers;
+ }
+}
+
+/*
+ * Declaration syntax follows.
+ */
+void TypeDeclaration():
+{
+   int modifiers;
+}
+{
+  ";"
+|
+  modifiers = Modifiers()
+  (
+     ClassOrInterfaceDeclaration(modifiers)
+   |
+     EnumDeclaration(modifiers)
+   |
+     AnnotationTypeDeclaration(modifiers)
+  )
+}
+
+
+void ClassOrInterfaceDeclaration(int modifiers):
+{
+   boolean isInterface = false;
+}
+{
+  ( "class" | "interface" { isInterface = true; } )
+  <IDENTIFIER>
+  [ TypeParameters() ]
+  [ ExtendsList(isInterface) ]
+  [ ImplementsList(isInterface) ]
+  ClassOrInterfaceBody(isInterface)
+}
+
+void ExtendsList(boolean isInterface):
+{
+   boolean extendsMoreThanOne = false;
+}
+{
+   "extends" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() { extendsMoreThanOne = true; } )*
+   {
+      if (extendsMoreThanOne && !isInterface)
+         throw new ParseException("A class cannot extend more than one other class");
+   }
+}
+
+void ImplementsList(boolean isInterface):
+{}
+{
+   "implements" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() )*
+   {
+      if (isInterface)
+         throw new ParseException("An interface cannot implement other interfaces");
+   }
+}
+
+void EnumDeclaration(int modifiers):
+{}
+{
+  "enum" <IDENTIFIER>
+  [ ImplementsList(false) ]
+  EnumBody()
+}
+
+void EnumBody():
+{}
+{
+   "{"
+   [ EnumConstant() ( LOOKAHEAD(2) "," EnumConstant() )* ]
+	[ "," ]
+   [ ";" ( ClassOrInterfaceBodyDeclaration(false) )* ]
+   "}"
+}
+
+void EnumConstant():
+{}
+{
+  Modifiers() <IDENTIFIER> [ Arguments() ] [ ClassOrInterfaceBody(false) ]
+}
+
+void TypeParameters():
+{}
+{
+   "<" TypeParameter() ( "," TypeParameter() )* ">"
+}
+
+void TypeParameter():
+{}
+{
+   <IDENTIFIER> [ TypeBound() ]
+}
+
+void TypeBound():
+{}
+{
+   "extends" ClassOrInterfaceType() ( "&" ClassOrInterfaceType() )*
+}
+
+void ClassOrInterfaceBody(boolean isInterface):
+{}
+{
+  "{" ( ClassOrInterfaceBodyDeclaration(isInterface) )* "}"
+}
+
+void ClassOrInterfaceBodyDeclaration(boolean isInterface):
+{
+   boolean isNestedInterface = false;
+   int modifiers;
+}
+{
+  LOOKAHEAD(2)
+  Initializer()
+  {
+     if (isInterface)
+        throw new ParseException("An interface cannot have initializers");
+  }
+|
+  modifiers = Modifiers() // Just get all the modifiers out of the way. If you want to do
+              // more checks, pass the modifiers down to the member
+  (
+      ClassOrInterfaceDeclaration(modifiers)
+    |
+      EnumDeclaration(modifiers)
+    |
+      LOOKAHEAD( [ TypeParameters() ] <IDENTIFIER> "(" )
+      ConstructorDeclaration()
+    |
+      LOOKAHEAD( Type() <IDENTIFIER> ( "[" "]" )* ( "," | "=" | ";" ) )
+      FieldDeclaration(modifiers)
+    |
+      MethodDeclaration(modifiers)
+  )
+|
+  ";"
+}
+
+void FieldDeclaration(int modifiers):
+{}
+{
+  // Modifiers are already matched in the caller
+  Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"
+}
+
+void VariableDeclarator():
+{}
+{
+  VariableDeclaratorId() [ "=" VariableInitializer() ]
+}
+
+void VariableDeclaratorId():
+{}
+{
+  <IDENTIFIER> ( "[" "]" )*
+}
+
+void VariableInitializer():
+{}
+{
+  ArrayInitializer()
+|
+  Expression()
+}
+
+void ArrayInitializer():
+{}
+{
+  "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}"
+}
+
+void MethodDeclaration(int modifiers):
+{}
+{
+  // Modifiers already matched in the caller!
+  [ TypeParameters() ]
+  ResultType()
+  MethodDeclarator() [ "throws" NameList() ]
+  ( Block() | ";" )
+}
+
+void MethodDeclarator():
+{}
+{
+  <IDENTIFIER> FormalParameters() ( "[" "]" )*
+}
+
+void FormalParameters():
+{}
+{
+  "(" [ FormalParameter() ( "," FormalParameter() )* ] ")"
+}
+
+void FormalParameter():
+{}
+{
+  Modifiers() Type() [ "..." ] VariableDeclaratorId()
+}
+
+void ConstructorDeclaration():
+{}
+{
+  [ TypeParameters() ]
+  // Modifiers matched in the caller
+  <IDENTIFIER> FormalParameters() [ "throws" NameList() ]
+  "{"
+    [ LOOKAHEAD(ExplicitConstructorInvocation())
+         ExplicitConstructorInvocation()
+    ]
+    ( BlockStatement() )*
+  "}"
+}
+
+void ExplicitConstructorInvocation():
+{}
+{
+  ( <IDENTIFIER> "." )* [ LOOKAHEAD(2) "this" "." ]
+  [ TypeArguments() ] ("this"|"super") Arguments() ";"
+}
+
+void Initializer():
+{}
+{
+  [ "static" ] Block()
+}
+
+
+/*
+ * Type, name and expression syntax follows.
+ */
+
+void Type():
+{}
+{
+   LOOKAHEAD(2) ReferenceType()
+ |
+   PrimitiveType()
+}
+
+void ReferenceType():
+{}
+{
+   PrimitiveType() ( LOOKAHEAD(2) "[" "]" )+
+  |
+   ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" )*
+}
+
+void ClassOrInterfaceType():
+{}
+{
+  <IDENTIFIER> [ LOOKAHEAD(2) TypeArguments() ]
+  ( LOOKAHEAD(2) "." <IDENTIFIER> [ LOOKAHEAD(2) TypeArguments() ] )*
+}
+
+void TypeArguments():
+{}
+{
+   "<" TypeArgument() ( "," TypeArgument() )* ">"
+}
+
+void TypeArgument():
+{}
+{
+   ReferenceType()
+ |
+   "?" [ WildcardBounds() ]
+}
+
+void WildcardBounds():
+{}
+{
+   "extends" ReferenceType()
+ |
+   "super" ReferenceType()
+}
+
+
+void PrimitiveType():
+{}
+{
+  "boolean"
+|
+  "char"
+|
+  "byte"
+|
+  "short"
+|
+  "int"
+|
+  "long"
+|
+  "float"
+|
+  "double"
+}
+
+void ResultType():
+{}
+{
+  "void"
+|
+  Type()
+}
+
+void Name():
+/*
+ * A lookahead of 2 is required below since "Name" can be followed
+ * by a ".*" when used in the context of an "ImportDeclaration".
+ */
+{}
+{
+  <IDENTIFIER>
+  ( LOOKAHEAD(2) "." <IDENTIFIER>
+  )*
+}
+
+void NameList():
+{}
+{
+  Name() ( "," Name() )*
+}
+
+
+/*
+ * Expression syntax follows.
+ */
+
+void Expression():
+/*
+ * This expansion has been written this way instead of:
+ *   Assignment() | ConditionalExpression()
+ * for performance reasons.
+ * However, it is a weakening of the grammar for it allows the LHS of
+ * assignments to be any conditional expression whereas it can only be
+ * a primary expression.  Consider adding a semantic predicate to work
+ * around this.
+ */
+{}
+{
+  ConditionalExpression()
+  [
+    LOOKAHEAD(2)
+    AssignmentOperator() Expression()
+  ]
+}
+
+void AssignmentOperator():
+{}
+{
+  "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|="
+}
+
+void ConditionalExpression():
+{}
+{
+  ConditionalOrExpression() [ "?" Expression() ":" Expression() ]
+}
+
+void ConditionalOrExpression():
+{}
+{
+  ConditionalAndExpression() ( "||" ConditionalAndExpression() )*
+}
+
+void ConditionalAndExpression():
+{}
+{
+  InclusiveOrExpression() ( "&&" InclusiveOrExpression() )*
+}
+
+void InclusiveOrExpression():
+{}
+{
+  ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )*
+}
+
+void ExclusiveOrExpression():
+{}
+{
+  AndExpression() ( "^" AndExpression() )*
+}
+
+void AndExpression():
+{}
+{
+  EqualityExpression() ( "&" EqualityExpression() )*
+}
+
+void EqualityExpression():
+{}
+{
+  InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )*
+}
+
+void InstanceOfExpression():
+{}
+{
+  RelationalExpression() [ "instanceof" Type() ]
+}
+
+void RelationalExpression():
+{}
+{
+  ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )*
+}
+
+void ShiftExpression():
+{}
+{
+  AdditiveExpression() ( ( "<<" | RSIGNEDSHIFT() | RUNSIGNEDSHIFT() ) AdditiveExpression() )*
+}
+
+void AdditiveExpression():
+{}
+{
+  MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )*
+}
+
+void MultiplicativeExpression():
+{}
+{
+  UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )*
+}
+
+void UnaryExpression():
+{}
+{
+  ( "+" | "-" ) UnaryExpression()
+|
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  UnaryExpressionNotPlusMinus()
+}
+
+void PreIncrementExpression():
+{}
+{
+  "++" PrimaryExpression()
+}
+
+void PreDecrementExpression():
+{}
+{
+  "--" PrimaryExpression()
+}
+
+void UnaryExpressionNotPlusMinus():
+{}
+{
+  ( "~" | "!" ) UnaryExpression()
+|
+  LOOKAHEAD( CastLookahead() )
+  CastExpression()
+|
+  PostfixExpression()
+}
+
+// This production is to determine lookahead only.  The LOOKAHEAD specifications
+// below are not used, but they are there just to indicate that we know about
+// this.
+void CastLookahead():
+{}
+{
+  LOOKAHEAD(2)
+  "(" PrimitiveType()
+|
+  LOOKAHEAD("(" Type() "[")
+  "(" Type() "[" "]"
+|
+  "(" Type() ")" ( "~" | "!" | "(" | <IDENTIFIER> | "this" | "super" | "new" | Literal() )
+}
+
+void PostfixExpression():
+{}
+{
+  PrimaryExpression() [ "++" | "--" ]
+}
+
+void CastExpression():
+{}
+{
+  LOOKAHEAD("(" PrimitiveType())
+  "(" Type() ")" UnaryExpression()
+|
+  "(" Type() ")" UnaryExpressionNotPlusMinus()
+}
+
+void PrimaryExpression():
+{}
+{
+  PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )*
+}
+
+void MemberSelector():
+{}
+{
+  "." TypeArguments() <IDENTIFIER>
+}
+
+void PrimaryPrefix():
+{}
+{
+  Literal()
+|
+  LOOKAHEAD( ( <IDENTIFIER> "." )* "this" )
+  ( <IDENTIFIER> "." )*
+  "this"
+|
+  "super" "." <IDENTIFIER>
+|
+  "(" Expression() ")"
+|
+  AllocationExpression()
+|
+  LOOKAHEAD( ResultType() "." "class" )
+  ResultType() "." "class"
+|
+  Name()
+}
+
+void PrimarySuffix():
+{}
+{
+  LOOKAHEAD("." "super" ".")
+  "." "super"
+|
+  LOOKAHEAD("." "this")
+  "." "this"
+|
+  LOOKAHEAD(2)
+  "." AllocationExpression()
+|
+  LOOKAHEAD(3)
+  MemberSelector()
+|
+  "[" Expression() "]"
+|
+  "." <IDENTIFIER>
+|
+  Arguments()
+}
+
+void Literal():
+{}
+{
+  <INTEGER_LITERAL>
+|
+  <FLOATING_POINT_LITERAL>
+|
+  <CHARACTER_LITERAL>
+|
+  <STRING_LITERAL>
+|
+  BooleanLiteral()
+|
+  NullLiteral()
+}
+
+void BooleanLiteral():
+{}
+{
+  "true"
+|
+  "false"
+}
+
+void NullLiteral():
+{}
+{
+  "null"
+}
+
+void Arguments():
+{}
+{
+  "(" [ ArgumentList() ] ")"
+}
+
+void ArgumentList():
+{}
+{
+  Expression() ( "," Expression() )*
+}
+
+void AllocationExpression():
+{}
+{
+  LOOKAHEAD(2)
+  "new" PrimitiveType() ArrayDimsAndInits()
+|
+  "new" ClassOrInterfaceType() [ TypeArguments() ]
+    (
+      ArrayDimsAndInits()
+    |
+      Arguments() [ ClassOrInterfaceBody(false) ]
+    )
+}
+
+/*
+ * The third LOOKAHEAD specification below is to parse to PrimarySuffix
+ * if there is an expression between the "[...]".
+ */
+void ArrayDimsAndInits():
+{}
+{
+  LOOKAHEAD(2)
+  ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )*
+|
+  ( "[" "]" )+ ArrayInitializer()
+}
+
+
+/*
+ * Statement syntax follows.
+ */
+
+void Statement():
+{}
+{
+  LOOKAHEAD(2)
+  LabeledStatement()
+|
+  AssertStatement()
+|
+  Block()
+|
+  EmptyStatement()
+|
+  StatementExpression() ";"
+|
+  SwitchStatement()
+|
+  IfStatement()
+|
+  WhileStatement()
+|
+  DoStatement()
+|
+  ForStatement()
+|
+  BreakStatement()
+|
+  ContinueStatement()
+|
+  ReturnStatement()
+|
+  ThrowStatement()
+|
+  SynchronizedStatement()
+|
+  TryStatement()
+}
+
+void AssertStatement():
+{}
+{
+  "assert" Expression() [ ":" Expression() ] ";"
+}
+
+void LabeledStatement():
+{}
+{
+  <IDENTIFIER> ":" Statement()
+}
+
+void Block():
+{}
+{
+  "{" ( BlockStatement() )* "}"
+}
+
+void BlockStatement():
+{}
+{
+  LOOKAHEAD( Modifiers() Type() <IDENTIFIER> )
+  LocalVariableDeclaration() ";"
+|
+  Statement()
+|
+  ClassOrInterfaceDeclaration(0)
+}
+
+void LocalVariableDeclaration():
+{}
+{
+  Modifiers() Type() VariableDeclarator() ( "," VariableDeclarator() )*
+}
+
+void EmptyStatement():
+{}
+{
+  ";"
+}
+
+void StatementExpression():
+/*
+ * The last expansion of this production accepts more than the legal
+ * Java expansions for StatementExpression.  This expansion does not
+ * use PostfixExpression for performance reasons.
+ */
+{}
+{
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  PrimaryExpression()
+  [
+    "++"
+  |
+    "--"
+  |
+    AssignmentOperator() Expression()
+  ]
+}
+
+void SwitchStatement():
+{}
+{
+  "switch" "(" Expression() ")" "{"
+    ( SwitchLabel() ( BlockStatement() )* )*
+  "}"
+}
+
+void SwitchLabel():
+{}
+{
+  "case" Expression() ":"
+|
+  "default" ":"
+}
+
+void IfStatement():
+/*
+ * The disambiguating algorithm of JavaCC automatically binds dangling
+ * else's to the innermost if statement.  The LOOKAHEAD specification
+ * is to tell JavaCC that we know what we are doing.
+ */
+{}
+{
+  "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ]
+}
+
+void WhileStatement():
+{}
+{
+  "while" "(" Expression() ")" Statement()
+}
+
+void DoStatement():
+{}
+{
+  "do" Statement() "while" "(" Expression() ")" ";"
+}
+
+void ForStatement():
+{}
+{
+  "for" "("
+
+  (
+      LOOKAHEAD(Modifiers() Type() <IDENTIFIER> ":")
+      Modifiers() Type() <IDENTIFIER> ":" Expression() 
+    |
+     [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ]
+  )
+
+  ")" Statement()
+}
+
+void ForInit():
+{}
+{
+  LOOKAHEAD( Modifiers() Type() <IDENTIFIER> )
+  LocalVariableDeclaration()
+|
+  StatementExpressionList()
+}
+
+void StatementExpressionList():
+{}
+{
+  StatementExpression() ( "," StatementExpression() )*
+}
+
+void ForUpdate():
+{}
+{
+  StatementExpressionList()
+}
+
+void BreakStatement():
+{}
+{
+  "break" [ <IDENTIFIER> ] ";"
+}
+
+void ContinueStatement():
+{}
+{
+  "continue" [ <IDENTIFIER> ] ";"
+}
+
+void ReturnStatement():
+{}
+{
+  "return" [ Expression() ] ";"
+}
+
+void ThrowStatement():
+{}
+{
+  "throw" Expression() ";"
+}
+
+void SynchronizedStatement():
+{}
+{
+  "synchronized" "(" Expression() ")" Block()
+}
+
+void TryStatement():
+/*
+ * Semantic check required here to make sure that at least one
+ * finally/catch is present.
+ */
+{}
+{
+  "try" Block()
+  ( "catch" "(" FormalParameter() ")" Block() )*
+  [ "finally" Block() ]
+}
+
+/* We use productions to match >>>, >> and > so that we can keep the
+ * type declaration syntax with generics clean
+ */
+
+void RUNSIGNEDSHIFT():
+{}
+{
+  ( LOOKAHEAD({ getToken(1).kind == GT &&
+                ((GTToken)getToken(1)).realKind == RUNSIGNEDSHIFT} )
+   ">" ">" ">"
+  )
+}
+
+void RSIGNEDSHIFT():
+{}
+{
+  ( LOOKAHEAD({ getToken(1).kind == GT &&
+                ((GTToken)getToken(1)).realKind == RSIGNEDSHIFT} )
+  ">" ">"
+  )
+}
+
+/* Annotation syntax follows. */
+
+void Annotation():
+{}
+{
+   LOOKAHEAD( "@" Name() "(" ( <IDENTIFIER> "=" | ")" ))
+   NormalAnnotation()
+ |
+   LOOKAHEAD( "@" Name() "(" )
+   SingleMemberAnnotation()
+ |
+   MarkerAnnotation()
+}
+
+void NormalAnnotation():
+{}
+{
+   "@" Name() "(" [ MemberValuePairs() ] ")"
+}
+
+void MarkerAnnotation():
+{}
+{
+  "@" Name()
+}
+
+void SingleMemberAnnotation():
+{}
+{
+  "@" Name() "(" MemberValue() ")"
+}
+
+void MemberValuePairs():
+{}
+{
+   MemberValuePair() ( "," MemberValuePair() )*
+}
+
+void MemberValuePair():
+{}
+{
+    <IDENTIFIER> "=" MemberValue()
+}
+
+void MemberValue():
+{}
+{
+   Annotation()
+ |
+   MemberValueArrayInitializer()
+ |
+   ConditionalExpression()
+}
+
+void  MemberValueArrayInitializer():
+{}
+{
+  "{" MemberValue() ( LOOKAHEAD(2) "," MemberValue() )* [ "," ] "}"
+}
+
+
+/* Annotation Types. */
+
+void AnnotationTypeDeclaration(int modifiers):
+{}
+{
+  "@" "interface" <IDENTIFIER> AnnotationTypeBody()
+}
+
+void AnnotationTypeBody():
+{}
+{
+  "{" ( AnnotationTypeMemberDeclaration() )* "}"
+}
+
+void AnnotationTypeMemberDeclaration():
+{
+   int modifiers;
+}
+{
+ modifiers = Modifiers()
+ (
+   LOOKAHEAD(Type() <IDENTIFIER> "(")
+   Type() <IDENTIFIER> "(" ")" [ DefaultValue() ] ";"
+  |
+   ClassOrInterfaceDeclaration(modifiers)
+  |
+   EnumDeclaration(modifiers)
+  |
+   AnnotationTypeDeclaration(modifiers)
+  |
+   FieldDeclaration(modifiers)
+ )
+ |
+   ( ";" )
+}
+
+void DefaultValue():
+{}
+{
+  "default" MemberValue()
+}
diff --git a/cobertura/src/main/javacc/java1.5/debug/GTToken.java b/cobertura/src/main/javacc/java1.5/debug/GTToken.java
new file mode 100644
index 0000000..22bbbdf
--- /dev/null
+++ b/cobertura/src/main/javacc/java1.5/debug/GTToken.java
@@ -0,0 +1,5 @@
+package net.sourceforge.cobertura.javancss.parser.java15.debug;
+
+public class GTToken extends Token {
+  int realKind = JavaParser15DebugConstants.GT;
+}
diff --git a/cobertura/src/main/javacc/java1.5/debug/JavaDebug1.5.jj b/cobertura/src/main/javacc/java1.5/debug/JavaDebug1.5.jj
new file mode 100644
index 0000000..e3181c3
--- /dev/null
+++ b/cobertura/src/main/javacc/java1.5/debug/JavaDebug1.5.jj
@@ -0,0 +1,2237 @@
+
+/*
+ * Copyright © 2002 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * California 95054, U.S.A. All rights reserved.  Sun Microsystems, Inc. has
+ * intellectual property rights relating to technology embodied in the product
+ * that is described in this document. In particular, and without limitation,
+ * these intellectual property rights may include one or more of the U.S.
+ * patents listed at http://www.sun.com/patents and one or more additional
+ * patents or pending patent applications in the U.S. and in other countries.
+ * U.S. Government Rights - Commercial software. Government users are subject
+ * to the Sun Microsystems, Inc. standard license agreement and applicable
+ * provisions of the FAR and its supplements.  Use is subject to license terms.
+ * Sun,  Sun Microsystems,  the Sun logo and  Java are trademarks or registered
+ * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.  This
+ * product is covered and controlled by U.S. Export Control laws and may be
+ * subject to the export or import laws in other countries.  Nuclear, missile,
+ * chemical biological weapons or nuclear maritime end uses or end users,
+ * whether direct or indirect, are strictly prohibited.  Export or reexport
+ * to countries subject to U.S. embargo or to entities identified on U.S.
+ * export exclusion lists, including, but not limited to, the denied persons
+ * and specially designated nationals lists is strictly prohibited.
+ */
+
+options {
+  JAVA_UNICODE_ESCAPE = true;
+  ERROR_REPORTING = false;
+  STATIC = false;
+  JDK_VERSION = "1.5";
+  //*
+  DEBUG_PARSER = true;
+  // */
+}
+
+PARSER_BEGIN(JavaParser15Debug)
+
+package net.sourceforge.cobertura.javancss.parser.java15.debug;
+
+import java.io.*;
+
+import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
+import java.util.*;
+
+import net.sourceforge.cobertura.javancss.FunctionMetric;
+import net.sourceforge.cobertura.javancss.ObjectMetric;
+import net.sourceforge.cobertura.javancss.PackageMetric;
+
+/**
+ * Grammar to parse Java version 1.5
+ * @author Sreenivasa Viswanadha - Simplified and enhanced for 1.5
+ */
+public class JavaParser15Debug implements JavaParserInterface
+{
+    private boolean _bReturn         = false;
+    private int     _ncss            = 0;     // general counter
+    private int     _loc             = 0;
+    private int     _cyc             = 1;
+    private int     _localCases      = 0;
+    private String  _sName           = "";    // name of last token
+    private String  _sParameter      = "";
+    private String  _sPackage        = "";
+    private String  _sClass          = "";
+    private String  _sFunction       = "";
+    private int     _functions       = 0;     // number of functions in this class
+    //private int     _topLevelClasses = 0;
+    private int     _classes         = 0;
+    private int     _classLevel      = 0;
+    private int     _anonClassCount  = 1;
+
+    private int     _jvdcLines = 0;           // added by SMS
+    private int     _jvdc      = 0;
+    private boolean _bPrivate  = true;//false;        // added by SMS
+    private boolean _bPublic   = true;        // added by SMS
+
+    /**
+     * For each class the number of formal
+     * comments in toplevel methods, constructors, inner
+     * classes, and for the class itself are counted.
+     * The top level comment has to be directly before
+     * the class definition, not before the package or
+     * import statement as it is often seen in source code
+     * examples (at the beginning of your source files you
+     * should instead put your copyright notice).
+     */ 
+    private int    _javadocs   = 0;              // global javadocs
+    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
+
+    /** 
+     * Metrics for each class/interface are stored in this
+     * vector.
+     */
+    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
+    private List _vImports = new ArrayList();
+    private Object[] _aoPackage = null;
+    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
+    private PackageMetric _pPackageMetric;
+
+    private Token _tmpToken = null;
+    /** Argh, too much of a state machine. */
+    private Token _tmpResultToken = null;
+    
+    private String _formatPackage(String sPackage_) {
+        if (sPackage_.equals("")) {
+            return ".";
+        }
+        
+        return sPackage_.substring(0, sPackage_.length() - 1);
+    }
+    
+
+    public void parse() throws Exception {
+      CompilationUnit();
+    }
+
+    public void parseImportUnit() throws Exception {
+      ImportUnit();
+    }
+
+    public int getNcss() {
+        return _ncss;
+    }
+    
+    public int getLOC() {
+        return _loc;
+    }
+
+    // added by SMS
+    public int getJvdc() {
+        return _jvdc;
+    }
+
+    /*public int getTopLevelClasses() {
+      return _topLevelClasses;
+      }*/
+    
+    public List/*<FunctionMetric>*/ getFunction() {
+        return _vFunctions;
+    }
+    
+    /**
+     * @return Top level classes in sorted order
+     */
+    public List/*<ObjectMetric>*/ getObject() {
+        Collections.sort(_vClasses);
+        return _vClasses;
+    }
+    
+    /**
+     * @return The empty package consists of the name ".".
+     */
+    public Map/*<String,PackageMetric>*/ getPackage() {
+        return _htPackage;
+    }
+    
+    public List getImports() {
+        return _vImports;
+    }
+
+    /**
+     * name, beginLine, ...
+     */
+    public Object[] getPackageObjects() {
+        return _aoPackage;
+    }
+
+    /**
+     * if javancss is used with cat *.java a long
+     * input stream might get generated, so line
+     * number information in case of an parse exception
+     * is not very useful.
+     */
+    public String getLastFunction() {
+        return _sPackage + _sClass + _sFunction;
+    }
+   /**
+    * Class to hold modifiers.
+    */
+   static public final class ModifierSet
+   {
+     /* Definitions of the bits in the modifiers field.  */
+     public static final int PUBLIC = 0x0001;
+     public static final int PROTECTED = 0x0002;
+     public static final int PRIVATE = 0x0004;
+     public static final int ABSTRACT = 0x0008;
+     public static final int STATIC = 0x0010;
+     public static final int FINAL = 0x0020;
+     public static final int SYNCHRONIZED = 0x0040;
+     public static final int NATIVE = 0x0080;
+     public static final int TRANSIENT = 0x0100;
+     public static final int VOLATILE = 0x0200;
+     public static final int STRICTFP = 0x1000;
+
+     /** A set of accessors that indicate whether the specified modifier
+         is in the set. */
+
+     public boolean isPublic(int modifiers)
+     {
+       return (modifiers & PUBLIC) != 0;
+     }
+
+     public boolean isProtected(int modifiers)
+     {
+       return (modifiers & PROTECTED) != 0;
+     }
+
+     public boolean isPrivate(int modifiers)
+     {
+       return (modifiers & PRIVATE) != 0;
+     }
+
+     public boolean isStatic(int modifiers)
+     {
+       return (modifiers & STATIC) != 0;
+     }
+
+     public boolean isAbstract(int modifiers)
+     {
+       return (modifiers & ABSTRACT) != 0;
+     }
+
+     public boolean isFinal(int modifiers)
+     {
+       return (modifiers & FINAL) != 0;
+     }
+
+     public boolean isNative(int modifiers)
+     {
+       return (modifiers & NATIVE) != 0;
+     }
+
+     public boolean isStrictfp(int modifiers)
+     {
+       return (modifiers & STRICTFP) != 0;
+     }
+
+     public boolean isSynchronized(int modifiers)
+     {
+       return (modifiers & SYNCHRONIZED) != 0;
+     }
+
+     public boolean isTransient(int modifiers)
+      {
+       return (modifiers & TRANSIENT) != 0;
+     }
+
+     public boolean isVolatile(int modifiers)
+     {
+       return (modifiers & VOLATILE) != 0;
+     }
+
+     /**
+      * Removes the given modifier.
+      */
+     static int removeModifier(int modifiers, int mod)
+     {
+        return modifiers & ~mod;
+     }
+   }
+
+   public JavaParser15Debug(String fileName)
+   {
+      this(System.in);
+      try { ReInit(new FileInputStream(new File(fileName))); }
+      catch(Exception e) { e.printStackTrace(); }
+   }
+
+  public static void main(String args[]) {
+    JavaParser15Debug parser;
+    if (args.length == 0) {
+      System.out.println("Java Parser Version 1.5:  Reading from standard input . . .");
+      parser = new JavaParser15Debug(System.in);
+    } else if (args.length == 1) {
+      System.out.println("Java Parser Version 1.5:  Reading from file " + args[0] + " . . .");
+      try {
+        parser = new JavaParser15Debug(new java.io.FileInputStream(args[0]));
+      } catch (java.io.FileNotFoundException e) {
+        System.out.println("Java Parser Version 1.5:  File " + args[0] + " not found.");
+        return;
+      }
+    } else {
+      System.out.println("Java Parser Version 1.5:  Usage is one of:");
+      System.out.println("         java javancss.parser.java15.debug.JavaParser15Debug < inputfile");
+      System.out.println("OR");
+      System.out.println("         java javancss.parser.java15.debug.JavaParser15Debug inputfile");
+      return;
+    }
+    try {
+      parser.CompilationUnit();
+      System.out.println("Java Parser Version 1.1:  Java program parsed successfully.");
+    } catch (ParseException e) {
+      System.out.println(e.getMessage());
+      System.out.println("Java Parser Version 1.1:  Encountered errors during parse.");
+    }
+  }
+
+}
+
+PARSER_END(JavaParser15Debug)
+
+/* WHITE SPACE */
+
+SKIP :
+{
+  " "
+| "\t"
+| "\n"
+| "\r"
+| "\f"
+}
+
+/* COMMENTS */
+
+MORE :
+{
+  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+|
+  "/*" : IN_MULTI_LINE_COMMENT
+}
+
+SPECIAL_TOKEN :
+{
+  <SINGLE_LINE_COMMENT: "//" (~["\n", "\r"])* ("\n" | "\r" | "\r\n")?>
+}
+
+<IN_FORMAL_COMMENT>
+SPECIAL_TOKEN :
+{
+  <FORMAL_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_MULTI_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+  <MULTI_LINE_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
+MORE :
+{
+  < ~[] >
+}
+
+/* RESERVED WORDS AND LITERALS */
+
+TOKEN :
+{
+  < ABSTRACT: "abstract" >
+| < ASSERT: "assert" >
+| < BOOLEAN: "boolean" >
+| < BREAK: "break" >
+| < BYTE: "byte" >
+| < CASE: "case" >
+| < CATCH: "catch" >
+| < CHAR: "char" >
+| < CLASS: "class" >
+| < CONST: "const" >
+| < CONTINUE: "continue" >
+| < _DEFAULT: "default" >
+| < DO: "do" >
+| < DOUBLE: "double" >
+| < ELSE: "else" >
+| < ENUM: "enum" >
+| < EXTENDS: "extends" >
+| < FALSE: "false" >
+| < FINAL: "final" >
+| < FINALLY: "finally" >
+| < FLOAT: "float" >
+| < FOR: "for" >
+| < GOTO: "goto" >
+| < IF: "if" >
+| < IMPLEMENTS: "implements" >
+| < IMPORT: "import" >
+| < INSTANCEOF: "instanceof" >
+| < INT: "int" >
+| < INTERFACE: "interface" >
+| < LONG: "long" >
+| < NATIVE: "native" >
+| < NEW: "new" >
+| < NULL: "null" >
+| < PACKAGE: "package">
+| < PRIVATE: "private" >
+| < PROTECTED: "protected" >
+| < PUBLIC: "public" >
+| < RETURN: "return" >
+| < SHORT: "short" >
+| < STATIC: "static" >
+| < STRICTFP: "strictfp" >
+| < SUPER: "super" >
+| < SWITCH: "switch" >
+| < SYNCHRONIZED: "synchronized" >
+| < THIS: "this" >
+| < THROW: "throw" >
+| < THROWS: "throws" >
+| < TRANSIENT: "transient" >
+| < TRUE: "true" >
+| < TRY: "try" >
+| < VOID: "void" >
+| < VOLATILE: "volatile" >
+| < WHILE: "while" >
+}
+
+/* LITERALS */
+
+TOKEN :
+{
+  < INTEGER_LITERAL:
+        <DECIMAL_LITERAL> (["l","L"])?
+      | <HEX_LITERAL> (["l","L"])?
+      | <OCTAL_LITERAL> (["l","L"])?
+  >
+|
+  < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
+|
+  < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
+|
+  < #OCTAL_LITERAL: "0" (["0"-"7"])* >
+|
+  < FLOATING_POINT_LITERAL:
+        <DECIMAL_FLOATING_POINT_LITERAL>
+      | <HEXADECIMAL_FLOATING_POINT_LITERAL>
+  >
+|
+  < #DECIMAL_FLOATING_POINT_LITERAL:
+        (["0"-"9"])+ "." (["0"-"9"])* (<DECIMAL_EXPONENT>)? (["f","F","d","D"])?
+      | "." (["0"-"9"])+ (<DECIMAL_EXPONENT>)? (["f","F","d","D"])?
+      | (["0"-"9"])+ <DECIMAL_EXPONENT> (["f","F","d","D"])?
+      | (["0"-"9"])+ (<DECIMAL_EXPONENT>)? ["f","F","d","D"]
+  >
+|
+  < #DECIMAL_EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+|
+  < #HEXADECIMAL_FLOATING_POINT_LITERAL:
+        "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])+ (".")? <HEXADECIMAL_EXPONENT> (["f","F","d","D"])?
+      | "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])* "." (["0"-"9","a"-"f","A"-"F"])+ <HEXADECIMAL_EXPONENT> (["f","F","d","D"])?
+  >
+|
+  < #HEXADECIMAL_EXPONENT: ["p","P"] (["+","-"])? (["0"-"9"])+ >
+|
+  < CHARACTER_LITERAL:
+      "'"
+      (   (~["'","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )
+      "'"
+  >
+|
+  < STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\""]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\""
+  >
+}
+
+/* IDENTIFIERS */
+
+TOKEN :
+{
+  < IDENTIFIER: <LETTER> (<PART_LETTER>)* >
+|
+  < #LETTER:
+      [  // all chars for which Character.isIdentifierStart is true
+         "$",
+         "A"-"Z",
+         "_",
+         "a"-"z",
+         "\u00a2"-"\u00a5",
+         "\u00aa",
+         "\u00b5",
+         "\u00ba",
+         "\u00c0"-"\u00d6",
+         "\u00d8"-"\u00f6",
+         "\u00f8"-"\u021f",
+         "\u0222"-"\u0233",
+         "\u0250"-"\u02ad",
+         "\u02b0"-"\u02b8",
+         "\u02bb"-"\u02c1",
+         "\u02d0"-"\u02d1",
+         "\u02e0"-"\u02e4",
+         "\u02ee",
+         "\u037a",
+         "\u0386",
+         "\u0388"-"\u038a",
+         "\u038c",
+         "\u038e"-"\u03a1",
+         "\u03a3"-"\u03ce",
+         "\u03d0"-"\u03d7",
+         "\u03da"-"\u03f3",
+         "\u0400"-"\u0481",
+         "\u048c"-"\u04c4",
+         "\u04c7"-"\u04c8",
+         "\u04cb"-"\u04cc",
+         "\u04d0"-"\u04f5",
+         "\u04f8"-"\u04f9",
+         "\u0531"-"\u0556",
+         "\u0559",
+         "\u0561"-"\u0587",
+         "\u05d0"-"\u05ea",
+         "\u05f0"-"\u05f2",
+         "\u0621"-"\u063a",
+         "\u0640"-"\u064a",
+         "\u0671"-"\u06d3",
+         "\u06d5",
+         "\u06e5"-"\u06e6",
+         "\u06fa"-"\u06fc",
+         "\u0710",
+         "\u0712"-"\u072c",
+         "\u0780"-"\u07a5",
+         "\u0905"-"\u0939",
+         "\u093d",
+         "\u0950",
+         "\u0958"-"\u0961",
+         "\u0985"-"\u098c",
+         "\u098f"-"\u0990",
+         "\u0993"-"\u09a8",
+         "\u09aa"-"\u09b0",
+         "\u09b2",
+         "\u09b6"-"\u09b9",
+         "\u09dc"-"\u09dd",
+         "\u09df"-"\u09e1",
+         "\u09f0"-"\u09f3",
+         "\u0a05"-"\u0a0a",
+         "\u0a0f"-"\u0a10",
+         "\u0a13"-"\u0a28",
+         "\u0a2a"-"\u0a30",
+         "\u0a32"-"\u0a33",
+         "\u0a35"-"\u0a36",
+         "\u0a38"-"\u0a39",
+         "\u0a59"-"\u0a5c",
+         "\u0a5e",
+         "\u0a72"-"\u0a74",
+         "\u0a85"-"\u0a8b",
+         "\u0a8d",
+         "\u0a8f"-"\u0a91",
+         "\u0a93"-"\u0aa8",
+         "\u0aaa"-"\u0ab0",
+         "\u0ab2"-"\u0ab3",
+         "\u0ab5"-"\u0ab9",
+         "\u0abd",
+         "\u0ad0",
+         "\u0ae0",
+         "\u0b05"-"\u0b0c",
+         "\u0b0f"-"\u0b10",
+         "\u0b13"-"\u0b28",
+         "\u0b2a"-"\u0b30",
+         "\u0b32"-"\u0b33",
+         "\u0b36"-"\u0b39",
+         "\u0b3d",
+         "\u0b5c"-"\u0b5d",
+         "\u0b5f"-"\u0b61",
+         "\u0b85"-"\u0b8a",
+         "\u0b8e"-"\u0b90",
+         "\u0b92"-"\u0b95",
+         "\u0b99"-"\u0b9a",
+         "\u0b9c",
+         "\u0b9e"-"\u0b9f",
+         "\u0ba3"-"\u0ba4",
+         "\u0ba8"-"\u0baa",
+         "\u0bae"-"\u0bb5",
+         "\u0bb7"-"\u0bb9",
+         "\u0c05"-"\u0c0c",
+         "\u0c0e"-"\u0c10",
+         "\u0c12"-"\u0c28",
+         "\u0c2a"-"\u0c33",
+         "\u0c35"-"\u0c39",
+         "\u0c60"-"\u0c61",
+         "\u0c85"-"\u0c8c",
+         "\u0c8e"-"\u0c90",
+         "\u0c92"-"\u0ca8",
+         "\u0caa"-"\u0cb3",
+         "\u0cb5"-"\u0cb9",
+         "\u0cde",
+         "\u0ce0"-"\u0ce1",
+         "\u0d05"-"\u0d0c",
+         "\u0d0e"-"\u0d10",
+         "\u0d12"-"\u0d28",
+         "\u0d2a"-"\u0d39",
+         "\u0d60"-"\u0d61",
+         "\u0d85"-"\u0d96",
+         "\u0d9a"-"\u0db1",
+         "\u0db3"-"\u0dbb",
+         "\u0dbd",
+         "\u0dc0"-"\u0dc6",
+         "\u0e01"-"\u0e30",
+         "\u0e32"-"\u0e33",
+         "\u0e3f"-"\u0e46",
+         "\u0e81"-"\u0e82",
+         "\u0e84",
+         "\u0e87"-"\u0e88",
+         "\u0e8a",
+         "\u0e8d",
+         "\u0e94"-"\u0e97",
+         "\u0e99"-"\u0e9f",
+         "\u0ea1"-"\u0ea3",
+         "\u0ea5",
+         "\u0ea7",
+         "\u0eaa"-"\u0eab",
+         "\u0ead"-"\u0eb0",
+         "\u0eb2"-"\u0eb3",
+         "\u0ebd",
+         "\u0ec0"-"\u0ec4",
+         "\u0ec6",
+         "\u0edc"-"\u0edd",
+         "\u0f00",
+         "\u0f40"-"\u0f47",
+         "\u0f49"-"\u0f6a",
+         "\u0f88"-"\u0f8b",
+         "\u1000"-"\u1021",
+         "\u1023"-"\u1027",
+         "\u1029"-"\u102a",
+         "\u1050"-"\u1055",
+         "\u10a0"-"\u10c5",
+         "\u10d0"-"\u10f6",
+         "\u1100"-"\u1159",
+         "\u115f"-"\u11a2",
+         "\u11a8"-"\u11f9",
+         "\u1200"-"\u1206",
+         "\u1208"-"\u1246",
+         "\u1248",
+         "\u124a"-"\u124d",
+         "\u1250"-"\u1256",
+         "\u1258",
+         "\u125a"-"\u125d",
+         "\u1260"-"\u1286",
+         "\u1288",
+         "\u128a"-"\u128d",
+         "\u1290"-"\u12ae",
+         "\u12b0",
+         "\u12b2"-"\u12b5",
+         "\u12b8"-"\u12be",
+         "\u12c0",
+         "\u12c2"-"\u12c5",
+         "\u12c8"-"\u12ce",
+         "\u12d0"-"\u12d6",
+         "\u12d8"-"\u12ee",
+         "\u12f0"-"\u130e",
+         "\u1310",
+         "\u1312"-"\u1315",
+         "\u1318"-"\u131e",
+         "\u1320"-"\u1346",
+         "\u1348"-"\u135a",
+         "\u13a0"-"\u13f4",
+         "\u1401"-"\u166c",
+         "\u166f"-"\u1676",
+         "\u1681"-"\u169a",
+         "\u16a0"-"\u16ea",
+         "\u1780"-"\u17b3",
+         "\u17db",
+         "\u1820"-"\u1877",
+         "\u1880"-"\u18a8",
+         "\u1e00"-"\u1e9b",
+         "\u1ea0"-"\u1ef9",
+         "\u1f00"-"\u1f15",
+         "\u1f18"-"\u1f1d",
+         "\u1f20"-"\u1f45",
+         "\u1f48"-"\u1f4d",
+         "\u1f50"-"\u1f57",
+         "\u1f59",
+         "\u1f5b",
+         "\u1f5d",
+         "\u1f5f"-"\u1f7d",
+         "\u1f80"-"\u1fb4",
+         "\u1fb6"-"\u1fbc",
+         "\u1fbe",
+         "\u1fc2"-"\u1fc4",
+         "\u1fc6"-"\u1fcc",
+         "\u1fd0"-"\u1fd3",
+         "\u1fd6"-"\u1fdb",
+         "\u1fe0"-"\u1fec",
+         "\u1ff2"-"\u1ff4",
+         "\u1ff6"-"\u1ffc",
+         "\u203f"-"\u2040",
+         "\u207f",
+         "\u20a0"-"\u20af",
+         "\u2102",
+         "\u2107",
+         "\u210a"-"\u2113",
+         "\u2115",
+         "\u2119"-"\u211d",
+         "\u2124",
+         "\u2126",
+         "\u2128",
+         "\u212a"-"\u212d",
+         "\u212f"-"\u2131",
+         "\u2133"-"\u2139",
+         "\u2160"-"\u2183",
+         "\u3005"-"\u3007",
+         "\u3021"-"\u3029",
+         "\u3031"-"\u3035",
+         "\u3038"-"\u303a",
+         "\u3041"-"\u3094",
+         "\u309d"-"\u309e",
+         "\u30a1"-"\u30fe",
+         "\u3105"-"\u312c",
+         "\u3131"-"\u318e",
+         "\u31a0"-"\u31b7",
+         "\u3400"-"\u4db5",
+         "\u4e00"-"\u9fa5",
+         "\ua000"-"\ua48c",
+         "\uac00"-"\ud7a3",
+         "\uf900"-"\ufa2d",
+         "\ufb00"-"\ufb06",
+         "\ufb13"-"\ufb17",
+         "\ufb1d",
+         "\ufb1f"-"\ufb28",
+         "\ufb2a"-"\ufb36",
+         "\ufb38"-"\ufb3c",
+         "\ufb3e",
+         "\ufb40"-"\ufb41",
+         "\ufb43"-"\ufb44",
+         "\ufb46"-"\ufbb1",
+         "\ufbd3"-"\ufd3d",
+         "\ufd50"-"\ufd8f",
+         "\ufd92"-"\ufdc7",
+         "\ufdf0"-"\ufdfb",
+         "\ufe33"-"\ufe34",
+         "\ufe4d"-"\ufe4f",
+         "\ufe69",
+         "\ufe70"-"\ufe72",
+         "\ufe74",
+         "\ufe76"-"\ufefc",
+         "\uff04",
+         "\uff21"-"\uff3a",
+         "\uff3f",
+         "\uff41"-"\uff5a",
+         "\uff65"-"\uffbe",
+         "\uffc2"-"\uffc7",
+         "\uffca"-"\uffcf",
+         "\uffd2"-"\uffd7",
+         "\uffda"-"\uffdc",
+         "\uffe0"-"\uffe1",
+         "\uffe5"-"\uffe6"
+      ]
+  >
+|
+  < #PART_LETTER:
+      [  // all chars for which Character.isIdentifierPart is true
+         "\u0000"-"\u0008",
+         "\u000e"-"\u001b",
+         "$",
+         "0"-"9",
+         "A"-"Z",
+         "_",
+         "a"-"z",
+         "\u007f"-"\u009f",
+         "\u00a2"-"\u00a5",
+         "\u00aa",
+         "\u00b5",
+         "\u00ba",
+         "\u00c0"-"\u00d6",
+         "\u00d8"-"\u00f6",
+         "\u00f8"-"\u021f",
+         "\u0222"-"\u0233",
+         "\u0250"-"\u02ad",
+         "\u02b0"-"\u02b8",
+         "\u02bb"-"\u02c1",
+         "\u02d0"-"\u02d1",
+         "\u02e0"-"\u02e4",
+         "\u02ee",
+         "\u0300"-"\u034e",
+         "\u0360"-"\u0362",
+         "\u037a",
+         "\u0386",
+         "\u0388"-"\u038a",
+         "\u038c",
+         "\u038e"-"\u03a1",
+         "\u03a3"-"\u03ce",
+         "\u03d0"-"\u03d7",
+         "\u03da"-"\u03f3",
+         "\u0400"-"\u0481",
+         "\u0483"-"\u0486",
+         "\u048c"-"\u04c4",
+         "\u04c7"-"\u04c8",
+         "\u04cb"-"\u04cc",
+         "\u04d0"-"\u04f5",
+         "\u04f8"-"\u04f9",
+         "\u0531"-"\u0556",
+         "\u0559",
+         "\u0561"-"\u0587",
+         "\u0591"-"\u05a1",
+         "\u05a3"-"\u05b9",
+         "\u05bb"-"\u05bd",
+         "\u05bf",
+         "\u05c1"-"\u05c2",
+         "\u05c4",
+         "\u05d0"-"\u05ea",
+         "\u05f0"-"\u05f2",
+         "\u0621"-"\u063a",
+         "\u0640"-"\u0655",
+         "\u0660"-"\u0669",
+         "\u0670"-"\u06d3",
+         "\u06d5"-"\u06dc",
+         "\u06df"-"\u06e8",
+         "\u06ea"-"\u06ed",
+         "\u06f0"-"\u06fc",
+         "\u070f"-"\u072c",
+         "\u0730"-"\u074a",
+         "\u0780"-"\u07b0",
+         "\u0901"-"\u0903",
+         "\u0905"-"\u0939",
+         "\u093c"-"\u094d",
+         "\u0950"-"\u0954",
+         "\u0958"-"\u0963",
+         "\u0966"-"\u096f",
+         "\u0981"-"\u0983",
+         "\u0985"-"\u098c",
+         "\u098f"-"\u0990",
+         "\u0993"-"\u09a8",
+         "\u09aa"-"\u09b0",
+         "\u09b2",
+         "\u09b6"-"\u09b9",
+         "\u09bc",
+         "\u09be"-"\u09c4",
+         "\u09c7"-"\u09c8",
+         "\u09cb"-"\u09cd",
+         "\u09d7",
+         "\u09dc"-"\u09dd",
+         "\u09df"-"\u09e3",
+         "\u09e6"-"\u09f3",
+         "\u0a02",
+         "\u0a05"-"\u0a0a",
+         "\u0a0f"-"\u0a10",
+         "\u0a13"-"\u0a28",
+         "\u0a2a"-"\u0a30",
+         "\u0a32"-"\u0a33",
+         "\u0a35"-"\u0a36",
+         "\u0a38"-"\u0a39",
+         "\u0a3c",
+         "\u0a3e"-"\u0a42",
+         "\u0a47"-"\u0a48",
+         "\u0a4b"-"\u0a4d",
+         "\u0a59"-"\u0a5c",
+         "\u0a5e",
+         "\u0a66"-"\u0a74",
+         "\u0a81"-"\u0a83",
+         "\u0a85"-"\u0a8b",
+         "\u0a8d",
+         "\u0a8f"-"\u0a91",
+         "\u0a93"-"\u0aa8",
+         "\u0aaa"-"\u0ab0",
+         "\u0ab2"-"\u0ab3",
+         "\u0ab5"-"\u0ab9",
+         "\u0abc"-"\u0ac5",
+         "\u0ac7"-"\u0ac9",
+         "\u0acb"-"\u0acd",
+         "\u0ad0",
+         "\u0ae0",
+         "\u0ae6"-"\u0aef",
+         "\u0b01"-"\u0b03",
+         "\u0b05"-"\u0b0c",
+         "\u0b0f"-"\u0b10",
+         "\u0b13"-"\u0b28",
+         "\u0b2a"-"\u0b30",
+         "\u0b32"-"\u0b33",
+         "\u0b36"-"\u0b39",
+         "\u0b3c"-"\u0b43",
+         "\u0b47"-"\u0b48",
+         "\u0b4b"-"\u0b4d",
+         "\u0b56"-"\u0b57",
+         "\u0b5c"-"\u0b5d",
+         "\u0b5f"-"\u0b61",
+         "\u0b66"-"\u0b6f",
+         "\u0b82"-"\u0b83",
+         "\u0b85"-"\u0b8a",
+         "\u0b8e"-"\u0b90",
+         "\u0b92"-"\u0b95",
+         "\u0b99"-"\u0b9a",
+         "\u0b9c",
+         "\u0b9e"-"\u0b9f",
+         "\u0ba3"-"\u0ba4",
+         "\u0ba8"-"\u0baa",
+         "\u0bae"-"\u0bb5",
+         "\u0bb7"-"\u0bb9",
+         "\u0bbe"-"\u0bc2",
+         "\u0bc6"-"\u0bc8",
+         "\u0bca"-"\u0bcd",
+         "\u0bd7",
+         "\u0be7"-"\u0bef",
+         "\u0c01"-"\u0c03",
+         "\u0c05"-"\u0c0c",
+         "\u0c0e"-"\u0c10",
+         "\u0c12"-"\u0c28",
+         "\u0c2a"-"\u0c33",
+         "\u0c35"-"\u0c39",
+         "\u0c3e"-"\u0c44",
+         "\u0c46"-"\u0c48",
+         "\u0c4a"-"\u0c4d",
+         "\u0c55"-"\u0c56",
+         "\u0c60"-"\u0c61",
+         "\u0c66"-"\u0c6f",
+         "\u0c82"-"\u0c83",
+         "\u0c85"-"\u0c8c",
+         "\u0c8e"-"\u0c90",
+         "\u0c92"-"\u0ca8",
+         "\u0caa"-"\u0cb3",
+         "\u0cb5"-"\u0cb9",
+         "\u0cbe"-"\u0cc4",
+         "\u0cc6"-"\u0cc8",
+         "\u0cca"-"\u0ccd",
+         "\u0cd5"-"\u0cd6",
+         "\u0cde",
+         "\u0ce0"-"\u0ce1",
+         "\u0ce6"-"\u0cef",
+         "\u0d02"-"\u0d03",
+         "\u0d05"-"\u0d0c",
+         "\u0d0e"-"\u0d10",
+         "\u0d12"-"\u0d28",
+         "\u0d2a"-"\u0d39",
+         "\u0d3e"-"\u0d43",
+         "\u0d46"-"\u0d48",
+         "\u0d4a"-"\u0d4d",
+         "\u0d57",
+         "\u0d60"-"\u0d61",
+         "\u0d66"-"\u0d6f",
+         "\u0d82"-"\u0d83",
+         "\u0d85"-"\u0d96",
+         "\u0d9a"-"\u0db1",
+         "\u0db3"-"\u0dbb",
+         "\u0dbd",
+         "\u0dc0"-"\u0dc6",
+         "\u0dca",
+         "\u0dcf"-"\u0dd4",
+         "\u0dd6",
+         "\u0dd8"-"\u0ddf",
+         "\u0df2"-"\u0df3",
+         "\u0e01"-"\u0e3a",
+         "\u0e3f"-"\u0e4e",
+         "\u0e50"-"\u0e59",
+         "\u0e81"-"\u0e82",
+         "\u0e84",
+         "\u0e87"-"\u0e88",
+         "\u0e8a",
+         "\u0e8d",
+         "\u0e94"-"\u0e97",
+         "\u0e99"-"\u0e9f",
+         "\u0ea1"-"\u0ea3",
+         "\u0ea5",
+         "\u0ea7",
+         "\u0eaa"-"\u0eab",
+         "\u0ead"-"\u0eb9",
+         "\u0ebb"-"\u0ebd",
+         "\u0ec0"-"\u0ec4",
+         "\u0ec6",
+         "\u0ec8"-"\u0ecd",
+         "\u0ed0"-"\u0ed9",
+         "\u0edc"-"\u0edd",
+         "\u0f00",
+         "\u0f18"-"\u0f19",
+         "\u0f20"-"\u0f29",
+         "\u0f35",
+         "\u0f37",
+         "\u0f39",
+         "\u0f3e"-"\u0f47",
+         "\u0f49"-"\u0f6a",
+         "\u0f71"-"\u0f84",
+         "\u0f86"-"\u0f8b",
+         "\u0f90"-"\u0f97",
+         "\u0f99"-"\u0fbc",
+         "\u0fc6",
+         "\u1000"-"\u1021",
+         "\u1023"-"\u1027",
+         "\u1029"-"\u102a",
+         "\u102c"-"\u1032",
+         "\u1036"-"\u1039",
+         "\u1040"-"\u1049",
+         "\u1050"-"\u1059",
+         "\u10a0"-"\u10c5",
+         "\u10d0"-"\u10f6",
+         "\u1100"-"\u1159",
+         "\u115f"-"\u11a2",
+         "\u11a8"-"\u11f9",
+         "\u1200"-"\u1206",
+         "\u1208"-"\u1246",
+         "\u1248",
+         "\u124a"-"\u124d",
+         "\u1250"-"\u1256",
+         "\u1258",
+         "\u125a"-"\u125d",
+         "\u1260"-"\u1286",
+         "\u1288",
+         "\u128a"-"\u128d",
+         "\u1290"-"\u12ae",
+         "\u12b0",
+         "\u12b2"-"\u12b5",
+         "\u12b8"-"\u12be",
+         "\u12c0",
+         "\u12c2"-"\u12c5",
+         "\u12c8"-"\u12ce",
+         "\u12d0"-"\u12d6",
+         "\u12d8"-"\u12ee",
+         "\u12f0"-"\u130e",
+         "\u1310",
+         "\u1312"-"\u1315",
+         "\u1318"-"\u131e",
+         "\u1320"-"\u1346",
+         "\u1348"-"\u135a",
+         "\u1369"-"\u1371",
+         "\u13a0"-"\u13f4",
+         "\u1401"-"\u166c",
+         "\u166f"-"\u1676",
+         "\u1681"-"\u169a",
+         "\u16a0"-"\u16ea",
+         "\u1780"-"\u17d3",
+         "\u17db",
+         "\u17e0"-"\u17e9",
+         "\u180b"-"\u180e",
+         "\u1810"-"\u1819",
+         "\u1820"-"\u1877",
+         "\u1880"-"\u18a9",
+         "\u1e00"-"\u1e9b",
+         "\u1ea0"-"\u1ef9",
+         "\u1f00"-"\u1f15",
+         "\u1f18"-"\u1f1d",
+         "\u1f20"-"\u1f45",
+         "\u1f48"-"\u1f4d",
+         "\u1f50"-"\u1f57",
+         "\u1f59",
+         "\u1f5b",
+         "\u1f5d",
+         "\u1f5f"-"\u1f7d",
+         "\u1f80"-"\u1fb4",
+         "\u1fb6"-"\u1fbc",
+         "\u1fbe",
+         "\u1fc2"-"\u1fc4",
+         "\u1fc6"-"\u1fcc",
+         "\u1fd0"-"\u1fd3",
+         "\u1fd6"-"\u1fdb",
+         "\u1fe0"-"\u1fec",
+         "\u1ff2"-"\u1ff4",
+         "\u1ff6"-"\u1ffc",
+         "\u200c"-"\u200f",
+         "\u202a"-"\u202e",
+         "\u203f"-"\u2040",
+         "\u206a"-"\u206f",
+         "\u207f",
+         "\u20a0"-"\u20af",
+         "\u20d0"-"\u20dc",
+         "\u20e1",
+         "\u2102",
+         "\u2107",
+         "\u210a"-"\u2113",
+         "\u2115",
+         "\u2119"-"\u211d",
+         "\u2124",
+         "\u2126",
+         "\u2128",
+         "\u212a"-"\u212d",
+         "\u212f"-"\u2131",
+         "\u2133"-"\u2139",
+         "\u2160"-"\u2183",
+         "\u3005"-"\u3007",
+         "\u3021"-"\u302f",
+         "\u3031"-"\u3035",
+         "\u3038"-"\u303a",
+         "\u3041"-"\u3094",
+         "\u3099"-"\u309a",
+         "\u309d"-"\u309e",
+         "\u30a1"-"\u30fe",
+         "\u3105"-"\u312c",
+         "\u3131"-"\u318e",
+         "\u31a0"-"\u31b7",
+         "\u3400"-"\u4db5",
+         "\u4e00"-"\u9fa5",
+         "\ua000"-"\ua48c",
+         "\uac00"-"\ud7a3",
+         "\uf900"-"\ufa2d",
+         "\ufb00"-"\ufb06",
+         "\ufb13"-"\ufb17",
+         "\ufb1d"-"\ufb28",
+         "\ufb2a"-"\ufb36",
+         "\ufb38"-"\ufb3c",
+         "\ufb3e",
+         "\ufb40"-"\ufb41",
+         "\ufb43"-"\ufb44",
+         "\ufb46"-"\ufbb1",
+         "\ufbd3"-"\ufd3d",
+         "\ufd50"-"\ufd8f",
+         "\ufd92"-"\ufdc7",
+         "\ufdf0"-"\ufdfb",
+         "\ufe20"-"\ufe23",
+         "\ufe33"-"\ufe34",
+         "\ufe4d"-"\ufe4f",
+         "\ufe69",
+         "\ufe70"-"\ufe72",
+         "\ufe74",
+         "\ufe76"-"\ufefc",
+         "\ufeff",
+         "\uff04",
+         "\uff10"-"\uff19",
+         "\uff21"-"\uff3a",
+         "\uff3f",
+         "\uff41"-"\uff5a",
+         "\uff65"-"\uffbe",
+         "\uffc2"-"\uffc7",
+         "\uffca"-"\uffcf",
+         "\uffd2"-"\uffd7",
+         "\uffda"-"\uffdc",
+         "\uffe0"-"\uffe1",
+         "\uffe5"-"\uffe6",
+         "\ufff9"-"\ufffb"
+      ]
+  >
+}
+
+/* SEPARATORS */
+
+TOKEN :
+{
+  < LPAREN: "(" >
+| < RPAREN: ")" >
+| < LBRACE: "{" >
+| < RBRACE: "}" >
+| < LBRACKET: "[" >
+| < RBRACKET: "]" >
+| < SEMICOLON: ";" >
+| < COMMA: "," >
+| < DOT: "." >
+| < AT: "@" >
+}
+
+/* OPERATORS */
+
+TOKEN :
+{
+  < ASSIGN: "=" >
+| < LT: "<" >
+| < BANG: "!" >
+| < TILDE: "~" >
+| < HOOK: "?" >
+| < COLON: ":" >
+| < EQ: "==" >
+| < LE: "<=" >
+| < GE: ">=" >
+| < NE: "!=" >
+| < SC_OR: "||" >
+| < SC_AND: "&&" >
+| < INCR: "++" >
+| < DECR: "--" >
+| < PLUS: "+" >
+| < MINUS: "-" >
+| < STAR: "*" >
+| < SLASH: "/" >
+| < BIT_AND: "&" >
+| < BIT_OR: "|" >
+| < XOR: "^" >
+| < REM: "%" >
+| < LSHIFT: "<<" >
+| < PLUSASSIGN: "+=" >
+| < MINUSASSIGN: "-=" >
+| < STARASSIGN: "*=" >
+| < SLASHASSIGN: "/=" >
+| < ANDASSIGN: "&=" >
+| < ORASSIGN: "|=" >
+| < XORASSIGN: "^=" >
+| < REMASSIGN: "%=" >
+| < LSHIFTASSIGN: "<<=" >
+| < RSIGNEDSHIFTASSIGN: ">>=" >
+| < RUNSIGNEDSHIFTASSIGN: ">>>=" >
+| < ELLIPSIS: "..." >
+}
+
+/* >'s need special attention due to generics syntax. */
+TOKEN :
+{
+  < RUNSIGNEDSHIFT: ">>>" >
+  {
+     matchedToken.kind = GT;
+     ((GTToken)matchedToken).realKind = RUNSIGNEDSHIFT;
+     input_stream.backup(2);
+     matchedToken.image = ">";
+  }
+| < RSIGNEDSHIFT: ">>" >
+  {
+     matchedToken.kind = GT;
+     ((GTToken)matchedToken).realKind = RSIGNEDSHIFT;
+     input_stream.backup(1);
+     matchedToken.image = ">";
+  }
+| < GT: ">" >
+}
+
+
+/*****************************************
+ * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
+ *****************************************/
+
+/*
+ * Program structuring syntax follows.
+ */
+
+void CompilationUnit():
+{}
+{
+  [ LOOKAHEAD( ( Annotation() )* "package" ) PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( TypeDeclaration() )*
+  ( < "\u001a" > )?
+  ( <STUFF_TO_IGNORE: ~[]> )?
+  <EOF>
+}
+
+void PackageDeclaration():
+{}
+{
+  Modifiers() "package" Name() ";"
+}
+
+void ImportUnit():
+{}
+{
+  [ PackageDeclaration() ]
+  ( ImportDeclaration() )*
+  ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )* 
+  ( "class" | "interface" )
+}
+
+void ImportDeclaration():
+{}
+{
+  "import" [ "static" ] Name() [ "." "*" ] ";"
+}
+
+/*
+ * Modifiers. We match all modifiers in a single rule to reduce the chances of
+ * syntax errors for simple modifier mistakes. It will also enable us to give
+ * better error messages.
+ */
+
+int Modifiers():
+{
+   int modifiers = 0;
+}
+{
+ (
+  LOOKAHEAD(2)
+  (
+   "public" { modifiers |= ModifierSet.PUBLIC; }
+  |
+   "static" { modifiers |= ModifierSet.STATIC; }
+  |
+   "protected" { modifiers |= ModifierSet.PROTECTED; }
+  |
+   "private" { modifiers |= ModifierSet.PRIVATE; }
+  |
+   "final" { modifiers |= ModifierSet.FINAL; }
+  |
+   "abstract" { modifiers |= ModifierSet.ABSTRACT; }
+  |
+   "synchronized" { modifiers |= ModifierSet.SYNCHRONIZED; }
+  |
+   "native" { modifiers |= ModifierSet.NATIVE; }
+  |
+   "transient" { modifiers |= ModifierSet.TRANSIENT; }
+  |
+   "volatile" { modifiers |= ModifierSet.VOLATILE; }
+  |
+   "strictfp" { modifiers |= ModifierSet.STRICTFP; }
+  |
+   Annotation()
+  )
+ )*
+
+ {
+    return modifiers;
+ }
+}
+
+/*
+ * Declaration syntax follows.
+ */
+void TypeDeclaration():
+{
+   int modifiers;
+}
+{
+  ";"
+|
+  modifiers = Modifiers()
+  (
+     ClassOrInterfaceDeclaration(modifiers)
+   |
+     EnumDeclaration(modifiers)
+   |
+     AnnotationTypeDeclaration(modifiers)
+  )
+}
+
+
+void ClassOrInterfaceDeclaration(int modifiers):
+{
+   boolean isInterface = false;
+}
+{
+  ( "class" | "interface" { isInterface = true; } )
+  <IDENTIFIER>
+  [ TypeParameters() ]
+  [ ExtendsList(isInterface) ]
+  [ ImplementsList(isInterface) ]
+  ClassOrInterfaceBody(isInterface)
+}
+
+void ExtendsList(boolean isInterface):
+{
+   boolean extendsMoreThanOne = false;
+}
+{
+   "extends" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() { extendsMoreThanOne = true; } )*
+   {
+      if (extendsMoreThanOne && !isInterface)
+         throw new ParseException("A class cannot extend more than one other class");
+   }
+}
+
+void ImplementsList(boolean isInterface):
+{}
+{
+   "implements" ClassOrInterfaceType()
+   ( "," ClassOrInterfaceType() )*
+   {
+      if (isInterface)
+         throw new ParseException("An interface cannot implement other interfaces");
+   }
+}
+
+void EnumDeclaration(int modifiers):
+{}
+{
+  "enum" <IDENTIFIER>
+  [ ImplementsList(false) ]
+  EnumBody()
+}
+
+void EnumBody():
+{}
+{
+   "{"
+   [ EnumConstant() ( LOOKAHEAD(2) "," EnumConstant() )* ]
+	[ "," ]
+   [ ";" ( ClassOrInterfaceBodyDeclaration(false) )* ]
+   "}"
+}
+
+void EnumConstant():
+{}
+{
+  Modifiers() <IDENTIFIER> [ Arguments() ] [ ClassOrInterfaceBody(false) ]
+}
+
+void TypeParameters():
+{}
+{
+   "<" TypeParameter() ( "," TypeParameter() )* ">"
+}
+
+void TypeParameter():
+{}
+{
+   <IDENTIFIER> [ TypeBound() ]
+}
+
+void TypeBound():
+{}
+{
+   "extends" ClassOrInterfaceType() ( "&" ClassOrInterfaceType() )*
+}
+
+void ClassOrInterfaceBody(boolean isInterface):
+{}
+{
+  "{" ( ClassOrInterfaceBodyDeclaration(isInterface) )* "}"
+}
+
+void ClassOrInterfaceBodyDeclaration(boolean isInterface):
+{
+   boolean isNestedInterface = false;
+   int modifiers;
+}
+{
+  LOOKAHEAD(2)
+  Initializer()
+  {
+     if (isInterface)
+        throw new ParseException("An interface cannot have initializers");
+  }
+|
+  modifiers = Modifiers() // Just get all the modifiers out of the way. If you want to do
+              // more checks, pass the modifiers down to the member
+  (
+      ClassOrInterfaceDeclaration(modifiers)
+    |
+      EnumDeclaration(modifiers)
+    |
+      LOOKAHEAD( [ TypeParameters() ] <IDENTIFIER> "(" )
+      ConstructorDeclaration()
+    |
+      LOOKAHEAD( Type() <IDENTIFIER> ( "[" "]" )* ( "," | "=" | ";" ) )
+      FieldDeclaration(modifiers)
+    |
+      MethodDeclaration(modifiers)
+  )
+|
+  ";"
+}
+
+void FieldDeclaration(int modifiers):
+{}
+{
+  // Modifiers are already matched in the caller
+  Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"
+}
+
+void VariableDeclarator():
+{}
+{
+  VariableDeclaratorId() [ "=" VariableInitializer() ]
+}
+
+void VariableDeclaratorId():
+{}
+{
+  <IDENTIFIER> ( "[" "]" )*
+}
+
+void VariableInitializer():
+{}
+{
+  ArrayInitializer()
+|
+  Expression()
+}
+
+void ArrayInitializer():
+{}
+{
+  "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}"
+}
+
+void MethodDeclaration(int modifiers):
+{}
+{
+  // Modifiers already matched in the caller!
+  [ TypeParameters() ]
+  ResultType()
+  MethodDeclarator() [ "throws" NameList() ]
+  ( Block() | ";" )
+}
+
+void MethodDeclarator():
+{}
+{
+  <IDENTIFIER> FormalParameters() ( "[" "]" )*
+}
+
+void FormalParameters():
+{}
+{
+  "(" [ FormalParameter() ( "," FormalParameter() )* ] ")"
+}
+
+void FormalParameter():
+{}
+{
+  Modifiers() Type() [ "..." ] VariableDeclaratorId()
+}
+
+void ConstructorDeclaration():
+{}
+{
+  [ TypeParameters() ]
+  // Modifiers matched in the caller
+  <IDENTIFIER> FormalParameters() [ "throws" NameList() ]
+  "{"
+    [ LOOKAHEAD(ExplicitConstructorInvocation())
+         ExplicitConstructorInvocation()
+    ]
+    ( BlockStatement() )*
+  "}"
+}
+
+void ExplicitConstructorInvocation():
+{}
+{
+  ( <IDENTIFIER> "." )* [ LOOKAHEAD(2) "this" "." ]
+  [ TypeArguments() ] ("this"|"super") Arguments() ";"
+}
+
+void Initializer():
+{}
+{
+  [ "static" ] Block()
+}
+
+
+/*
+ * Type, name and expression syntax follows.
+ */
+
+void Type():
+{}
+{
+   LOOKAHEAD(2) ReferenceType()
+ |
+   PrimitiveType()
+}
+
+void ReferenceType():
+{}
+{
+   PrimitiveType() ( LOOKAHEAD(2) "[" "]" )+
+  |
+   ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" )*
+}
+
+void ClassOrInterfaceType():
+{}
+{
+  <IDENTIFIER> [ LOOKAHEAD(2) TypeArguments() ]
+  ( LOOKAHEAD(2) "." <IDENTIFIER> [ LOOKAHEAD(2) TypeArguments() ] )*
+}
+
+void TypeArguments():
+{}
+{
+   "<" TypeArgument() ( "," TypeArgument() )* ">"
+}
+
+void TypeArgument():
+{}
+{
+   ReferenceType()
+ |
+   "?" [ WildcardBounds() ]
+}
+
+void WildcardBounds():
+{}
+{
+   "extends" ReferenceType()
+ |
+   "super" ReferenceType()
+}
+
+
+void PrimitiveType():
+{}
+{
+  "boolean"
+|
+  "char"
+|
+  "byte"
+|
+  "short"
+|
+  "int"
+|
+  "long"
+|
+  "float"
+|
+  "double"
+}
+
+void ResultType():
+{}
+{
+  "void"
+|
+  Type()
+}
+
+void Name():
+/*
+ * A lookahead of 2 is required below since "Name" can be followed
+ * by a ".*" when used in the context of an "ImportDeclaration".
+ */
+{}
+{
+  <IDENTIFIER>
+  ( LOOKAHEAD(2) "." <IDENTIFIER>
+  )*
+}
+
+void NameList():
+{}
+{
+  Name() ( "," Name() )*
+}
+
+
+/*
+ * Expression syntax follows.
+ */
+
+void Expression():
+/*
+ * This expansion has been written this way instead of:
+ *   Assignment() | ConditionalExpression()
+ * for performance reasons.
+ * However, it is a weakening of the grammar for it allows the LHS of
+ * assignments to be any conditional expression whereas it can only be
+ * a primary expression.  Consider adding a semantic predicate to work
+ * around this.
+ */
+{}
+{
+  ConditionalExpression()
+  [
+    LOOKAHEAD(2)
+    AssignmentOperator() Expression()
+  ]
+}
+
+void AssignmentOperator():
+{}
+{
+  "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|="
+}
+
+void ConditionalExpression():
+{}
+{
+  ConditionalOrExpression() [ "?" Expression() ":" Expression() ]
+}
+
+void ConditionalOrExpression():
+{}
+{
+  ConditionalAndExpression() ( "||" ConditionalAndExpression() )*
+}
+
+void ConditionalAndExpression():
+{}
+{
+  InclusiveOrExpression() ( "&&" InclusiveOrExpression() )*
+}
+
+void InclusiveOrExpression():
+{}
+{
+  ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )*
+}
+
+void ExclusiveOrExpression():
+{}
+{
+  AndExpression() ( "^" AndExpression() )*
+}
+
+void AndExpression():
+{}
+{
+  EqualityExpression() ( "&" EqualityExpression() )*
+}
+
+void EqualityExpression():
+{}
+{
+  InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )*
+}
+
+void InstanceOfExpression():
+{}
+{
+  RelationalExpression() [ "instanceof" Type() ]
+}
+
+void RelationalExpression():
+{}
+{
+  ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )*
+}
+
+void ShiftExpression():
+{}
+{
+  AdditiveExpression() ( ( "<<" | RSIGNEDSHIFT() | RUNSIGNEDSHIFT() ) AdditiveExpression() )*
+}
+
+void AdditiveExpression():
+{}
+{
+  MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )*
+}
+
+void MultiplicativeExpression():
+{}
+{
+  UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )*
+}
+
+void UnaryExpression():
+{}
+{
+  ( "+" | "-" ) UnaryExpression()
+|
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  UnaryExpressionNotPlusMinus()
+}
+
+void PreIncrementExpression():
+{}
+{
+  "++" PrimaryExpression()
+}
+
+void PreDecrementExpression():
+{}
+{
+  "--" PrimaryExpression()
+}
+
+void UnaryExpressionNotPlusMinus():
+{}
+{
+  ( "~" | "!" ) UnaryExpression()
+|
+  LOOKAHEAD( CastLookahead() )
+  CastExpression()
+|
+  PostfixExpression()
+}
+
+// This production is to determine lookahead only.  The LOOKAHEAD specifications
+// below are not used, but they are there just to indicate that we know about
+// this.
+void CastLookahead():
+{}
+{
+  LOOKAHEAD(2)
+  "(" PrimitiveType()
+|
+  LOOKAHEAD("(" Type() "[")
+  "(" Type() "[" "]"
+|
+  "(" Type() ")" ( "~" | "!" | "(" | <IDENTIFIER> | "this" | "super" | "new" | Literal() )
+}
+
+void PostfixExpression():
+{}
+{
+  PrimaryExpression() [ "++" | "--" ]
+}
+
+void CastExpression():
+{}
+{
+  LOOKAHEAD("(" PrimitiveType())
+  "(" Type() ")" UnaryExpression()
+|
+  "(" Type() ")" UnaryExpressionNotPlusMinus()
+}
+
+void PrimaryExpression():
+{}
+{
+  PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )*
+}
+
+void MemberSelector():
+{}
+{
+  "." TypeArguments() <IDENTIFIER>
+}
+
+void PrimaryPrefix():
+{}
+{
+  Literal()
+|
+  LOOKAHEAD( ( <IDENTIFIER> "." )* "this" )
+  ( <IDENTIFIER> "." )*
+  "this"
+|
+  "super" "." <IDENTIFIER>
+|
+  "(" Expression() ")"
+|
+  AllocationExpression()
+|
+  LOOKAHEAD( ResultType() "." "class" )
+  ResultType() "." "class"
+|
+  Name()
+}
+
+void PrimarySuffix():
+{}
+{
+  LOOKAHEAD("." "super" ".")
+  "." "super"
+|
+  LOOKAHEAD("." "this")
+  "." "this"
+|
+  LOOKAHEAD(2)
+  "." AllocationExpression()
+|
+  LOOKAHEAD(3)
+  MemberSelector()
+|
+  "[" Expression() "]"
+|
+  "." <IDENTIFIER>
+|
+  Arguments()
+}
+
+void Literal():
+{}
+{
+  <INTEGER_LITERAL>
+|
+  <FLOATING_POINT_LITERAL>
+|
+  <CHARACTER_LITERAL>
+|
+  <STRING_LITERAL>
+|
+  BooleanLiteral()
+|
+  NullLiteral()
+}
+
+void BooleanLiteral():
+{}
+{
+  "true"
+|
+  "false"
+}
+
+void NullLiteral():
+{}
+{
+  "null"
+}
+
+void Arguments():
+{}
+{
+  "(" [ ArgumentList() ] ")"
+}
+
+void ArgumentList():
+{}
+{
+  Expression() ( "," Expression() )*
+}
+
+void AllocationExpression():
+{}
+{
+  LOOKAHEAD(2)
+  "new" PrimitiveType() ArrayDimsAndInits()
+|
+  "new" ClassOrInterfaceType() [ TypeArguments() ]
+    (
+      ArrayDimsAndInits()
+    |
+      Arguments() [ ClassOrInterfaceBody(false) ]
+    )
+}
+
+/*
+ * The third LOOKAHEAD specification below is to parse to PrimarySuffix
+ * if there is an expression between the "[...]".
+ */
+void ArrayDimsAndInits():
+{}
+{
+  LOOKAHEAD(2)
+  ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )*
+|
+  ( "[" "]" )+ ArrayInitializer()
+}
+
+
+/*
+ * Statement syntax follows.
+ */
+
+void Statement():
+{}
+{
+  LOOKAHEAD(2)
+  LabeledStatement()
+|
+  AssertStatement()
+|
+  Block()
+|
+  EmptyStatement()
+|
+  StatementExpression() ";"
+|
+  SwitchStatement()
+|
+  IfStatement()
+|
+  WhileStatement()
+|
+  DoStatement()
+|
+  ForStatement()
+|
+  BreakStatement()
+|
+  ContinueStatement()
+|
+  ReturnStatement()
+|
+  ThrowStatement()
+|
+  SynchronizedStatement()
+|
+  TryStatement()
+}
+
+void AssertStatement():
+{}
+{
+  "assert" Expression() [ ":" Expression() ] ";"
+}
+
+void LabeledStatement():
+{}
+{
+  <IDENTIFIER> ":" Statement()
+}
+
+void Block():
+{}
+{
+  "{" ( BlockStatement() )* "}"
+}
+
+void BlockStatement():
+{}
+{
+  LOOKAHEAD( Modifiers() Type() <IDENTIFIER> )
+  LocalVariableDeclaration() ";"
+|
+  Statement()
+|
+  ClassOrInterfaceDeclaration(0)
+}
+
+void LocalVariableDeclaration():
+{}
+{
+  Modifiers() Type() VariableDeclarator() ( "," VariableDeclarator() )*
+}
+
+void EmptyStatement():
+{}
+{
+  ";"
+}
+
+void StatementExpression():
+/*
+ * The last expansion of this production accepts more than the legal
+ * Java expansions for StatementExpression.  This expansion does not
+ * use PostfixExpression for performance reasons.
+ */
+{}
+{
+  PreIncrementExpression()
+|
+  PreDecrementExpression()
+|
+  PrimaryExpression()
+  [
+    "++"
+  |
+    "--"
+  |
+    AssignmentOperator() Expression()
+  ]
+}
+
+void SwitchStatement():
+{}
+{
+  "switch" "(" Expression() ")" "{"
+    ( SwitchLabel() ( BlockStatement() )* )*
+  "}"
+}
+
+void SwitchLabel():
+{}
+{
+  "case" Expression() ":"
+|
+  "default" ":"
+}
+
+void IfStatement():
+/*
+ * The disambiguating algorithm of JavaCC automatically binds dangling
+ * else's to the innermost if statement.  The LOOKAHEAD specification
+ * is to tell JavaCC that we know what we are doing.
+ */
+{}
+{
+  "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ]
+}
+
+void WhileStatement():
+{}
+{
+  "while" "(" Expression() ")" Statement()
+}
+
+void DoStatement():
+{}
+{
+  "do" Statement() "while" "(" Expression() ")" ";"
+}
+
+void ForStatement():
+{}
+{
+  "for" "("
+
+  (
+      LOOKAHEAD(Modifiers() Type() <IDENTIFIER> ":")
+      Modifiers() Type() <IDENTIFIER> ":" Expression() 
+    |
+     [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ]
+  )
+
+  ")" Statement()
+}
+
+void ForInit():
+{}
+{
+  LOOKAHEAD( Modifiers() Type() <IDENTIFIER> )
+  LocalVariableDeclaration()
+|
+  StatementExpressionList()
+}
+
+void StatementExpressionList():
+{}
+{
+  StatementExpression() ( "," StatementExpression() )*
+}
+
+void ForUpdate():
+{}
+{
+  StatementExpressionList()
+}
+
+void BreakStatement():
+{}
+{
+  "break" [ <IDENTIFIER> ] ";"
+}
+
+void ContinueStatement():
+{}
+{
+  "continue" [ <IDENTIFIER> ] ";"
+}
+
+void ReturnStatement():
+{}
+{
+  "return" [ Expression() ] ";"
+}
+
+void ThrowStatement():
+{}
+{
+  "throw" Expression() ";"
+}
+
+void SynchronizedStatement():
+{}
+{
+  "synchronized" "(" Expression() ")" Block()
+}
+
+void TryStatement():
+/*
+ * Semantic check required here to make sure that at least one
+ * finally/catch is present.
+ */
+{}
+{
+  "try" Block()
+  ( "catch" "(" FormalParameter() ")" Block() )*
+  [ "finally" Block() ]
+}
+
+/* We use productions to match >>>, >> and > so that we can keep the
+ * type declaration syntax with generics clean
+ */
+
+void RUNSIGNEDSHIFT():
+{}
+{
+  ( LOOKAHEAD({ getToken(1).kind == GT &&
+                ((GTToken)getToken(1)).realKind == RUNSIGNEDSHIFT} )
+   ">" ">" ">"
+  )
+}
+
+void RSIGNEDSHIFT():
+{}
+{
+  ( LOOKAHEAD({ getToken(1).kind == GT &&
+                ((GTToken)getToken(1)).realKind == RSIGNEDSHIFT} )
+  ">" ">"
+  )
+}
+
+/* Annotation syntax follows. */
+
+void Annotation():
+{}
+{
+   LOOKAHEAD( "@" Name() "(" ( <IDENTIFIER> "=" | ")" ))
+   NormalAnnotation()
+ |
+   LOOKAHEAD( "@" Name() "(" )
+   SingleMemberAnnotation()
+ |
+   MarkerAnnotation()
+}
+
+void NormalAnnotation():
+{}
+{
+   "@" Name() "(" [ MemberValuePairs() ] ")"
+}
+
+void MarkerAnnotation():
+{}
+{
+  "@" Name()
+}
+
+void SingleMemberAnnotation():
+{}
+{
+  "@" Name() "(" MemberValue() ")"
+}
+
+void MemberValuePairs():
+{}
+{
+   MemberValuePair() ( "," MemberValuePair() )*
+}
+
+void MemberValuePair():
+{}
+{
+    <IDENTIFIER> "=" MemberValue()
+}
+
+void MemberValue():
+{}
+{
+   Annotation()
+ |
+   MemberValueArrayInitializer()
+ |
+   ConditionalExpression()
+}
+
+void  MemberValueArrayInitializer():
+{}
+{
+  "{" MemberValue() ( LOOKAHEAD(2) "," MemberValue() )* [ "," ] "}"
+}
+
+
+/* Annotation Types. */
+
+void AnnotationTypeDeclaration(int modifiers):
+{}
+{
+  "@" "interface" <IDENTIFIER> AnnotationTypeBody()
+}
+
+void AnnotationTypeBody():
+{}
+{
+  "{" ( AnnotationTypeMemberDeclaration() )* "}"
+}
+
+void AnnotationTypeMemberDeclaration():
+{
+   int modifiers;
+}
+{
+ modifiers = Modifiers()
+ (
+   LOOKAHEAD(Type() <IDENTIFIER> "(")
+   Type() <IDENTIFIER> "(" ")" [ DefaultValue() ] ";"
+  |
+   ClassOrInterfaceDeclaration(modifiers)
+  |
+   EnumDeclaration(modifiers)
+  |
+   AnnotationTypeDeclaration(modifiers)
+  |
+   FieldDeclaration(modifiers)
+ )
+ |
+   ( ";" )
+}
+
+void DefaultValue():
+{}
+{
+  "default" MemberValue()
+}
diff --git a/COPYING b/cobertura/src/main/resources/COPYING
similarity index 98%
rename from COPYING
rename to cobertura/src/main/resources/COPYING
index fbdd65f..d60c31a 100644
--- a/COPYING
+++ b/cobertura/src/main/resources/COPYING
@@ -1,340 +1,340 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  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
-this service 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 make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  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.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-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
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE 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.
-
-		     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
-convey 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 2 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, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year  name of author
-    Gnomovision 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, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This 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 Library General
-Public License instead of this License.
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  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.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+		     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
+convey 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 2 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, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
diff --git a/COPYRIGHT b/cobertura/src/main/resources/COPYRIGHT
similarity index 94%
rename from COPYRIGHT
rename to cobertura/src/main/resources/COPYRIGHT
index 2dc9103..fa93857 100644
--- a/COPYRIGHT
+++ b/cobertura/src/main/resources/COPYRIGHT
@@ -1,34 +1,36 @@
-Cobertura - http://cobertura.sourceforge.net/
-
-List of all contributors to Cobertura
-Listed alphabetically by last name
-
-Copyright (C) 2005 Björn Beskow      <bbeskow a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2008 Matt Cordes        <mcordes a.t visa d.o.t com>
-Copyright (C) 2005 Erik Dick          <erdick a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2005 Mark Doliner       <thekingant a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2005 Joakim Erdfelt     <joakim a.t erdfelt d.o.t net>
-Copyright (C) 2008 Julian Gamble      <juliangamble a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2006 Dan Godfrey        <dgodfrey99 a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2008 Tri Bao Ho         <hotribao a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2006 Naoki Iwami        <naoki_iwami a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2003 jcoverage ltd.
-Copyright (C) 2009 John Lewis         <lewijw a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2005 Grzegorz Lukasik   <hauserx a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2006 Jiri Mares         <jirimares a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2009 Amit Nithianandan  <ANithian a.t gmail d.o.t com>
-Copyright (C) 2005 Olivier Parent     <olivier-parent a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2009 Ed Randall         <ed_randall a.t yahoo d.o.t com>
-Copyright (C) 2005 Alex Ruiz          <alruiz15 a.t users d.o.t yahoo d.o.t com>
-Copyright (C) 2005 James Seigel       <cgul a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2005 Mark Sinke         <marksinke a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2009 Charlie Squires    <rockonword a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2010 Piotr Tabor        <piotr.tabor a.t gmail d.o.t com>
-Copyright (C) 2005 Jeremy Thomerson   <jthomerson a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2009 Chris van Es       <cvanes a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2006 Srivathsan Varadarajan <vatsanv a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2005 Nathan Wilson      <ndciwilson a.t users d.o.t sourceforge d.o.t net>
-Copyright (C) 2005 Alexei Yudichev    <sflexus a.t users d.o.t sourceforge d.o.t net>
-
-Code in the net.sourceforge.cobertura.javancss package is
-Copyright (C) 2000 Chr. Clemens Lee   <clemens a.t kclee d.o.t com>
+Cobertura - http://cobertura.sourceforge.net/
+
+List of all contributors to Cobertura
+Listed alphabetically by last name
+
+Copyright (C) 2005 Björn Beskow      <bbeskow a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2008 Matt Cordes        <mcordes a.t visa d.o.t com>
+Copyright (C) 2005 Erik Dick          <erdick a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2005 Mark Doliner       <thekingant a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2005 Joakim Erdfelt     <joakim a.t erdfelt d.o.t net>
+Copyright (C) 2008 Scott Frederick    <scottyfred a.t gmail d.o.t com>
+Copyright (C) 2008 Julian Gamble      <juliangamble a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2006 Dan Godfrey        <dgodfrey99 a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2008 Tri Bao Ho         <hotribao a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2006 Naoki Iwami        <naoki_iwami a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2003 jcoverage ltd.
+Copyright (C) 2009 John Lewis         <lewijw a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2005 Grzegorz Lukasik   <hauserx a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2006 Jiri Mares         <jirimares a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2009 Amit Nithianandan  <ANithian a.t gmail d.o.t com>
+Copyright (C) 2005 Olivier Parent     <olivier-parent a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2009 Ed Randall         <ed_randall a.t yahoo d.o.t com>
+Copyright (C) 2005 Alex Ruiz          <alruiz15 a.t users d.o.t yahoo d.o.t com>
+Copyright (C) 2005 James Seigel       <cgul a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2005 Mark Sinke         <marksinke a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2010 Tad Smith          <tsmith a.t lw-lmco d.o.t com>
+Copyright (C) 2009 Charlie Squires    <rockonword a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2010 Piotr Tabor        <piotr.tabor a.t gmail d.o.t com>
+Copyright (C) 2005 Jeremy Thomerson   <jthomerson a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2009 Chris van Es       <cvanes a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2006 Srivathsan Varadarajan <vatsanv a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2005 Nathan Wilson      <ndciwilson a.t users d.o.t sourceforge d.o.t net>
+Copyright (C) 2005 Alexei Yudichev    <sflexus a.t users d.o.t sourceforge d.o.t net>
+
+Code in the net.sourceforge.cobertura.javancss package is
+Copyright (C) 2000 Chr. Clemens Lee   <clemens a.t kclee d.o.t com>
diff --git a/cobertura/src/main/resources/logback.xml b/cobertura/src/main/resources/logback.xml
new file mode 100644
index 0000000..6f58e6d
--- /dev/null
+++ b/cobertura/src/main/resources/logback.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  cobertura
+  %%
+  Copyright (C) 2015 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%level] %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- Lower the logging level for relevant classes -->
+    <logger name="net.sourceforge.cobertura" level="INFO"/>
+
+    <!-- Strictly speaking, the level attribute is not necessary since -->
+    <!-- the level of the root level is set to DEBUG by default.       -->
+    <root level="DEBUG">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>
diff --git a/src/net/sourceforge/cobertura/ant/antlib.xml b/cobertura/src/main/resources/net/sourceforge/cobertura/ant/antlib.xml
similarity index 95%
rename from src/net/sourceforge/cobertura/ant/antlib.xml
rename to cobertura/src/main/resources/net/sourceforge/cobertura/ant/antlib.xml
index 087f02e..cc7cdfe 100644
--- a/src/net/sourceforge/cobertura/ant/antlib.xml
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/ant/antlib.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0"?>
-<antlib>
-  <typedef name="instrument" classname="net.sourceforge.cobertura.ant.InstrumentTask"/>
-  <typedef name="merge" classname="net.sourceforge.cobertura.ant.MergeTask"/>
-  <typedef name="report" classname="net.sourceforge.cobertura.ant.ReportTask"/>
-  <typedef name="check" classname="net.sourceforge.cobertura.ant.CheckTask"/>
+<?xml version="1.0"?>
+<antlib>
+  <typedef name="instrument" classname="net.sourceforge.cobertura.ant.InstrumentTask"/>
+  <typedef name="merge" classname="net.sourceforge.cobertura.ant.MergeTask"/>
+  <typedef name="report" classname="net.sourceforge.cobertura.ant.ReportTask"/>
+  <typedef name="check" classname="net.sourceforge.cobertura.ant.CheckTask"/>
 </antlib>
\ No newline at end of file
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/blank.png b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/blank.png
similarity index 100%
rename from src/net/sourceforge/cobertura/reporting/html/files/blank.png
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/blank.png
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/customsorttypes.js b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/customsorttypes.js
similarity index 100%
rename from src/net/sourceforge/cobertura/reporting/html/files/customsorttypes.js
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/customsorttypes.js
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/downsimple.png b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/downsimple.png
similarity index 100%
rename from src/net/sourceforge/cobertura/reporting/html/files/downsimple.png
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/downsimple.png
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/help.css b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/help.css
similarity index 92%
rename from src/net/sourceforge/cobertura/reporting/html/files/help.css
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/help.css
index c6fbb28..b023e03 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/help.css
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/help.css
@@ -1,22 +1,22 @@
-dl {
-	float: left;
-	width: 100%;
-}
-
-dt {
-	border-top: 1px solid #808080;
-	float: left;
-	font-weight: bold;
-	margin: 0;
-	padding: 1em;
-	width: 20%;
-}
-
-dd {
-	border-top: 1px solid #808080;
-	float: left;
-	font-style: italic;
-	margin: 0;
-	padding: 1em;
-	width: 60%;
-}
+dl {
+	float: left;
+	width: 100%;
+}
+
+dt {
+	border-top: 1px solid #808080;
+	float: left;
+	font-weight: bold;
+	margin: 0;
+	padding: 1em;
+	width: 20%;
+}
+
+dd {
+	border-top: 1px solid #808080;
+	float: left;
+	font-style: italic;
+	margin: 0;
+	padding: 1em;
+	width: 60%;
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/help.html b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/help.html
similarity index 97%
rename from src/net/sourceforge/cobertura/reporting/html/files/help.html
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/help.html
index 4c518dc..b1de763 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/help.html
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/help.html
@@ -1,31 +1,31 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-<link title="Style" type="text/css" rel="stylesheet" href="css/main.css"/>
-<title>Coverage Report - Help</title>
-</head>
-
-<body>
-
-<dl>
-
-<dt>Line Coverage</dt>
-<dd>The percent of lines executed by this test run.</dd>
-
-<dt>Branch Coverage</dt>
-<dd>The percent of branches executed by this test run.</dd>
-
-<dt>Complexity</dt>
-<dd>Average McCabe's cyclomatic code complexity for all methods.  This is basically a count of the number of different code paths in a method (incremented by 1 for each if statement, while loop, etc.)</dd>
-
-<dt>N/A</dt>
-<dd>Line coverage and branch coverage will appear as "Not Applicable" when Cobertura can not find line number information in the .class file.  This happens for stub and skeleton classes, interfaces, or when the class was not compiled with "debug=true."</dd>
-
-</dl>
-
-</body>
-
-</html>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<link title="Style" type="text/css" rel="stylesheet" href="css/main.css"/>
+<title>Coverage Report - Help</title>
+</head>
+
+<body>
+
+<dl>
+
+<dt>Line Coverage</dt>
+<dd>The percent of lines executed by this test run.</dd>
+
+<dt>Branch Coverage</dt>
+<dd>The percent of branches executed by this test run.</dd>
+
+<dt>Complexity</dt>
+<dd>Average McCabe's cyclomatic code complexity for all methods.  This is basically a count of the number of different code paths in a method (incremented by 1 for each if statement, while loop, etc.)</dd>
+
+<dt>N/A</dt>
+<dd>Line coverage and branch coverage will appear as "Not Applicable" when Cobertura can not find line number information in the .class file.  This happens for stub and skeleton classes, interfaces, or when the class was not compiled with "debug=true."</dd>
+
+</dl>
+
+</body>
+
+</html>
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/index.html b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/index.html
similarity index 97%
rename from src/net/sourceforge/cobertura/reporting/html/files/index.html
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/index.html
index 573719b..17ebf4f 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/index.html
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/index.html
@@ -1,25 +1,25 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
-           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-<title>Coverage Report</title>
-</head>
-
-<frameset cols="20%,80%">
-	<frameset rows="30%,70%">
-		<frame src="frame-packages.html" name="packageList" title="All Packages"/>
-		<frame src="frame-sourcefiles.html" name="sourceFileList" title="All classes and interfaces (except non-static nested types)"/>
-	</frameset>
-	<frame src="frame-summary.html" name="summary" title="Package, class and interface descriptions" scrolling="yes"/>
-
-	<noframes>
-		<body>
-			<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a frame-incapable web client.</p>
-			<p><a href="frame-summary.html">Click here to view a non-frame version.</a></p>
-		</body>
-	</noframes>
-</frameset>
-
-</html>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<title>Coverage Report</title>
+</head>
+
+<frameset cols="20%,80%">
+	<frameset rows="30%,70%">
+		<frame src="frame-packages.html" name="packageList" title="All Packages"/>
+		<frame src="frame-sourcefiles.html" name="sourceFileList" title="All classes and interfaces (except non-static nested types)"/>
+	</frameset>
+	<frame src="frame-summary.html" name="summary" title="Package, class and interface descriptions" scrolling="yes"/>
+
+	<noframes>
+		<body>
+			<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a frame-incapable web client.</p>
+			<p><a href="frame-summary.html">Click here to view a non-frame version.</a></p>
+		</body>
+	</noframes>
+</frameset>
+
+</html>
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/main.css b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/main.css
similarity index 92%
rename from src/net/sourceforge/cobertura/reporting/html/files/main.css
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/main.css
index 9b5b0dc..fb209e4 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/main.css
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/main.css
@@ -1,131 +1,131 @@
- at import url("help.css");
- at import url("source-viewer.css");
- at import url("tooltip.css");
-
-.hidden {
-	display: none;
-}
-
-a.dfn {
-	border-bottom: 1px dotted #00aa00;
-	cursor: help;
-}
-
-a.dfn:active, a.dfn:link, a.dfn:visited {
-	color: #000000;
-	text-decoration: none;
-}
-
-a.dfn:hover {
-	color: #0000ff;
-	text-decoration: none;
-}
-
-body {
-	font-family: verdana, arial, helvetica;
-}
-
-h1, h2, h3, h4, h5, h6 {
-	margin-bottom: 0.5em;
-}
-
-h5 {
-	margin-top: 0.5em;
-}
-
-div.footer {
-	font-size: 68%;
-	margin-top: 1.5em;
-}
-
-div.percentgraph
-{
-	background-color: #f02020;
-	border: #808080 1px solid;
-	height: 1.3em;
-	margin: 0px;
-	padding: 0px;
-	width: 100px;
-}
-
-div.percentgraph div.greenbar
-{
-	background-color: #00f000;
-	height: 1.3em;
-	margin: 0px;
-	padding: 0px;
-}
-
-div.percentgraph div.na
-{
-	background-color: #eaeaea;
-	height: 1.3em;
-	margin: 0px;
-	padding: 0px;
-}
-
-div.percentgraph span.text
-{
-	display: block;
-	position: absolute;
-	text-align: center;
-	width: 100px;
-}
-
-div.separator {
-	height: 10px;
-}
-
-table tr td, table tr th {
-	font-size: 68%;
-}
-
-td.value table tr td {
-    font-size: 11px;
-}
-
-table.percentgraph {
-	border: 0px;
-	font-size: 130%;
-	margin: 0px;
-	margin-left: auto;
-	margin-right: 0px;
-	padding: 0px;
-}
-
-table.percentgraph tr.percentgraph {
-	border: 0px;
-	margin: 0px;
-	padding: 0px;
-}
-
-table.percentgraph td.percentgraph {
-	border: 0px;
-	margin: 0px;
-	padding: 0px;
-	padding-left: 4px;
-}
-
-table.report {
-	border-collapse: collapse;
-	width: 100%;
-}
-
-table.report td {
-	border: #d0d0d0 1px solid;
-}
-
-table.report td.heading {
-    background: #dcecff;
-	font-weight: bold;
-	text-align: center;
-}
-
-table.report td.heading:hover {
-    background: #c0ffc0;
-	cursor: pointer;
-}
-
-table.report td.value {
-	text-align: right;
-}
+ at import url("help.css");
+ at import url("source-viewer.css");
+ at import url("tooltip.css");
+
+.hidden {
+	display: none;
+}
+
+a.dfn {
+	border-bottom: 1px dotted #00aa00;
+	cursor: help;
+}
+
+a.dfn:active, a.dfn:link, a.dfn:visited {
+	color: #000000;
+	text-decoration: none;
+}
+
+a.dfn:hover {
+	color: #0000ff;
+	text-decoration: none;
+}
+
+body {
+	font-family: verdana, arial, helvetica;
+}
+
+h1, h2, h3, h4, h5, h6 {
+	margin-bottom: 0.5em;
+}
+
+h5 {
+	margin-top: 0.5em;
+}
+
+div.footer {
+	font-size: 68%;
+	margin-top: 1.5em;
+}
+
+div.percentgraph
+{
+	background-color: #f02020;
+	border: #808080 1px solid;
+	height: 1.3em;
+	margin: 0px;
+	padding: 0px;
+	width: 100px;
+}
+
+div.percentgraph div.greenbar
+{
+	background-color: #00f000;
+	height: 1.3em;
+	margin: 0px;
+	padding: 0px;
+}
+
+div.percentgraph div.na
+{
+	background-color: #eaeaea;
+	height: 1.3em;
+	margin: 0px;
+	padding: 0px;
+}
+
+div.percentgraph span.text
+{
+	display: block;
+	position: absolute;
+	text-align: center;
+	width: 100px;
+}
+
+div.separator {
+	height: 10px;
+}
+
+table tr td, table tr th {
+	font-size: 68%;
+}
+
+td.value table tr td {
+    font-size: 11px;
+}
+
+table.percentgraph {
+	border: 0px;
+	font-size: 130%;
+	margin: 0px;
+	margin-left: auto;
+	margin-right: 0px;
+	padding: 0px;
+}
+
+table.percentgraph tr.percentgraph {
+	border: 0px;
+	margin: 0px;
+	padding: 0px;
+}
+
+table.percentgraph td.percentgraph {
+	border: 0px;
+	margin: 0px;
+	padding: 0px;
+	padding-left: 4px;
+}
+
+table.report {
+	border-collapse: collapse;
+	width: 100%;
+}
+
+table.report td {
+	border: #d0d0d0 1px solid;
+}
+
+table.report td.heading {
+    background: #dcecff;
+	font-weight: bold;
+	text-align: center;
+}
+
+table.report td.heading:hover {
+    background: #c0ffc0;
+	cursor: pointer;
+}
+
+table.report td.value {
+	text-align: right;
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/popup.js b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/popup.js
similarity index 95%
rename from src/net/sourceforge/cobertura/reporting/html/files/popup.js
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/popup.js
index 4a09072..f1160ff 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/popup.js
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/popup.js
@@ -1,8 +1,8 @@
-var newwindow;
-function popupwindow(url)
-{
-	newwindow=window.open(url,'name','height=500,width=500,resizable=yes,scrollbars=yes');
-	if (window.focus) {
-		newwindow.focus()
-	}
-}
+var newwindow;
+function popupwindow(url)
+{
+	newwindow=window.open(url,'name','height=500,width=500,resizable=yes,scrollbars=yes');
+	if (window.focus) {
+		newwindow.focus()
+	}
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/sortabletable.css b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/sortabletable.css
similarity index 94%
rename from src/net/sourceforge/cobertura/reporting/html/files/sortabletable.css
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/sortabletable.css
index 970e2b5..7c1ff92 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/sortabletable.css
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/sortabletable.css
@@ -1,50 +1,50 @@
-.sort-table {
-	font:		Icon;
-	border:		1px Solid ThreeDShadow;
-	background:	Window;
-	color:		WindowText;
-}
-
-.sort-table thead {
-	background:	ButtonFace;
-}
-
-.sort-table td {
-	padding:	2px 5px;
-}
-
-.sort-table thead td {
-	border:			1px solid;
-	border-color:	ButtonHighlight ButtonShadow
-					ButtonShadow ButtonHighlight;
-	cursor:			default;
-}
-
-.sort-table thead td:active {
-	border-color:	ButtonShadow ButtonHighlight
-					ButtonHighlight ButtonShadow;
-	padding:		3px 4px 1px 6px;
-}
-
-.sort-table thead td[_sortType=None]:active {
-	border-color:	ButtonHighlight ButtonShadow
-					ButtonShadow ButtonHighlight;
-	padding:		2px 5px;
-}
-
-.sort-arrow {
-	width:					11px;
-	height:					11px;
-	background-position:	center center;
-	background-repeat:		no-repeat;
-	margin:					0 2px;
-}
-
-.sort-arrow.descending {
-	background-image:		url("../images/downsimple.png");
-
-}
-
-.sort-arrow.ascending {
-	background-image:		url("../images/upsimple.png");
+.sort-table {
+	font:		Icon;
+	border:		1px Solid ThreeDShadow;
+	background:	Window;
+	color:		WindowText;
+}
+
+.sort-table thead {
+	background:	ButtonFace;
+}
+
+.sort-table td {
+	padding:	2px 5px;
+}
+
+.sort-table thead td {
+	border:			1px solid;
+	border-color:	ButtonHighlight ButtonShadow
+					ButtonShadow ButtonHighlight;
+	cursor:			default;
+}
+
+.sort-table thead td:active {
+	border-color:	ButtonShadow ButtonHighlight
+					ButtonHighlight ButtonShadow;
+	padding:		3px 4px 1px 6px;
+}
+
+.sort-table thead td[_sortType=None]:active {
+	border-color:	ButtonHighlight ButtonShadow
+					ButtonShadow ButtonHighlight;
+	padding:		2px 5px;
+}
+
+.sort-arrow {
+	width:					11px;
+	height:					11px;
+	background-position:	center center;
+	background-repeat:		no-repeat;
+	margin:					0 2px;
+}
+
+.sort-arrow.descending {
+	background-image:		url("../images/downsimple.png");
+
+}
+
+.sort-arrow.ascending {
+	background-image:		url("../images/upsimple.png");
 }
\ No newline at end of file
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/sortabletable.js b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/sortabletable.js
similarity index 97%
rename from src/net/sourceforge/cobertura/reporting/html/files/sortabletable.js
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/sortabletable.js
index 0dad657..2f7c72e 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/sortabletable.js
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/sortabletable.js
@@ -1,455 +1,455 @@
-
-/*----------------------------------------------------------------------------\
-|                            Sortable Table 1.12                              |
-|-----------------------------------------------------------------------------|
-|                         Created by Erik Arvidsson                           |
-|                  (http://webfx.eae.net/contact.html#erik)                   |
-|                      For WebFX (http://webfx.eae.net/)                      |
-|-----------------------------------------------------------------------------|
-| A DOM 1 based script that allows an ordinary HTML table to be sortable.     |
-|-----------------------------------------------------------------------------|
-|                  Copyright (c) 1998 - 2004 Erik Arvidsson                   |
-|-----------------------------------------------------------------------------|
-| This software is provided "as is", without warranty of any kind, express or |
-| implied, including  but not limited  to the warranties of  merchantability, |
-| fitness for a particular purpose and noninfringement. In no event shall the |
-| authors or  copyright  holders be  liable for any claim,  damages or  other |
-| liability, whether  in an  action of  contract, tort  or otherwise, arising |
-| from,  out of  or in  connection with  the software or  the  use  or  other |
-| dealings in the software.                                                   |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| This  software is  available under the  three different licenses  mentioned |
-| below.  To use this software you must chose, and qualify, for one of those. |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| The WebFX Non-Commercial License          http://webfx.eae.net/license.html |
-| Permits  anyone the right to use the  software in a  non-commercial context |
-| free of charge.                                                             |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| The WebFX Commercial license           http://webfx.eae.net/commercial.html |
-| Permits the  license holder the right to use  the software in a  commercial |
-| context. Such license must be specifically obtained, however it's valid for |
-| any number of  implementations of the licensed software.                    |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| GPL - The GNU General Public License    http://www.gnu.org/licenses/gpl.txt |
-| Permits anyone the right to use and modify the software without limitations |
-| as long as proper  credits are given  and the original  and modified source |
-| code are included. Requires  that the final product, software derivate from |
-| the original  source or any  software  utilizing a GPL  component, such  as |
-| this, is also licensed under the GPL license.                               |
-|-----------------------------------------------------------------------------|
-| 2003-01-10 | First version                                                  |
-| 2003-01-19 | Minor changes to the date parsing                              |
-| 2003-01-28 | JScript 5.0 fixes (no support for 'in' operator)               |
-| 2003-02-01 | Sloppy typo like error fixed in getInnerText                   |
-| 2003-07-04 | Added workaround for IE cellIndex bug.                         |
-| 2003-11-09 | The bDescending argument to sort was not correctly working     |
-|            | Using onclick DOM0 event if no support for addEventListener    |
-|            | or attachEvent                                                 |
-| 2004-01-13 | Adding addSortType and removeSortType which makes it a lot     |
-|            | easier to add new, custom sort types.                          |
-| 2004-01-27 | Switch to use descending = false as the default sort order.    |
-|            | Change defaultDescending to suit your needs.                   |
-| 2004-03-14 | Improved sort type None look and feel a bit                    |
-| 2004-08-26 | Made the handling of tBody and tHead more flexible. Now you    |
-|            | can use another tHead or no tHead, and you can chose some      |
-|            | other tBody.                                                   |
-|-----------------------------------------------------------------------------|
-| Created 2003-01-10 | All changes are in the log above. | Updated 2004-08-26 |
-\----------------------------------------------------------------------------*/
-
-
-function SortableTable(oTable, oSortTypes) {
-
-	this.sortTypes = oSortTypes || [];
-
-	this.sortColumn = null;
-	this.descending = null;
-
-	var oThis = this;
-	this._headerOnclick = function (e) {
-		oThis.headerOnclick(e);
-	};
-
-	if (oTable) {
-		this.setTable( oTable );
-		this.document = oTable.ownerDocument || oTable.document;
-	}
-	else {
-		this.document = document;
-	}
-
-
-	// only IE needs this
-	var win = this.document.defaultView || this.document.parentWindow;
-	this._onunload = function () {
-		oThis.destroy();
-	};
-	if (win && typeof win.attachEvent != "undefined") {
-		win.attachEvent("onunload", this._onunload);
-	}
-}
-
-SortableTable.gecko = navigator.product == "Gecko";
-SortableTable.msie = /msie/i.test(navigator.userAgent);
-// Mozilla is faster when doing the DOM manipulations on
-// an orphaned element. MSIE is not
-SortableTable.removeBeforeSort = SortableTable.gecko;
-
-SortableTable.prototype.onsort = function () {};
-
-// default sort order. true -> descending, false -> ascending
-SortableTable.prototype.defaultDescending = false;
-
-// shared between all instances. This is intentional to allow external files
-// to modify the prototype
-SortableTable.prototype._sortTypeInfo = {};
-
-SortableTable.prototype.setTable = function (oTable) {
-	if ( this.tHead )
-		this.uninitHeader();
-	this.element = oTable;
-	this.setTHead( oTable.tHead );
-	this.setTBody( oTable.tBodies[0] );
-};
-
-SortableTable.prototype.setTHead = function (oTHead) {
-	if (this.tHead && this.tHead != oTHead )
-		this.uninitHeader();
-	this.tHead = oTHead;
-	this.initHeader( this.sortTypes );
-};
-
-SortableTable.prototype.setTBody = function (oTBody) {
-	this.tBody = oTBody;
-};
-
-SortableTable.prototype.setSortTypes = function ( oSortTypes ) {
-	if ( this.tHead )
-		this.uninitHeader();
-	this.sortTypes = oSortTypes || [];
-	if ( this.tHead )
-		this.initHeader( this.sortTypes );
-};
-
-// adds arrow containers and events
-// also binds sort type to the header cells so that reordering columns does
-// not break the sort types
-SortableTable.prototype.initHeader = function (oSortTypes) {
-	if (!this.tHead) return;
-	var cells = this.tHead.rows[0].cells;
-	var doc = this.tHead.ownerDocument || this.tHead.document;
-	this.sortTypes = oSortTypes || [];
-	var l = cells.length;
-	var img, c;
-	for (var i = 0; i < l; i++) {
-		c = cells[i];
-		if (this.sortTypes[i] != null && this.sortTypes[i] != "None") {
-			img = doc.createElement("IMG");
-			img.src = "images/blank.png";
-			c.appendChild(img);
-			if (this.sortTypes[i] != null)
-				c._sortType = this.sortTypes[i];
-			if (typeof c.addEventListener != "undefined")
-				c.addEventListener("click", this._headerOnclick, false);
-			else if (typeof c.attachEvent != "undefined")
-				c.attachEvent("onclick", this._headerOnclick);
-			else
-				c.onclick = this._headerOnclick;
-		}
-		else
-		{
-			c.setAttribute( "_sortType", oSortTypes[i] );
-			c._sortType = "None";
-		}
-	}
-	this.updateHeaderArrows();
-};
-
-// remove arrows and events
-SortableTable.prototype.uninitHeader = function () {
-	if (!this.tHead) return;
-	var cells = this.tHead.rows[0].cells;
-	var l = cells.length;
-	var c;
-	for (var i = 0; i < l; i++) {
-		c = cells[i];
-		if (c._sortType != null && c._sortType != "None") {
-			c.removeChild(c.lastChild);
-			if (typeof c.removeEventListener != "undefined")
-				c.removeEventListener("click", this._headerOnclick, false);
-			else if (typeof c.detachEvent != "undefined")
-				c.detachEvent("onclick", this._headerOnclick);
-			c._sortType = null;
-			c.removeAttribute( "_sortType" );
-		}
-	}
-};
-
-SortableTable.prototype.updateHeaderArrows = function () {
-	if (!this.tHead) return;
-	var cells = this.tHead.rows[0].cells;
-	var l = cells.length;
-	var img;
-	for (var i = 0; i < l; i++) {
-		if (cells[i]._sortType != null && cells[i]._sortType != "None") {
-			img = cells[i].lastChild;
-			if (i == this.sortColumn)
-				img.className = "sort-arrow " + (this.descending ? "descending" : "ascending");
-			else
-				img.className = "sort-arrow";
-		}
-	}
-};
-
-SortableTable.prototype.headerOnclick = function (e) {
-	// find TD element
-	var el = e.target || e.srcElement;
-	while (el.tagName != "TD")
-		el = el.parentNode;
-
-	this.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);
-};
-
-// IE returns wrong cellIndex when columns are hidden
-SortableTable.getCellIndex = function (oTd) {
-	var cells = oTd.parentNode.childNodes
-	var l = cells.length;
-	var i;
-	for (i = 0; cells[i] != oTd && i < l; i++)
-		;
-	return i;
-};
-
-SortableTable.prototype.getSortType = function (nColumn) {
-	return this.sortTypes[nColumn] || "String";
-};
-
-// only nColumn is required
-// if bDescending is left out the old value is taken into account
-// if sSortType is left out the sort type is found from the sortTypes array
-
-SortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {
-	if (!this.tBody) return;
-	if (sSortType == null)
-		sSortType = this.getSortType(nColumn);
-
-	// exit if None
-	if (sSortType == "None")
-		return;
-
-	if (bDescending == null) {
-		if (this.sortColumn != nColumn)
-			this.descending = this.defaultDescending;
-		else
-			this.descending = !this.descending;
-	}
-	else
-		this.descending = bDescending;
-
-	this.sortColumn = nColumn;
-
-	if (typeof this.onbeforesort == "function")
-		this.onbeforesort();
-
-	var f = this.getSortFunction(sSortType, nColumn);
-	var a = this.getCache(sSortType, nColumn);
-	var tBody = this.tBody;
-
-	a.sort(f);
-
-	if (this.descending)
-		a.reverse();
-
-	if (SortableTable.removeBeforeSort) {
-		// remove from doc
-		var nextSibling = tBody.nextSibling;
-		var p = tBody.parentNode;
-		p.removeChild(tBody);
-	}
-
-	// insert in the new order
-	var l = a.length;
-	for (var i = 0; i < l; i++)
-		tBody.appendChild(a[i].element);
-
-	if (SortableTable.removeBeforeSort) {
-		// insert into doc
-		p.insertBefore(tBody, nextSibling);
-	}
-
-	this.updateHeaderArrows();
-
-	this.destroyCache(a);
-
-	if (typeof this.onsort == "function")
-		this.onsort();
-};
-
-SortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {
-	var oThis = this;
-	this._asyncsort = function () {
-		oThis.sort(nColumn, bDescending, sSortType);
-	};
-	window.setTimeout(this._asyncsort, 1);
-};
-
-SortableTable.prototype.getCache = function (sType, nColumn) {
-	if (!this.tBody) return [];
-	var rows = this.tBody.rows;
-	var l = rows.length;
-	var a = new Array(l);
-	var r;
-	for (var i = 0; i < l; i++) {
-		r = rows[i];
-		a[i] = {
-			value:		this.getRowValue(r, sType, nColumn),
-			element:	r
-		};
-	};
-	return a;
-};
-
-SortableTable.prototype.destroyCache = function (oArray) {
-	var l = oArray.length;
-	for (var i = 0; i < l; i++) {
-		oArray[i].value = null;
-		oArray[i].element = null;
-		oArray[i] = null;
-	}
-};
-
-SortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {
-	// if we have defined a custom getRowValue use that
-	if (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)
-		return this._sortTypeInfo[sType].getRowValue(oRow, nColumn);
-
-	var s;
-	var c = oRow.cells[nColumn];
-	if (typeof c.innerText != "undefined")
-		s = c.innerText;
-	else
-		s = SortableTable.getInnerText(c);
-	return this.getValueFromString(s, sType);
-};
-
-SortableTable.getInnerText = function (oNode) {
-	var s = "";
-	var cs = oNode.childNodes;
-	var l = cs.length;
-	for (var i = 0; i < l; i++) {
-		switch (cs[i].nodeType) {
-			case 1: //ELEMENT_NODE
-				s += SortableTable.getInnerText(cs[i]);
-				break;
-			case 3:	//TEXT_NODE
-				s += cs[i].nodeValue;
-				break;
-		}
-	}
-	return s;
-};
-
-SortableTable.prototype.getValueFromString = function (sText, sType) {
-	if (this._sortTypeInfo[sType])
-		return this._sortTypeInfo[sType].getValueFromString( sText );
-	return sText;
-	/*
-	switch (sType) {
-		case "Number":
-			return Number(sText);
-		case "CaseInsensitiveString":
-			return sText.toUpperCase();
-		case "Date":
-			var parts = sText.split("-");
-			var d = new Date(0);
-			d.setFullYear(parts[0]);
-			d.setDate(parts[2]);
-			d.setMonth(parts[1] - 1);
-			return d.valueOf();
-	}
-	return sText;
-	*/
-	};
-
-SortableTable.prototype.getSortFunction = function (sType, nColumn) {
-	if (this._sortTypeInfo[sType])
-		return this._sortTypeInfo[sType].compare;
-	return SortableTable.basicCompare;
-};
-
-SortableTable.prototype.destroy = function () {
-	this.uninitHeader();
-	var win = this.document.parentWindow;
-	if (win && typeof win.detachEvent != "undefined") {	// only IE needs this
-		win.detachEvent("onunload", this._onunload);
-	}
-	this._onunload = null;
-	this.element = null;
-	this.tHead = null;
-	this.tBody = null;
-	this.document = null;
-	this._headerOnclick = null;
-	this.sortTypes = null;
-	this._asyncsort = null;
-	this.onsort = null;
-};
-
-// Adds a sort type to all instance of SortableTable
-// sType : String - the identifier of the sort type
-// fGetValueFromString : function ( s : string ) : T - A function that takes a
-//    string and casts it to a desired format. If left out the string is just
-//    returned
-// fCompareFunction : function ( n1 : T, n2 : T ) : Number - A normal JS sort
-//    compare function. Takes two values and compares them. If left out less than,
-//    <, compare is used
-// fGetRowValue : function( oRow : HTMLTRElement, nColumn : int ) : T - A function
-//    that takes the row and the column index and returns the value used to compare.
-//    If left out then the innerText is first taken for the cell and then the
-//    fGetValueFromString is used to convert that string the desired value and type
-
-SortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {
-	this._sortTypeInfo[sType] = {
-		type:				sType,
-		getValueFromString:	fGetValueFromString || SortableTable.idFunction,
-		compare:			fCompareFunction || SortableTable.basicCompare,
-		getRowValue:		fGetRowValue
-	};
-};
-
-// this removes the sort type from all instances of SortableTable
-SortableTable.prototype.removeSortType = function (sType) {
-	delete this._sortTypeInfo[sType];
-};
-
-SortableTable.basicCompare = function compare(n1, n2) {
-	if (n1.value < n2.value)
-		return -1;
-	if (n2.value < n1.value)
-		return 1;
-	return 0;
-};
-
-SortableTable.idFunction = function (x) {
-	return x;
-};
-
-SortableTable.toUpperCase = function (s) {
-	return s.toUpperCase();
-};
-
-SortableTable.toDate = function (s) {
-	var parts = s.split("-");
-	var d = new Date(0);
-	d.setFullYear(parts[0]);
-	d.setDate(parts[2]);
-	d.setMonth(parts[1] - 1);
-	return d.valueOf();
-};
-
-
-// add sort types
-SortableTable.prototype.addSortType("Number", Number);
-SortableTable.prototype.addSortType("CaseInsensitiveString", SortableTable.toUpperCase);
-SortableTable.prototype.addSortType("Date", SortableTable.toDate);
-SortableTable.prototype.addSortType("String");
-// None is a special case
+
+/*----------------------------------------------------------------------------\
+|                            Sortable Table 1.12                              |
+|-----------------------------------------------------------------------------|
+|                         Created by Erik Arvidsson                           |
+|                  (http://webfx.eae.net/contact.html#erik)                   |
+|                      For WebFX (http://webfx.eae.net/)                      |
+|-----------------------------------------------------------------------------|
+| A DOM 1 based script that allows an ordinary HTML table to be sortable.     |
+|-----------------------------------------------------------------------------|
+|                  Copyright (c) 1998 - 2004 Erik Arvidsson                   |
+|-----------------------------------------------------------------------------|
+| This software is provided "as is", without warranty of any kind, express or |
+| implied, including  but not limited  to the warranties of  merchantability, |
+| fitness for a particular purpose and noninfringement. In no event shall the |
+| authors or  copyright  holders be  liable for any claim,  damages or  other |
+| liability, whether  in an  action of  contract, tort  or otherwise, arising |
+| from,  out of  or in  connection with  the software or  the  use  or  other |
+| dealings in the software.                                                   |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| This  software is  available under the  three different licenses  mentioned |
+| below.  To use this software you must chose, and qualify, for one of those. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Non-Commercial License          http://webfx.eae.net/license.html |
+| Permits  anyone the right to use the  software in a  non-commercial context |
+| free of charge.                                                             |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Commercial license           http://webfx.eae.net/commercial.html |
+| Permits the  license holder the right to use  the software in a  commercial |
+| context. Such license must be specifically obtained, however it's valid for |
+| any number of  implementations of the licensed software.                    |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| GPL - The GNU General Public License    http://www.gnu.org/licenses/gpl.txt |
+| Permits anyone the right to use and modify the software without limitations |
+| as long as proper  credits are given  and the original  and modified source |
+| code are included. Requires  that the final product, software derivate from |
+| the original  source or any  software  utilizing a GPL  component, such  as |
+| this, is also licensed under the GPL license.                               |
+|-----------------------------------------------------------------------------|
+| 2003-01-10 | First version                                                  |
+| 2003-01-19 | Minor changes to the date parsing                              |
+| 2003-01-28 | JScript 5.0 fixes (no support for 'in' operator)               |
+| 2003-02-01 | Sloppy typo like error fixed in getInnerText                   |
+| 2003-07-04 | Added workaround for IE cellIndex bug.                         |
+| 2003-11-09 | The bDescending argument to sort was not correctly working     |
+|            | Using onclick DOM0 event if no support for addEventListener    |
+|            | or attachEvent                                                 |
+| 2004-01-13 | Adding addSortType and removeSortType which makes it a lot     |
+|            | easier to add new, custom sort types.                          |
+| 2004-01-27 | Switch to use descending = false as the default sort order.    |
+|            | Change defaultDescending to suit your needs.                   |
+| 2004-03-14 | Improved sort type None look and feel a bit                    |
+| 2004-08-26 | Made the handling of tBody and tHead more flexible. Now you    |
+|            | can use another tHead or no tHead, and you can chose some      |
+|            | other tBody.                                                   |
+|-----------------------------------------------------------------------------|
+| Created 2003-01-10 | All changes are in the log above. | Updated 2004-08-26 |
+\----------------------------------------------------------------------------*/
+
+
+function SortableTable(oTable, oSortTypes) {
+
+	this.sortTypes = oSortTypes || [];
+
+	this.sortColumn = null;
+	this.descending = null;
+
+	var oThis = this;
+	this._headerOnclick = function (e) {
+		oThis.headerOnclick(e);
+	};
+
+	if (oTable) {
+		this.setTable( oTable );
+		this.document = oTable.ownerDocument || oTable.document;
+	}
+	else {
+		this.document = document;
+	}
+
+
+	// only IE needs this
+	var win = this.document.defaultView || this.document.parentWindow;
+	this._onunload = function () {
+		oThis.destroy();
+	};
+	if (win && typeof win.attachEvent != "undefined") {
+		win.attachEvent("onunload", this._onunload);
+	}
+}
+
+SortableTable.gecko = navigator.product == "Gecko";
+SortableTable.msie = /msie/i.test(navigator.userAgent);
+// Mozilla is faster when doing the DOM manipulations on
+// an orphaned element. MSIE is not
+SortableTable.removeBeforeSort = SortableTable.gecko;
+
+SortableTable.prototype.onsort = function () {};
+
+// default sort order. true -> descending, false -> ascending
+SortableTable.prototype.defaultDescending = false;
+
+// shared between all instances. This is intentional to allow external files
+// to modify the prototype
+SortableTable.prototype._sortTypeInfo = {};
+
+SortableTable.prototype.setTable = function (oTable) {
+	if ( this.tHead )
+		this.uninitHeader();
+	this.element = oTable;
+	this.setTHead( oTable.tHead );
+	this.setTBody( oTable.tBodies[0] );
+};
+
+SortableTable.prototype.setTHead = function (oTHead) {
+	if (this.tHead && this.tHead != oTHead )
+		this.uninitHeader();
+	this.tHead = oTHead;
+	this.initHeader( this.sortTypes );
+};
+
+SortableTable.prototype.setTBody = function (oTBody) {
+	this.tBody = oTBody;
+};
+
+SortableTable.prototype.setSortTypes = function ( oSortTypes ) {
+	if ( this.tHead )
+		this.uninitHeader();
+	this.sortTypes = oSortTypes || [];
+	if ( this.tHead )
+		this.initHeader( this.sortTypes );
+};
+
+// adds arrow containers and events
+// also binds sort type to the header cells so that reordering columns does
+// not break the sort types
+SortableTable.prototype.initHeader = function (oSortTypes) {
+	if (!this.tHead) return;
+	var cells = this.tHead.rows[0].cells;
+	var doc = this.tHead.ownerDocument || this.tHead.document;
+	this.sortTypes = oSortTypes || [];
+	var l = cells.length;
+	var img, c;
+	for (var i = 0; i < l; i++) {
+		c = cells[i];
+		if (this.sortTypes[i] != null && this.sortTypes[i] != "None") {
+			img = doc.createElement("IMG");
+			img.src = "images/blank.png";
+			c.appendChild(img);
+			if (this.sortTypes[i] != null)
+				c._sortType = this.sortTypes[i];
+			if (typeof c.addEventListener != "undefined")
+				c.addEventListener("click", this._headerOnclick, false);
+			else if (typeof c.attachEvent != "undefined")
+				c.attachEvent("onclick", this._headerOnclick);
+			else
+				c.onclick = this._headerOnclick;
+		}
+		else
+		{
+			c.setAttribute( "_sortType", oSortTypes[i] );
+			c._sortType = "None";
+		}
+	}
+	this.updateHeaderArrows();
+};
+
+// remove arrows and events
+SortableTable.prototype.uninitHeader = function () {
+	if (!this.tHead) return;
+	var cells = this.tHead.rows[0].cells;
+	var l = cells.length;
+	var c;
+	for (var i = 0; i < l; i++) {
+		c = cells[i];
+		if (c._sortType != null && c._sortType != "None") {
+			c.removeChild(c.lastChild);
+			if (typeof c.removeEventListener != "undefined")
+				c.removeEventListener("click", this._headerOnclick, false);
+			else if (typeof c.detachEvent != "undefined")
+				c.detachEvent("onclick", this._headerOnclick);
+			c._sortType = null;
+			c.removeAttribute( "_sortType" );
+		}
+	}
+};
+
+SortableTable.prototype.updateHeaderArrows = function () {
+	if (!this.tHead) return;
+	var cells = this.tHead.rows[0].cells;
+	var l = cells.length;
+	var img;
+	for (var i = 0; i < l; i++) {
+		if (cells[i]._sortType != null && cells[i]._sortType != "None") {
+			img = cells[i].lastChild;
+			if (i == this.sortColumn)
+				img.className = "sort-arrow " + (this.descending ? "descending" : "ascending");
+			else
+				img.className = "sort-arrow";
+		}
+	}
+};
+
+SortableTable.prototype.headerOnclick = function (e) {
+	// find TD element
+	var el = e.target || e.srcElement;
+	while (el.tagName != "TD")
+		el = el.parentNode;
+
+	this.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);
+};
+
+// IE returns wrong cellIndex when columns are hidden
+SortableTable.getCellIndex = function (oTd) {
+	var cells = oTd.parentNode.childNodes
+	var l = cells.length;
+	var i;
+	for (i = 0; cells[i] != oTd && i < l; i++)
+		;
+	return i;
+};
+
+SortableTable.prototype.getSortType = function (nColumn) {
+	return this.sortTypes[nColumn] || "String";
+};
+
+// only nColumn is required
+// if bDescending is left out the old value is taken into account
+// if sSortType is left out the sort type is found from the sortTypes array
+
+SortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {
+	if (!this.tBody) return;
+	if (sSortType == null)
+		sSortType = this.getSortType(nColumn);
+
+	// exit if None
+	if (sSortType == "None")
+		return;
+
+	if (bDescending == null) {
+		if (this.sortColumn != nColumn)
+			this.descending = this.defaultDescending;
+		else
+			this.descending = !this.descending;
+	}
+	else
+		this.descending = bDescending;
+
+	this.sortColumn = nColumn;
+
+	if (typeof this.onbeforesort == "function")
+		this.onbeforesort();
+
+	var f = this.getSortFunction(sSortType, nColumn);
+	var a = this.getCache(sSortType, nColumn);
+	var tBody = this.tBody;
+
+	a.sort(f);
+
+	if (this.descending)
+		a.reverse();
+
+	if (SortableTable.removeBeforeSort) {
+		// remove from doc
+		var nextSibling = tBody.nextSibling;
+		var p = tBody.parentNode;
+		p.removeChild(tBody);
+	}
+
+	// insert in the new order
+	var l = a.length;
+	for (var i = 0; i < l; i++)
+		tBody.appendChild(a[i].element);
+
+	if (SortableTable.removeBeforeSort) {
+		// insert into doc
+		p.insertBefore(tBody, nextSibling);
+	}
+
+	this.updateHeaderArrows();
+
+	this.destroyCache(a);
+
+	if (typeof this.onsort == "function")
+		this.onsort();
+};
+
+SortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {
+	var oThis = this;
+	this._asyncsort = function () {
+		oThis.sort(nColumn, bDescending, sSortType);
+	};
+	window.setTimeout(this._asyncsort, 1);
+};
+
+SortableTable.prototype.getCache = function (sType, nColumn) {
+	if (!this.tBody) return [];
+	var rows = this.tBody.rows;
+	var l = rows.length;
+	var a = new Array(l);
+	var r;
+	for (var i = 0; i < l; i++) {
+		r = rows[i];
+		a[i] = {
+			value:		this.getRowValue(r, sType, nColumn),
+			element:	r
+		};
+	};
+	return a;
+};
+
+SortableTable.prototype.destroyCache = function (oArray) {
+	var l = oArray.length;
+	for (var i = 0; i < l; i++) {
+		oArray[i].value = null;
+		oArray[i].element = null;
+		oArray[i] = null;
+	}
+};
+
+SortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {
+	// if we have defined a custom getRowValue use that
+	if (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)
+		return this._sortTypeInfo[sType].getRowValue(oRow, nColumn);
+
+	var s;
+	var c = oRow.cells[nColumn];
+	if (typeof c.innerText != "undefined")
+		s = c.innerText;
+	else
+		s = SortableTable.getInnerText(c);
+	return this.getValueFromString(s, sType);
+};
+
+SortableTable.getInnerText = function (oNode) {
+	var s = "";
+	var cs = oNode.childNodes;
+	var l = cs.length;
+	for (var i = 0; i < l; i++) {
+		switch (cs[i].nodeType) {
+			case 1: //ELEMENT_NODE
+				s += SortableTable.getInnerText(cs[i]);
+				break;
+			case 3:	//TEXT_NODE
+				s += cs[i].nodeValue;
+				break;
+		}
+	}
+	return s;
+};
+
+SortableTable.prototype.getValueFromString = function (sText, sType) {
+	if (this._sortTypeInfo[sType])
+		return this._sortTypeInfo[sType].getValueFromString( sText );
+	return sText;
+	/*
+	switch (sType) {
+		case "Number":
+			return Number(sText);
+		case "CaseInsensitiveString":
+			return sText.toUpperCase();
+		case "Date":
+			var parts = sText.split("-");
+			var d = new Date(0);
+			d.setFullYear(parts[0]);
+			d.setDate(parts[2]);
+			d.setMonth(parts[1] - 1);
+			return d.valueOf();
+	}
+	return sText;
+	*/
+	};
+
+SortableTable.prototype.getSortFunction = function (sType, nColumn) {
+	if (this._sortTypeInfo[sType])
+		return this._sortTypeInfo[sType].compare;
+	return SortableTable.basicCompare;
+};
+
+SortableTable.prototype.destroy = function () {
+	this.uninitHeader();
+	var win = this.document.parentWindow;
+	if (win && typeof win.detachEvent != "undefined") {	// only IE needs this
+		win.detachEvent("onunload", this._onunload);
+	}
+	this._onunload = null;
+	this.element = null;
+	this.tHead = null;
+	this.tBody = null;
+	this.document = null;
+	this._headerOnclick = null;
+	this.sortTypes = null;
+	this._asyncsort = null;
+	this.onsort = null;
+};
+
+// Adds a sort type to all instance of SortableTable
+// sType : String - the identifier of the sort type
+// fGetValueFromString : function ( s : string ) : T - A function that takes a
+//    string and casts it to a desired format. If left out the string is just
+//    returned
+// fCompareFunction : function ( n1 : T, n2 : T ) : Number - A normal JS sort
+//    compare function. Takes two values and compares them. If left out less than,
+//    <, compare is used
+// fGetRowValue : function( oRow : HTMLTRElement, nColumn : int ) : T - A function
+//    that takes the row and the column index and returns the value used to compare.
+//    If left out then the innerText is first taken for the cell and then the
+//    fGetValueFromString is used to convert that string the desired value and type
+
+SortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {
+	this._sortTypeInfo[sType] = {
+		type:				sType,
+		getValueFromString:	fGetValueFromString || SortableTable.idFunction,
+		compare:			fCompareFunction || SortableTable.basicCompare,
+		getRowValue:		fGetRowValue
+	};
+};
+
+// this removes the sort type from all instances of SortableTable
+SortableTable.prototype.removeSortType = function (sType) {
+	delete this._sortTypeInfo[sType];
+};
+
+SortableTable.basicCompare = function compare(n1, n2) {
+	if (n1.value < n2.value)
+		return -1;
+	if (n2.value < n1.value)
+		return 1;
+	return 0;
+};
+
+SortableTable.idFunction = function (x) {
+	return x;
+};
+
+SortableTable.toUpperCase = function (s) {
+	return s.toUpperCase();
+};
+
+SortableTable.toDate = function (s) {
+	var parts = s.split("-");
+	var d = new Date(0);
+	d.setFullYear(parts[0]);
+	d.setDate(parts[2]);
+	d.setMonth(parts[1] - 1);
+	return d.valueOf();
+};
+
+
+// add sort types
+SortableTable.prototype.addSortType("Number", Number);
+SortableTable.prototype.addSortType("CaseInsensitiveString", SortableTable.toUpperCase);
+SortableTable.prototype.addSortType("Date", SortableTable.toDate);
+SortableTable.prototype.addSortType("String");
+// None is a special case
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/source-viewer.css b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/source-viewer.css
similarity index 93%
rename from src/net/sourceforge/cobertura/reporting/html/files/source-viewer.css
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/source-viewer.css
index 73797d6..125a994 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/source-viewer.css
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/source-viewer.css
@@ -1,73 +1,73 @@
-pre.src {
-    background: #ffffff;
-    margin-top: 0px;
-    margin-bottom: 0px;
-}
-
-table.src {
-	border: #dcdcdc 1px solid;
-	font-size: 16px;
-}
-
-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.nbHits {
-    background: #f0f0f0;
-    border-right: #dcdcdc 1px solid;
-    padding-right: 3px;
-    text-align: right;
-}
-
-td.nbHitsCovered {
-    background: #80ff80;
-    border-right: #dcdcdc 1px solid;
-    padding-right: 3px;
-    text-align: right;
-}
-
-td.nbHitsUncovered {
-    background: #ff9090;
-    border-right: #dcdcdc 1px solid;
-    font-weight: bold;
-    padding-right: 3px;
-    text-align: right;
-}
-
-td.src {
-    width: 100%;
-}
-
-span.comment {
-    color: #b22222;
-    font-style: italic;
-}
-
-span.keyword {
-    color: #2020bf;
-    font-weight: bold;
-}
-
-span.srcUncovered {
-    background: #ff9090;
-}
-
-span.string {
-    color: #2a00ff;
-}
-
-span.text_italic {
-	font-size: 12px;
-    font-style: italic;
-}
+pre.src {
+    background: #ffffff;
+    margin-top: 0px;
+    margin-bottom: 0px;
+}
+
+table.src {
+	border: #dcdcdc 1px solid;
+	font-size: 16px;
+}
+
+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.nbHits {
+    background: #f0f0f0;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: right;
+}
+
+td.nbHitsCovered {
+    background: #80ff80;
+    border-right: #dcdcdc 1px solid;
+    padding-right: 3px;
+    text-align: right;
+}
+
+td.nbHitsUncovered {
+    background: #ff9090;
+    border-right: #dcdcdc 1px solid;
+    font-weight: bold;
+    padding-right: 3px;
+    text-align: right;
+}
+
+td.src {
+    width: 100%;
+}
+
+span.comment {
+    color: #b22222;
+    font-style: italic;
+}
+
+span.keyword {
+    color: #2020bf;
+    font-weight: bold;
+}
+
+span.srcUncovered {
+    background: #ff9090;
+}
+
+span.string {
+    color: #2a00ff;
+}
+
+span.text_italic {
+	font-size: 12px;
+    font-style: italic;
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/stringbuilder.js b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/stringbuilder.js
similarity index 98%
rename from src/net/sourceforge/cobertura/reporting/html/files/stringbuilder.js
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/stringbuilder.js
index 464a1ca..1808126 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/stringbuilder.js
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/stringbuilder.js
@@ -1,79 +1,79 @@
-/*----------------------------------------------------------------------------\
-|                             String Builder 1.02                             |
-|-----------------------------------------------------------------------------|
-|                         Created by Erik Arvidsson                           |
-|                  (http://webfx.eae.net/contact.html#erik)                   |
-|                      For WebFX (http://webfx.eae.net/)                      |
-|-----------------------------------------------------------------------------|
-| A class that allows more efficient building of strings than concatenation.  |
-|-----------------------------------------------------------------------------|
-|                  Copyright (c) 1999 - 2002 Erik Arvidsson                   |
-|-----------------------------------------------------------------------------|
-| This software is provided "as is", without warranty of any kind, express or |
-| implied, including  but not limited  to the warranties of  merchantability, |
-| fitness for a particular purpose and noninfringement. In no event shall the |
-| authors or  copyright  holders be  liable for any claim,  damages or  other |
-| liability, whether  in an  action of  contract, tort  or otherwise, arising |
-| from,  out of  or in  connection with  the software or  the  use  or  other |
-| dealings in the software.                                                   |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| This  software is  available under the  three different licenses  mentioned |
-| below.  To use this software you must chose, and qualify, for one of those. |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| The WebFX Non-Commercial License          http://webfx.eae.net/license.html |
-| Permits  anyone the right to use the  software in a  non-commercial context |
-| free of charge.                                                             |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| The WebFX Commercial license           http://webfx.eae.net/commercial.html |
-| Permits the  license holder the right to use  the software in a  commercial |
-| context. Such license must be specifically obtained, however it's valid for |
-| any number of  implementations of the licensed software.                    |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| GPL - The GNU General Public License    http://www.gnu.org/licenses/gpl.txt |
-| Permits anyone the right to use and modify the software without limitations |
-| as long as proper  credits are given  and the original  and modified source |
-| code are included. Requires  that the final product, software derivate from |
-| the original  source or any  software  utilizing a GPL  component, such  as |
-| this, is also licensed under the GPL license.                               |
-|-----------------------------------------------------------------------------|
-| 2000-10-02 | First version                                                  |
-| 2000-10-05 | Added a cache of the string so that it does not need to be     |
-|            | regenerated every time in toString                             |
-| 2002-10-03 | Added minor improvement in the toString method                 |
-|-----------------------------------------------------------------------------|
-| Created 2000-10-02 | All changes are in the log above. | Updated 2002-10-03 |
-\----------------------------------------------------------------------------*/ function StringBuilder(sString) {
-	
-	// public
-	this.length = 0;
-	
-	this.append = function (sString) {
-		// append argument
-		this.length += (this._parts[this._current++] = String(sString)).length;
-		
-		// reset cache
-		this._string = null;
-		return this;
-	};
-	
-	this.toString = function () {
-		if (this._string != null)
-			return this._string;
-		
-		var s = this._parts.join("");
-		this._parts = [s];
-		this._current = 1;
-		this.length = s.length;
-		
-		return this._string = s;
-	};
-
-	// private
-	this._current	= 0;
-	this._parts		= [];
-	this._string	= null;	// used to cache the string
-	
-	// init
-	if (sString != null)
-		this.append(sString);
-}
+/*----------------------------------------------------------------------------\
+|                             String Builder 1.02                             |
+|-----------------------------------------------------------------------------|
+|                         Created by Erik Arvidsson                           |
+|                  (http://webfx.eae.net/contact.html#erik)                   |
+|                      For WebFX (http://webfx.eae.net/)                      |
+|-----------------------------------------------------------------------------|
+| A class that allows more efficient building of strings than concatenation.  |
+|-----------------------------------------------------------------------------|
+|                  Copyright (c) 1999 - 2002 Erik Arvidsson                   |
+|-----------------------------------------------------------------------------|
+| This software is provided "as is", without warranty of any kind, express or |
+| implied, including  but not limited  to the warranties of  merchantability, |
+| fitness for a particular purpose and noninfringement. In no event shall the |
+| authors or  copyright  holders be  liable for any claim,  damages or  other |
+| liability, whether  in an  action of  contract, tort  or otherwise, arising |
+| from,  out of  or in  connection with  the software or  the  use  or  other |
+| dealings in the software.                                                   |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| This  software is  available under the  three different licenses  mentioned |
+| below.  To use this software you must chose, and qualify, for one of those. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Non-Commercial License          http://webfx.eae.net/license.html |
+| Permits  anyone the right to use the  software in a  non-commercial context |
+| free of charge.                                                             |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Commercial license           http://webfx.eae.net/commercial.html |
+| Permits the  license holder the right to use  the software in a  commercial |
+| context. Such license must be specifically obtained, however it's valid for |
+| any number of  implementations of the licensed software.                    |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| GPL - The GNU General Public License    http://www.gnu.org/licenses/gpl.txt |
+| Permits anyone the right to use and modify the software without limitations |
+| as long as proper  credits are given  and the original  and modified source |
+| code are included. Requires  that the final product, software derivate from |
+| the original  source or any  software  utilizing a GPL  component, such  as |
+| this, is also licensed under the GPL license.                               |
+|-----------------------------------------------------------------------------|
+| 2000-10-02 | First version                                                  |
+| 2000-10-05 | Added a cache of the string so that it does not need to be     |
+|            | regenerated every time in toString                             |
+| 2002-10-03 | Added minor improvement in the toString method                 |
+|-----------------------------------------------------------------------------|
+| Created 2000-10-02 | All changes are in the log above. | Updated 2002-10-03 |
+\----------------------------------------------------------------------------*/ function StringBuilder(sString) {
+	
+	// public
+	this.length = 0;
+	
+	this.append = function (sString) {
+		// append argument
+		this.length += (this._parts[this._current++] = String(sString)).length;
+		
+		// reset cache
+		this._string = null;
+		return this;
+	};
+	
+	this.toString = function () {
+		if (this._string != null)
+			return this._string;
+		
+		var s = this._parts.join("");
+		this._parts = [s];
+		this._current = 1;
+		this.length = s.length;
+		
+		return this._string = s;
+	};
+
+	// private
+	this._current	= 0;
+	this._parts		= [];
+	this._string	= null;	// used to cache the string
+	
+	// init
+	if (sString != null)
+		this.append(sString);
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/tooltip.css b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/tooltip.css
similarity index 94%
rename from src/net/sourceforge/cobertura/reporting/html/files/tooltip.css
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/tooltip.css
index c790d81..7c8050c 100644
--- a/src/net/sourceforge/cobertura/reporting/html/files/tooltip.css
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/tooltip.css
@@ -1,49 +1,49 @@
-a.hastooltip {
-	border-bottom: 1px dotted #00aa00;
-	color: #000000;
-	cursor: help;
-	font-style: normal;
-	position: relative; /* This is the key */
-	text-decoration: none;
-	z-index: 24; /* What does this do? */
-}
-
-a.hastooltip:active {
-	color: #000000;
-	text-decoration: none;
-}
-
-a.hastooltip:link {
-	color: #000000;
-	text-decoration: none;
-}
-
-a.hastooltip:hover {
-	background-color: #a0b8ff;
-	color: #000000;
-	text-decoration: none;
-	z-index: 25;
-}
-
-a.hastooltip:visited {
-	color: #000000;
-	text-decoration: none;
-}
-
-a.hastooltip span {
-	display: none;
-}
-
-a.hastooltip:hover span {
-	background-color: #eeeeee;
-	border: 1px solid #000000;
-	color: #000000;
-	display: block;
-	padding: 5px;
-	left: -15.2em;
-	position: absolute;
-	text-align: center;
-	text-decoration: none;
-	top: 2em;
-	width: 20em;
-}
+a.hastooltip {
+	border-bottom: 1px dotted #00aa00;
+	color: #000000;
+	cursor: help;
+	font-style: normal;
+	position: relative; /* This is the key */
+	text-decoration: none;
+	z-index: 24; /* What does this do? */
+}
+
+a.hastooltip:active {
+	color: #000000;
+	text-decoration: none;
+}
+
+a.hastooltip:link {
+	color: #000000;
+	text-decoration: none;
+}
+
+a.hastooltip:hover {
+	background-color: #a0b8ff;
+	color: #000000;
+	text-decoration: none;
+	z-index: 25;
+}
+
+a.hastooltip:visited {
+	color: #000000;
+	text-decoration: none;
+}
+
+a.hastooltip span {
+	display: none;
+}
+
+a.hastooltip:hover span {
+	background-color: #eeeeee;
+	border: 1px solid #000000;
+	color: #000000;
+	display: block;
+	padding: 5px;
+	left: -15.2em;
+	position: absolute;
+	text-align: center;
+	text-decoration: none;
+	top: 2em;
+	width: 20em;
+}
diff --git a/src/net/sourceforge/cobertura/reporting/html/files/upsimple.png b/cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/upsimple.png
similarity index 100%
rename from src/net/sourceforge/cobertura/reporting/html/files/upsimple.png
rename to cobertura/src/main/resources/net/sourceforge/cobertura/reporting/html/files/upsimple.png
diff --git a/src/net/sourceforge/cobertura/webapp/web.xml b/cobertura/src/main/resources/net/sourceforge/cobertura/webapp/web.xml
similarity index 90%
rename from src/net/sourceforge/cobertura/webapp/web.xml
rename to cobertura/src/main/resources/net/sourceforge/cobertura/webapp/web.xml
index e81e5b5..753d5ca 100644
--- a/src/net/sourceforge/cobertura/webapp/web.xml
+++ b/cobertura/src/main/resources/net/sourceforge/cobertura/webapp/web.xml
@@ -1,42 +1,41 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
-<!--
- Copyright (C) 2009 Amit Nithianandan
-
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
-    version="2.4">
-
-
-  <servlet>
-    <servlet-name>CoberturaFlushServlet</servlet-name>
-    <display-name>CoberturaFlushServlet</display-name>
-    <description>CoberturaFlushServlet</description>
-    <servlet-class>net.sourceforge.cobertura.webapp.FlushCoberturaServlet</servlet-class>
-    <load-on-startup>1</load-on-startup>
-  </servlet>
-
-  
-  <servlet-mapping>
-    <servlet-name>CoberturaFlushServlet</servlet-name>
-    <url-pattern>/flushCobertura</url-pattern>
-  </servlet-mapping>
- 
-</web-app>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2009 Amit Nithianandan
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
+    version="2.4">
+
+
+  <servlet>
+    <description>CoberturaFlushServlet</description>
+    <display-name>CoberturaFlushServlet</display-name>
+    <servlet-name>CoberturaFlushServlet</servlet-name>
+    <servlet-class>net.sourceforge.cobertura.webapp.FlushCoberturaServlet</servlet-class>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+
+  
+  <servlet-mapping>
+    <servlet-name>CoberturaFlushServlet</servlet-name>
+    <url-pattern>/flushCobertura</url-pattern>
+  </servlet-mapping>
+ 
+</web-app>
diff --git a/etc/tasks.properties b/cobertura/src/main/resources/tasks.properties
similarity index 98%
rename from etc/tasks.properties
rename to cobertura/src/main/resources/tasks.properties
index 77e0d60..9d1fcc4 100644
--- a/etc/tasks.properties
+++ b/cobertura/src/main/resources/tasks.properties
@@ -1,4 +1,4 @@
-cobertura-instrument=net.sourceforge.cobertura.ant.InstrumentTask
-cobertura-merge=net.sourceforge.cobertura.ant.MergeTask
-cobertura-report=net.sourceforge.cobertura.ant.ReportTask
-cobertura-check=net.sourceforge.cobertura.ant.CheckTask
+cobertura-instrument=net.sourceforge.cobertura.ant.InstrumentTask
+cobertura-merge=net.sourceforge.cobertura.ant.MergeTask
+cobertura-report=net.sourceforge.cobertura.ant.ReportTask
+cobertura-check=net.sourceforge.cobertura.ant.CheckTask
diff --git a/cobertura/src/test/java/com/acme/servlet/SimpleServlet.java b/cobertura/src/test/java/com/acme/servlet/SimpleServlet.java
new file mode 100644
index 0000000..e367a19
--- /dev/null
+++ b/cobertura/src/test/java/com/acme/servlet/SimpleServlet.java
@@ -0,0 +1,23 @@
+package com.acme.servlet;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.PrintWriter;
+import java.io.IOException;
+
+public class SimpleServlet extends HttpServlet {
+	protected void doGet(HttpServletRequest req, HttpServletResponse response)
+			throws IOException {
+		response.setContentType("text/html;charset=UTF-8");
+		PrintWriter out = response.getWriter();
+		try {
+			out.println("Hi");
+		} finally {
+			if (out != null) {
+				out.close();
+			}
+		}
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/ant/AbstractCoberturaAntTestCase.java b/cobertura/src/test/java/net/sourceforge/cobertura/ant/AbstractCoberturaAntTestCase.java
new file mode 100644
index 0000000..cd2189a
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/ant/AbstractCoberturaAntTestCase.java
@@ -0,0 +1,70 @@
+package net.sourceforge.cobertura.ant;
+
+import groovy.util.Node;
+
+import java.io.File;
+
+import net.sourceforge.cobertura.test.util.TestUtils;
+
+import org.apache.tools.ant.BuildLogger;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.MagicNames;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.junit.Rule;
+import org.junit.rules.TestName;
+
+/**
+ * Tutorial on how to add a new Ant Test unit.
+ * 
+ * In this case we are creating a new argument called IgnoreMethodAnnotations.
+ * 
+ * 1. Copy src/test/resources/ant/basic and rename the folder. In this case we rename to IgnoreMethodAnnotations.
+ * 2. Make a new test unit (call it IgnoreMethodAnnotationAntTest) and extend this class.
+ * 3. In test unit, set buildXmlFile = src/test/resources/ant/IgnoreMethodAnnotations/build.xml.
+ * 4. Make modification to the build.xml file accordingly.
+ * 5. To execute ant, call super.executeAntTarget(TARGET_NAME)
+ * 6. To verify execution there are helper methods that can do verification for you.
+ *      If you would like to obtain the xml document it is public groovy.util.Node dom.
+ * 
+ * 
+ * @author schristou88
+ *
+ */
+public class AbstractCoberturaAntTestCase {
+	public File buildXmlFile;
+	@Rule
+	public TestName name = new TestName();
+	public Node dom;
+
+	/**
+	 * NOTE: Must set the baseDir before executing this command.
+	 * 
+	 * @param target Name of the target
+	 * @throws Exception 
+	 */
+	public void executeAntTarget(String target) throws Exception {
+		Exception error = null;
+		Project project = new Project();
+		BuildLogger buildLogger = new DefaultLogger();
+		buildLogger.setErrorPrintStream(System.err);
+		buildLogger.setOutputPrintStream(System.out);
+		try {
+			project.addBuildListener(buildLogger);
+			project.fireBuildStarted();
+			project.init();
+			project.setUserProperty(MagicNames.ANT_FILE, buildXmlFile
+					.getAbsolutePath());
+			ProjectHelper.configureProject(project, buildXmlFile);
+			project.executeTarget(target);
+		} catch (Exception e) {
+			error = e;
+			throw e;
+		} finally {
+			project.fireBuildFinished(error);
+		}
+
+		dom = TestUtils.getXMLReportDOM(new File(buildXmlFile.getParentFile(),
+				"reports/cobertura-xml/coverage.xml"));
+	}
+}
\ No newline at end of file
diff --git a/test/net/sourceforge/cobertura/ant/FunctionalConditionCoverageTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/ant/FunctionalConditionCoverageTest.java
similarity index 58%
rename from test/net/sourceforge/cobertura/ant/FunctionalConditionCoverageTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/ant/FunctionalConditionCoverageTest.java
index 94e9e51..89a49e9 100644
--- a/test/net/sourceforge/cobertura/ant/FunctionalConditionCoverageTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/ant/FunctionalConditionCoverageTest.java
@@ -1,447 +1,458 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2006 Mark Doliner
- * 
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License 1.1 (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.TestCase;
-import net.sourceforge.cobertura.reporting.JUnitXMLHelper;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Java;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.Path.PathElement;
-import org.jdom.Attribute;
-import org.jdom.DataConversionException;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.xpath.XPath;
-
-import test.condition.ConditionCalls;
-
-/**
- * These tests generally exec ant to run a test.xml file.  A different target is used for
- * each test.  The text.xml file sets up a test, instruments, runs junit, and generates a
- * coverage xml report.  Then the xml report is parsed and checked.
- * 
- * @author jwlewi
- */
-public class FunctionalConditionCoverageTest extends TestCase
-{
-
-	private final static File BASEDIR = new File((System.getProperty("basedir") != null) ? System
-			.getProperty("basedir") : ".", "examples/functionalconditiontest");
-
-	private final static String CONDITION_MISSING_TRUE = "50%";
-	private final static String CONDITION_MISSING_FALSE = "50%";
-	
-	private final static Map testInfoMap = new HashMap();
-	
-	static
-	{
-		ConditionTestInfo[] expectedConditions;
-		TestInfo info;
-		
-		/*
-		 * Load expected information into testInfoMap for each method.
-		 */
-		expectedConditions = new ConditionTestInfo[1];
-		expectedConditions[0] = new ConditionTestInfo("0", "jump", CONDITION_MISSING_FALSE);
-
-		info = new TestInfo(ConditionCalls.CALL_CONDITION_LINE_NUMBER, "50% (1/2)", expectedConditions);
-		info.setIgnoreLineNumber(ConditionCalls.CALL_IGNORE_LINE_NUMBER);
-
-		testInfoMap.put("call", info);
-		
-		expectedConditions = new ConditionTestInfo[1];
-		expectedConditions[0] = new ConditionTestInfo("0", "switch", "33%");
-		
-		info = new TestInfo(ConditionCalls.LOOKUP_SWITCH_LINE_NUMBER, "33% (1/3)", expectedConditions);
-
-		testInfoMap.put("callLookupSwitch", info);
-		
-		expectedConditions = new ConditionTestInfo[1];
-		expectedConditions[0] = new ConditionTestInfo("0", "switch", "10%");
-
-		info = new TestInfo(ConditionCalls.TABLE_SWITCH_LINE_NUMBER, "10% (1/10)", expectedConditions);
-
-		testInfoMap.put("callTableSwitch", info);
-		
-		expectedConditions = new ConditionTestInfo[3];
-		expectedConditions[0] = new ConditionTestInfo("0", "jump", CONDITION_MISSING_TRUE);
-		expectedConditions[1] = new ConditionTestInfo("1", "jump", "0%");
-		expectedConditions[2] = new ConditionTestInfo("2", "jump", CONDITION_MISSING_FALSE);
-
-		info = new TestInfo(ConditionCalls.MULTI_CONDITION_LINE_NUMBER, "33% (2/6)", expectedConditions);
-
-		testInfoMap.put("callMultiCondition", info);
-		
-		expectedConditions = new ConditionTestInfo[3];
-		expectedConditions[0] = new ConditionTestInfo("0", "jump", CONDITION_MISSING_FALSE);
-		expectedConditions[1] = new ConditionTestInfo("1", "jump", CONDITION_MISSING_FALSE);
-		expectedConditions[2] = new ConditionTestInfo("2", "jump", "0%");
-
-		info = new TestInfo(ConditionCalls.MULTI_CONDITION2_LINE_NUMBER, "33% (2/6)", expectedConditions);
-
-		testInfoMap.put("callMultiCondition2", info);
-	};
-	
-	private static class TestInfo
-	{
-		int conditionNumber;
-		String expectedLineConditionCoverage;
-		ConditionTestInfo[] expectedConditions;
-		Integer ignoreLineNumber;
-
-		TestInfo(int conditionNumber, String expectedLineConditionCoverage, ConditionTestInfo[] expectedConditions)
-		{
-			this.conditionNumber = conditionNumber;
-			this.expectedLineConditionCoverage = expectedLineConditionCoverage;
-			this.expectedConditions = expectedConditions;
-		}
-
-		public void setIgnoreLineNumber(int number) {
-			ignoreLineNumber = new Integer(number);
-		}
-	}
-	private static class ConditionTestInfo
-	{
-		String number;
-		String type;
-		String coverage;
-		
-		ConditionTestInfo(String number, String type, String coverage)
-		{
-			this.number = number;
-			this.type = type;
-			this.coverage = coverage;
-		}
-	}
-
-	public static void testConditionCoverage() throws Exception
-	{
-		runTestAntScript("condition-coverage", "test-condition-coverage");
-		verify("condition-coverage");
-	}
-
-	private static void verify(String testName) throws Exception
-	{
-		verifyXml(testName);
-		verifyHtml(testName);
-	}
-
-	private static void verifyXml(String testName) throws Exception
-	{
-		// Get a list of all classes listed in the XML report
-		List classesList = getClassElements();
-		assertTrue("Test " + testName + ": Did not find any classes listed in the XML report.",
-				classesList.size() > 0);
-
-		boolean conditionCallsClassFound = false;
-		for (Iterator iter = classesList.iterator(); iter.hasNext();)
-		{
-			Element classElement = (Element)iter.next();
-			String className = classElement.getAttributeValue("name");
-			if (className.equals("test.condition.ConditionCalls"))
-			{
-				conditionCallsClassFound = true;
-			}
-			else
-				fail("Test "
-						+ testName
-						+ ": Found a class with the name '"
-						+ className
-						+ "' in the XML report, but was only expecting 'test.condition.ConditionCalls'.");
-			verifyClass(testName, classElement);
-		}
-		assertTrue("Test " + testName + ": Did not find class 'test.condition.ConditionCalls' in the XML report.",
-				conditionCallsClassFound);
-	}
-
-	/**
-	 * Use XPath to get all <class> elements in the
-	 * cobertura.xml file under the given directory.
-	 * @return A list of JDOM Elements.
-	 */
-	private static List getClassElements() throws IOException, JDOMException
-	{
-		File xmlFile = new File(BASEDIR, "reports/cobertura-xml/coverage.xml");
-		Document document = JUnitXMLHelper.readXmlFile(xmlFile, true);
-		XPath xpath = XPath.newInstance("/coverage/packages/package/classes/class");
-		List classesList = xpath.selectNodes(document);
-		return classesList;
-	}
-
-	/**
-	 * Verify that the class's condition information is correct.
-	 */
-	private static void verifyClass(String testName, Element classElement)
-	{
-		// Get a list of methods
-		Element methodsElement = classElement.getChild("methods");
-		List methodList = methodsElement.getChildren("method");
-		assertTrue("Test " + testName + ": Did not find any methods listed in the class "
-				+ classElement.getAttributeValue("name"), methodList.size() > 0);
-		List methodsFound = new ArrayList();
-		for (Iterator iter = methodList.iterator(); iter.hasNext();)
-		{
-			Element methodElement = (Element)iter.next();
-			String methodName = methodElement.getAttributeValue("name");
-			TestInfo info = (TestInfo) testInfoMap.get(methodName);
-			if (info != null)
-			{
-				if (methodsFound.contains(methodName))
-				{
-					fail("Test " + testName
-							+ ": Found more than one instance of the method " + methodName + " in the class "
-							+ classElement.getAttributeValue("name"));
-				}
-				methodsFound.add(methodName);
-				
-				verifyMethod(info, testName, classElement, methodElement);
-			}
-			else if (methodName.equals("<clinit>") || 
-					methodName.equals("<init>") || 
-					methodName.startsWith("util") ||
-					methodName.equals("class$"))
-			{
-				// These methods are ok--ignore them.
-			}
-			else
-			{
-				fail("Test " + testName + ": Found method " + methodName + " in the class "
-						+ classElement.getAttributeValue("name")
-						+ ", but was only expecting either 'call' or 'dontCall'.");
-			}
-		}
-		/*
-		 * now make sure all methods in testInfoMap were found and verified
-		 */
-		for (Iterator iter = testInfoMap.keySet().iterator(); iter.hasNext();) {
-			String methodName = (String) iter.next();
-			assertTrue("Test " + testName + ": Did not find method " + methodName + " in the class "
-					+ classElement.getAttributeValue("name"), methodsFound.contains(methodName));
-		}
-	}
-
-	private static void verifyMethod(TestInfo info, String testName, Element classElement, Element methodElement) {
-		Element linesElement = methodElement.getChild("lines");
-		List lineList = linesElement.getChildren("line");
-		String methodName = methodElement.getAttributeValue("name");
-		assertTrue("Test " + testName + ", class " + classElement.getAttributeValue("name")
-				+ ": Did not find any lines in the method "
-				+ methodName, lineList.size() > 0);
-
-		boolean foundCondition = false;
-		for (Iterator iter = lineList.iterator(); iter.hasNext();)
-		{
-			Element lineElement = (Element)iter.next();
-			int number;
-			try {
-				number = lineElement.getAttribute("number").getIntValue();
-				if ((info.ignoreLineNumber != null) && (info.ignoreLineNumber.intValue() == number))
-				{
-					fail("Expected line " + info.ignoreLineNumber + " to be ignored.");
-				}
-			} catch (DataConversionException e) {
-				throw new RuntimeException(e.toString());
-			}
-			if (number == info.conditionNumber) {
-				foundCondition = true;
-				verifyLineConditionInfo(lineElement, info.conditionNumber, 
-						info.expectedLineConditionCoverage, info.expectedConditions);
-			}
-		}
-		assertTrue("Expected condition element for line " + info.conditionNumber + " of " + methodName, foundCondition);
-	}
-
-	private static void verifyLineConditionInfo(Element lineElement, int conditionLineNumber, 
-			String expectedLineConditionCoverage, ConditionTestInfo[] expectedConditions)
-	{
-		String errorMessage = "Line " + conditionLineNumber;
-		boolean branch = false;
-		try {
-			branch = lineElement.getAttribute("branch").getBooleanValue();
-		} catch (DataConversionException e) {
-			fail(errorMessage + " has missing or wrong branch attribute");
-		}
-		assertTrue(errorMessage + "Branch attribute should be true", branch);
-		
-		String lineCoverageStr = getRequiredAttribute(lineElement, "condition-coverage", errorMessage).getValue();
-		assertEquals(errorMessage + " has incorrect condition-coverage", expectedLineConditionCoverage, lineCoverageStr);
-		
-		List conditionList = lineElement.getChildren("conditions");
-		assertTrue(errorMessage + " should have one and only one conditions element.", conditionList.size() == 1);
-		conditionList = ((Element) conditionList.get(0)).getChildren("condition");
-		
-		assertEquals(errorMessage + " has incorrect number of condition elements.", expectedConditions.length, conditionList.size());
-		
-		errorMessage = "Condition for " + conditionLineNumber;
-
-		int i = 0;
-		for (Iterator iter = conditionList.iterator(); iter.hasNext(); i++) {
-			Element element = (Element) iter.next();
-			verifyCondition(element, errorMessage, expectedConditions[i]);
-		}
-	}
-	
-	private static void verifyCondition(Element conditionElement, String errorMessage, ConditionTestInfo info)
-	{
-		String numberStr = getRequiredAttribute(conditionElement, "number", errorMessage).getValue();
-		assertEquals(errorMessage + " has incorrect number", info.number, numberStr);
-		String typeStr = getRequiredAttribute(conditionElement, "type", errorMessage).getValue();
-		assertEquals(errorMessage + " has incorrect type", info.type, typeStr);
-		String coverageStr = getRequiredAttribute(conditionElement, "coverage", errorMessage).getValue();
-		assertEquals(errorMessage + " has incorrect coverage", info.coverage, coverageStr);
-	}
-	
-	private static Attribute getRequiredAttribute(Element element, String attribute, String errorMessage) {
-		Attribute attr = element.getAttribute(attribute);
-		assertNotNull(errorMessage + " has missing " + attribute + " attribute.", attr);
-		return attr;
-	}
-
-	private static void verifyHtml(String testName) throws Exception
-	{
-		File htmlReportDir = new File(BASEDIR, "reports/cobertura-html");
-
-		// Get all files from report directory
-		String htmlFiles[] = htmlReportDir.list(new FilenameFilter()
-		{
-
-			public boolean accept(File dir, String name)
-			{
-				return name.endsWith(".html");
-			}
-		});
-		Arrays.sort(htmlFiles);
-
-		assertTrue(htmlFiles.length >= 5);
-
-		// Assert that all required files are there
-		String[] requiredFiles = { "index.html", "help.html", "frame-packages.html",
-				"frame-summary.html", "frame-sourcefiles.html" };
-
-		for (int i = 0; i < requiredFiles.length; i++)
-		{
-			if (!containsFile(htmlFiles, requiredFiles[i]))
-			{
-				fail("Test " + testName + ": File " + requiredFiles[i]
-						+ " not found among report files");
-			}
-		}
-
-		// Validate selected files
-		String previousPrefix = "NONE";
-		for (int i = 0; i < htmlFiles.length; i++)
-		{
-			// Validate file if has prefix different than previous one, or is required file
-			if (containsFile(requiredFiles, htmlFiles[i])
-					|| !htmlFiles[i].startsWith(previousPrefix))
-			{
-				JUnitXMLHelper.readXmlFile(new File(htmlReportDir, htmlFiles[i]), true);
-			}
-			if (htmlFiles[i].length() > 7)
-			{
-				previousPrefix = htmlFiles[i].substring(0, 7);
-			}
-			else
-			{
-				previousPrefix = htmlFiles[i];
-			}
-		}
-	}
-
-	private static boolean containsFile(String[] files, String fileName)
-	{
-		for (int i = 0; i < files.length; i++)
-		{
-			if (files[i].equals(fileName))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Use the ant 'java' task to run the test.xml
-	 * file and the specified target.
-	 */
-	private static void runTestAntScript(String testName, String target) throws IOException
-	{
-		Java task = new Java();
-		task.setTaskName("java");
-		task.setProject(new Project());
-		task.init();
-
-		// Call ant launcher.  Requires ant-lancher.jar.
-		task.setClassname("org.apache.tools.ant.launch.Launcher");
-		task.setFork(true);
-
-		AntUtil.transferCoberturaDataFileProperty(task);
-
-		task.createArg().setValue("-f");
-		task.createArg().setValue(BASEDIR + "/build.xml");
-		task.createArg().setValue(target);
-
-		task.setFailonerror(true);
-
-		// Set output to go to a temp file
-		File outputFile = Util.createTemporaryTextFile("cobertura-test");
-		task.setOutput(outputFile);
-
-		// Set the classpath to the same classpath as this JVM
-		Path classpath = task.createClasspath();
-		PathElement pathElement = classpath.createPathElement();
-		pathElement.setPath(System.getProperty("java.class.path"));
-
-		try
-		{
-			task.execute();
-		}
-		finally
-		{
-			if (outputFile.exists())
-			{
-				// Put the contents of the output file in the exception
-				System.out.println("\n\n\nOutput from Ant for " + testName
-						+ " test:\n----------------------------------------\n"
-						+ Util.getText(outputFile) + "----------------------------------------");
-				outputFile.delete();
-			}
-		}
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Mark Doliner
+ * 
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License 1.1 (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import junit.framework.TestCase;
+import net.sourceforge.cobertura.reporting.JUnitXMLHelper;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Path.PathElement;
+import org.jdom.*;
+import org.jdom.xpath.XPath;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * These tests generally exec ant to run a test.xml file.  A different target is used for
+ * each test.  The text.xml file sets up a test, instruments, runs junit, and generates a
+ * coverage xml report.  Then the xml report is parsed and checked.
+ *
+ * @author jwlewi
+ */
+public class FunctionalConditionCoverageTest extends TestCase {
+
+	private final static File BASEDIR = new File(
+			(System.getProperty("basedir") != null) ? System
+					.getProperty("basedir") : ".",
+			"src/test/resources/examples/functionalconditiontest");
+
+	private final static String CONDITION_MISSING_TRUE = "50%";
+	private final static String CONDITION_MISSING_FALSE = "50%";
+
+	private final static Map testInfoMap = new HashMap();
+
+	static {
+		ConditionTestInfo[] expectedConditions;
+		TestInfo info;
+
+		/*
+		 * Load expected information into testInfoMap for each method.
+		 */
+		expectedConditions = new ConditionTestInfo[1];
+		expectedConditions[0] = new ConditionTestInfo("0", "jump",
+				CONDITION_MISSING_FALSE);
+
+		info = new TestInfo(ConditionCalls.CALL_CONDITION_LINE_NUMBER,
+				"50% (1/2)", expectedConditions);
+		info.setIgnoreLineNumber(ConditionCalls.CALL_IGNORE_LINE_NUMBER);
+
+		testInfoMap.put("call", info);
+
+		expectedConditions = new ConditionTestInfo[1];
+		expectedConditions[0] = new ConditionTestInfo("0", "switch", "33%");
+
+		info = new TestInfo(ConditionCalls.LOOKUP_SWITCH_LINE_NUMBER,
+				"33% (1/3)", expectedConditions);
+
+		testInfoMap.put("callLookupSwitch", info);
+
+		expectedConditions = new ConditionTestInfo[1];
+		expectedConditions[0] = new ConditionTestInfo("0", "switch", "10%");
+
+		info = new TestInfo(ConditionCalls.TABLE_SWITCH_LINE_NUMBER,
+				"10% (1/10)", expectedConditions);
+
+		testInfoMap.put("callTableSwitch", info);
+
+		expectedConditions = new ConditionTestInfo[3];
+		expectedConditions[0] = new ConditionTestInfo("0", "jump",
+				CONDITION_MISSING_TRUE);
+		expectedConditions[1] = new ConditionTestInfo("1", "jump", "0%");
+		expectedConditions[2] = new ConditionTestInfo("2", "jump",
+				CONDITION_MISSING_FALSE);
+
+		info = new TestInfo(ConditionCalls.MULTI_CONDITION_LINE_NUMBER,
+				"33% (2/6)", expectedConditions);
+
+		testInfoMap.put("callMultiCondition", info);
+
+		expectedConditions = new ConditionTestInfo[3];
+		expectedConditions[0] = new ConditionTestInfo("0", "jump",
+				CONDITION_MISSING_FALSE);
+		expectedConditions[1] = new ConditionTestInfo("1", "jump",
+				CONDITION_MISSING_FALSE);
+		expectedConditions[2] = new ConditionTestInfo("2", "jump", "0%");
+
+		info = new TestInfo(ConditionCalls.MULTI_CONDITION2_LINE_NUMBER,
+				"33% (2/6)", expectedConditions);
+
+		testInfoMap.put("callMultiCondition2", info);
+	}
+
+	private static class TestInfo {
+		int conditionNumber;
+		String expectedLineConditionCoverage;
+		ConditionTestInfo[] expectedConditions;
+		Integer ignoreLineNumber;
+
+		TestInfo(int conditionNumber, String expectedLineConditionCoverage,
+				ConditionTestInfo[] expectedConditions) {
+			this.conditionNumber = conditionNumber;
+			this.expectedLineConditionCoverage = expectedLineConditionCoverage;
+			this.expectedConditions = expectedConditions;
+		}
+
+		public void setIgnoreLineNumber(int number) {
+			ignoreLineNumber = new Integer(number);
+		}
+	}
+
+	private static class ConditionTestInfo {
+		String number;
+		String type;
+		String coverage;
+
+		ConditionTestInfo(String number, String type, String coverage) {
+			this.number = number;
+			this.type = type;
+			this.coverage = coverage;
+		}
+	}
+
+	@Test
+	public static void testConditionCoverage() throws Exception {
+		runTestAntScript("condition-coverage", "test-condition-coverage");
+		verify("condition-coverage");
+	}
+
+	private static void verify(String testName) throws Exception {
+		verifyXml(testName);
+		verifyHtml(testName);
+	}
+
+	private static void verifyXml(String testName) throws Exception {
+		// Get a list of all classes listed in the XML report
+		List classesList = getClassElements();
+		assertTrue("Test " + testName
+				+ ": Did not find any classes listed in the XML report.",
+				classesList.size() > 0);
+
+		boolean conditionCallsClassFound = false;
+		for (Iterator iter = classesList.iterator(); iter.hasNext();) {
+			Element classElement = (Element) iter.next();
+			String className = classElement.getAttributeValue("name");
+			if (className.equals("test.condition.ConditionCalls")) {
+				conditionCallsClassFound = true;
+			} else
+				fail("Test "
+						+ testName
+						+ ": Found a class with the name '"
+						+ className
+						+ "' in the XML report, but was only expecting 'test.condition.ConditionCalls'.");
+			verifyClass(testName, classElement);
+		}
+		assertTrue(
+				"Test "
+						+ testName
+						+ ": Did not find class 'test.condition.ConditionCalls' in the XML report.",
+				conditionCallsClassFound);
+	}
+
+	/**
+	 * Use XPath to get all <class> elements in the
+	 * cobertura.xml file under the given directory.
+	 *
+	 * @return A list of JDOM Elements.
+	 */
+	private static List getClassElements() throws IOException, JDOMException {
+		File xmlFile = new File(BASEDIR, "reports/cobertura-xml/coverage.xml");
+		Document document = JUnitXMLHelper.readXmlFile(xmlFile, true);
+		XPath xpath = XPath
+				.newInstance("/coverage/packages/package/classes/class");
+		List classesList = xpath.selectNodes(document);
+		return classesList;
+	}
+
+	/**
+	 * Verify that the class's condition information is correct.
+	 */
+	private static void verifyClass(String testName, Element classElement) {
+		// Get a list of methods
+		Element methodsElement = classElement.getChild("methods");
+		List methodList = methodsElement.getChildren("method");
+		assertTrue("Test " + testName
+				+ ": Did not find any methods listed in the class "
+				+ classElement.getAttributeValue("name"), methodList.size() > 0);
+		List methodsFound = new ArrayList();
+		for (Iterator iter = methodList.iterator(); iter.hasNext();) {
+			Element methodElement = (Element) iter.next();
+			String methodName = methodElement.getAttributeValue("name");
+			TestInfo info = (TestInfo) testInfoMap.get(methodName);
+			if (info != null) {
+				if (methodsFound.contains(methodName)) {
+					fail("Test " + testName
+							+ ": Found more than one instance of the method "
+							+ methodName + " in the class "
+							+ classElement.getAttributeValue("name"));
+				}
+				methodsFound.add(methodName);
+
+				verifyMethod(info, testName, classElement, methodElement);
+			} else if (methodName.equals("<clinit>")
+					|| methodName.equals("<init>")
+					|| methodName.startsWith("util")
+					|| methodName.equals("class$")) {
+				// These methods are ok--ignore them.
+			} else {
+				fail("Test "
+						+ testName
+						+ ": Found method "
+						+ methodName
+						+ " in the class "
+						+ classElement.getAttributeValue("name")
+						+ ", but was only expecting either 'call' or 'dontCall'.");
+			}
+		}
+		/*
+		 * now make sure all methods in testInfoMap were found and verified
+		 */
+		for (Iterator iter = testInfoMap.keySet().iterator(); iter.hasNext();) {
+			String methodName = (String) iter.next();
+			assertTrue("Test " + testName + ": Did not find method "
+					+ methodName + " in the class "
+					+ classElement.getAttributeValue("name"), methodsFound
+					.contains(methodName));
+		}
+	}
+
+	private static void verifyMethod(TestInfo info, String testName,
+			Element classElement, Element methodElement) {
+		Element linesElement = methodElement.getChild("lines");
+		List lineList = linesElement.getChildren("line");
+		String methodName = methodElement.getAttributeValue("name");
+		assertTrue("Test " + testName + ", class "
+				+ classElement.getAttributeValue("name")
+				+ ": Did not find any lines in the method " + methodName,
+				lineList.size() > 0);
+
+		boolean foundCondition = false;
+		for (Iterator iter = lineList.iterator(); iter.hasNext();) {
+			Element lineElement = (Element) iter.next();
+			int number;
+			try {
+				number = lineElement.getAttribute("number").getIntValue();
+				if ((info.ignoreLineNumber != null)
+						&& (info.ignoreLineNumber.intValue() == number)) {
+					fail("Expected line " + info.ignoreLineNumber
+							+ " to be ignored.");
+				}
+			} catch (DataConversionException e) {
+				throw new RuntimeException(e.toString());
+			}
+			if (number == info.conditionNumber) {
+				foundCondition = true;
+				verifyLineConditionInfo(lineElement, info.conditionNumber,
+						info.expectedLineConditionCoverage,
+						info.expectedConditions);
+			}
+		}
+		assertTrue("Expected condition element for line "
+				+ info.conditionNumber + " of " + methodName, foundCondition);
+	}
+
+	private static void verifyLineConditionInfo(Element lineElement,
+			int conditionLineNumber, String expectedLineConditionCoverage,
+			ConditionTestInfo[] expectedConditions) {
+		String errorMessage = "Line " + conditionLineNumber;
+		boolean branch = false;
+		try {
+			branch = lineElement.getAttribute("branch").getBooleanValue();
+		} catch (DataConversionException e) {
+			fail(errorMessage + " has missing or wrong branch attribute");
+		}
+		assertTrue(errorMessage + "Branch attribute should be true", branch);
+
+		String lineCoverageStr = getRequiredAttribute(lineElement,
+				"condition-coverage", errorMessage).getValue();
+		assertEquals(errorMessage + " has incorrect condition-coverage",
+				expectedLineConditionCoverage, lineCoverageStr);
+
+		List conditionList = lineElement.getChildren("conditions");
+		assertTrue(errorMessage
+				+ " should have one and only one conditions element.",
+				conditionList.size() == 1);
+		conditionList = ((Element) conditionList.get(0))
+				.getChildren("condition");
+
+		assertEquals(errorMessage
+				+ " has incorrect number of condition elements.",
+				expectedConditions.length, conditionList.size());
+
+		errorMessage = "Condition for " + conditionLineNumber;
+
+		int i = 0;
+		for (Iterator iter = conditionList.iterator(); iter.hasNext(); i++) {
+			Element element = (Element) iter.next();
+			verifyCondition(element, errorMessage, expectedConditions[i]);
+		}
+	}
+
+	private static void verifyCondition(Element conditionElement,
+			String errorMessage, ConditionTestInfo info) {
+		String numberStr = getRequiredAttribute(conditionElement, "number",
+				errorMessage).getValue();
+		assertEquals(errorMessage + " has incorrect number", info.number,
+				numberStr);
+		String typeStr = getRequiredAttribute(conditionElement, "type",
+				errorMessage).getValue();
+		assertEquals(errorMessage + " has incorrect type", info.type, typeStr);
+		String coverageStr = getRequiredAttribute(conditionElement, "coverage",
+				errorMessage).getValue();
+		assertEquals(errorMessage + " has incorrect coverage", info.coverage,
+				coverageStr);
+	}
+
+	private static Attribute getRequiredAttribute(Element element,
+			String attribute, String errorMessage) {
+		Attribute attr = element.getAttribute(attribute);
+		assertNotNull(errorMessage + " has missing " + attribute
+				+ " attribute.", attr);
+		return attr;
+	}
+
+	private static void verifyHtml(String testName) throws Exception {
+		File htmlReportDir = new File(BASEDIR, "reports/cobertura-html");
+
+		// Get all files from report directory
+		String htmlFiles[] = htmlReportDir.list(new FilenameFilter() {
+
+			public boolean accept(File dir, String name) {
+				return name.endsWith(".html");
+			}
+		});
+		Arrays.sort(htmlFiles);
+
+		assertTrue(htmlFiles.length >= 5);
+
+		// Assert that all required files are there
+		String[] requiredFiles = {"index.html", "help.html",
+				"frame-packages.html", "frame-summary.html",
+				"frame-sourcefiles.html"};
+
+		for (int i = 0; i < requiredFiles.length; i++) {
+			if (!containsFile(htmlFiles, requiredFiles[i])) {
+				fail("Test " + testName + ": File " + requiredFiles[i]
+						+ " not found among report files");
+			}
+		}
+
+		// Validate selected files
+		String previousPrefix = "NONE";
+		for (int i = 0; i < htmlFiles.length; i++) {
+			// Validate file if has prefix different than previous one, or is required file
+			if (containsFile(requiredFiles, htmlFiles[i])
+					|| !htmlFiles[i].startsWith(previousPrefix)) {
+				JUnitXMLHelper.readXmlFile(
+						new File(htmlReportDir, htmlFiles[i]), true);
+			}
+			if (htmlFiles[i].length() > 7) {
+				previousPrefix = htmlFiles[i].substring(0, 7);
+			} else {
+				previousPrefix = htmlFiles[i];
+			}
+		}
+	}
+
+	private static boolean containsFile(String[] files, String fileName) {
+		for (int i = 0; i < files.length; i++) {
+			if (files[i].equals(fileName))
+				return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Use the ant 'java' task to run the test.xml
+	 * file and the specified target.
+	 */
+	private static void runTestAntScript(String testName, String target)
+			throws IOException {
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.init();
+
+		// Call ant launcher.  Requires ant-lancher.jar.
+		java.setClassname("org.apache.tools.ant.launch.Launcher");
+		java.setFork(true);
+		AntUtil.transferCoberturaDataFileProperty(java);
+
+		java.createArg().setValue("-f");
+		java.createArg().setValue(BASEDIR + "/build.xml");
+		java.createArg().setValue(target);
+
+		java.setFailonerror(true);
+
+		// Set output to go to a temp file
+		File outputFile = Util.createTemporaryTextFile("cobertura-test");
+		java.setOutput(outputFile);
+
+		// Set the classpath to the same classpath as this JVM
+
+		Path classpath = new Path(TestUtils.project);
+		PathElement pathElement = classpath.new PathElement();
+		pathElement.setPath(System.getProperty("java.class.path"));
+		classpath.add(pathElement);
+		java.setClasspath(classpath);
+		System.out.println(classpath);
+		try {
+			java.execute();
+		} finally {
+			if (outputFile.exists()) {
+				// Put the contents of the output file in the exception
+				System.out.println("\n\n\nOutput from Ant for " + testName
+						+ " test:\n----------------------------------------\n"
+						+ Util.getText(outputFile)
+						+ "----------------------------------------");
+				outputFile.delete();
+			}
+		}
+	}
+
+	private class ConditionCalls {
+		public static final int CALL_CONDITION_LINE_NUMBER = 18;
+		public static final int CALL_IGNORE_LINE_NUMBER = 22;
+		public static final int LOOKUP_SWITCH_LINE_NUMBER = 40;
+		public static final int TABLE_SWITCH_LINE_NUMBER = 57;
+		public static final int MULTI_CONDITION_LINE_NUMBER = 75;
+		public static final int MULTI_CONDITION2_LINE_NUMBER = 83;
+	}
+}
diff --git a/test/net/sourceforge/cobertura/ant/FunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/ant/FunctionalTest.java
similarity index 60%
rename from test/net/sourceforge/cobertura/ant/FunctionalTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/ant/FunctionalTest.java
index c7fd68a..ec48260 100644
--- a/test/net/sourceforge/cobertura/ant/FunctionalTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/ant/FunctionalTest.java
@@ -1,398 +1,378 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2008 John Lewis
- * Copyright (C) 2006 Mark Doliner
- * 
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License 1.1 (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-import net.sourceforge.cobertura.reporting.JUnitXMLHelper;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Java;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.Path.PathElement;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.xpath.XPath;
-
-/**
- * These tests generally exec ant to run a test.xml file.  A different target is used for
- * each test.  The text.xml file sets up a test, instruments, runs junit, and generates a
- * coverage xml report.  Then the xml report is parsed and checked.
- * 
- * @author jwlewi
- */
-public class FunctionalTest extends TestCase
-{
-
-	private static int forkedJVMDebugPort = 0;
-
-	private final static File BASEDIR = new File((System.getProperty("basedir") != null) ? System
-			.getProperty("basedir") : ".", "examples/functionaltest1");
-
-	public static void testInstrumentUsingDirSet() throws Exception
-	{
-		runTestAntScript("dirset", "test-dirset");
-		verify("dirset");
-	}
-
-	public static void testInstrumentUsingIncludesAndExcludes() throws Exception
-	{
-		runTestAntScript("includes-and-excludes", "test-includes-and-excludes");
-		verify("includes-and-excludes");
-	}
-
-	public static void testInstrumentUsingClassPath() throws Exception
-	{
-		runTestAntScript("classpath", "test-classpath");
-		verify("classpath");
-	}
-
-	public static void testInstrumentUsingWar() throws Exception
-	{
-		runTestAntScript("classpath", "test-war");
-		verify("war");
-	}
-
-	private static void verify(String testName) throws Exception
-	{
-		verifyXml(testName);
-		verifyHtml(testName);
-	}
-
-	private static void verifyXml(String testName) throws Exception
-	{
-		Document document = getSummaryXmlReportDocument();
-		verifyOverallComplexity(document);
-
-		document = getXmlReportDocument();
-		verifyOverallComplexity(document);
-		
-		// Get a list of all classes listed in the XML report
-		List classesList = getClassElements(document);
-		assertTrue("Test " + testName + ": Did not find any classes listed in the XML report.",
-				classesList.size() > 0);
-
-		// text.xml only instruments the two "A" classes, so make
-		// sure those are the only classes listed in the XML report.
-		boolean firstPackageFound = false;
-		boolean secondPackageFound = false;
-		for (Iterator iter = classesList.iterator(); iter.hasNext();)
-		{
-			boolean verify = true;
-			Element classElement = (Element)iter.next();
-			String className = classElement.getAttributeValue("name");
-			if (className.equals("test.first.A"))
-			{
-				firstPackageFound = true;
-			}
-			else if (className.equals("test.second.A"))
-			{
-				secondPackageFound = true;
-			}
-			else if (className.equals("test.first.RemoteInterface") 
-					|| (className.equals("test.first.RemoteListener"))
-					|| (className.equals("test.first.RemoteListener_Stub")))
-			{
-				//just ignore - it is ok
-				verify = false;
-			}
-			else
-				fail("Test "
-						+ testName
-						+ ": Found a class with the name '"
-						+ className
-						+ "' in the XML report, but was only expecting either 'test.first.A' or 'test.second.A'.");
-			if (verify)
-			{
-				verifyClass(className, testName, classElement);
-			}
-		}
-		assertTrue("Test " + testName + ": Did not find class 'test.first.A' in the XML report.",
-				firstPackageFound);
-		assertTrue("Test " + testName + ": Did not find class 'test.second.A' in the XML report.",
-				secondPackageFound);
-	}
-	
-	private static void verifyOverallComplexity(Document document)
-	{
-		String complexity = document.getRootElement().getAttributeValue("complexity");
-		assertEquals("Invalid overall complexity ", "1.0", complexity);
-	}
-
-	private static Document getXmlReportDocument() throws IOException, JDOMException
-	{
-		File xmlFile = new File(BASEDIR, "reports/cobertura-xml/coverage.xml");
-		Document document = JUnitXMLHelper.readXmlFile(xmlFile, true);
-		return document;
-	}
-
-	private static Document getSummaryXmlReportDocument() throws IOException, JDOMException
-	{
-		File xmlFile = new File(BASEDIR, "reports/cobertura-xml/coverage-summary.xml");
-		Document document = JUnitXMLHelper.readXmlFile(xmlFile, true);
-		return document;
-	}
-
-	/**
-	 * Use XPath to get all <class> elements in the
-	 * cobertura.xml file under the given directory.
-	 * @return A list of JDOM Elements.
-	 */
-	private static List getClassElements(Document document) throws IOException, JDOMException
-	{
-		XPath xpath = XPath.newInstance("/coverage/packages/package/classes/class");
-		List classesList = xpath.selectNodes(document);
-		return classesList;
-	}
-
-	/**
-	 * Verify that the class's expected methods are found.  Look for
-	 * a method called "call" which should have a hit count of 1.
-	 * The method called "dontCall" should have a hit count of 0.
-	 * @param testName 
-	 */
-	private static void verifyClass(String className, String testName, Element classElement)
-	{
-		verifyComplexity(className, classElement);
-		
-		// Get a list of methods
-		Element methodsElement = classElement.getChild("methods");
-		List methodList = methodsElement.getChildren("method");
-		assertTrue("Test " + testName + ": Did not find any methods listed in the class "
-				+ classElement.getAttributeValue("name"), methodList.size() > 0);
-		boolean callMethodFound = false;
-		boolean dontCallMethodFound = false;
-		for (Iterator iter = methodList.iterator(); iter.hasNext();)
-		{
-			Element methodElement = (Element)iter.next();
-			String methodName = methodElement.getAttributeValue("name");
-			if (methodName.equals("call"))
-			{
-				if (callMethodFound)
-				{
-					fail("Test " + testName
-							+ ": Found more than one instance of the method 'call' in the class "
-							+ classElement.getAttributeValue("name"));
-				}
-				callMethodFound = true;
-				verifyMethod(testName, classElement, methodElement, 1);
-			}
-			else if (methodName.equals("dontCall"))
-			{
-				if (dontCallMethodFound)
-				{
-					fail("Test "
-							+ testName
-							+ ": Found more than one instance of the method 'dontCall' in the class "
-							+ classElement.getAttributeValue("name"));
-				}
-				dontCallMethodFound = true;
-				verifyMethod(testName, classElement, methodElement, 0);
-			}
-			else if (methodName.equals("<init>") || methodName.equals("someMethod"))
-			{
-				// These methods are ok--ignore them.
-			}
-			else
-			{
-				fail("Test " + testName + ": Found method " + methodName + " in the class "
-						+ classElement.getAttributeValue("name")
-						+ ", but was only expecting either 'call' or 'dontCall'.");
-			}
-		}
-		assertTrue("Test " + testName + ": Did not find method 'call' in the class "
-				+ classElement.getAttributeValue("name"), callMethodFound);
-		assertTrue("Test " + testName + ": Did not find method 'dontCall' in the class "
-				+ classElement.getAttributeValue("name"), dontCallMethodFound);
-	}
-
-	private static void verifyComplexity(String className, Element classElement)
-	{
-		String complexity = classElement.getAttributeValue("complexity");
-		assertEquals("Invalid complexity with class " + className, "1.0", complexity);
-	}
-
-	/**
-	 * Look at all lines in a method and make sure they have hit counts that
-	 * match the expectedHits.
-	 */
-	private static void verifyMethod(String testName, Element classElement, Element methodElement,
-			int expectedHits)
-	{
-		Element linesElement = methodElement.getChild("lines");
-		List lineList = linesElement.getChildren("line");
-		assertTrue("Test " + testName + ", class " + classElement.getAttributeValue("name")
-				+ ": Did not find any lines in the method "
-				+ methodElement.getAttributeValue("name"), lineList.size() > 0);
-
-		for (Iterator iter = lineList.iterator(); iter.hasNext();)
-		{
-			Element lineElement = (Element)iter.next();
-			String hitsString = lineElement.getAttributeValue("hits");
-			int hits = Integer.parseInt(hitsString);
-			assertEquals("Test " + testName + ", class " + classElement.getAttributeValue("name")
-					+ ": Found incorrect hit count for the method "
-					+ methodElement.getAttributeValue("name"), expectedHits, hits);
-		}
-	}
-
-	private static void verifyHtml(String testName) throws Exception
-	{
-		File htmlReportDir = new File(BASEDIR, "reports/cobertura-html");
-
-		// Get all files from report directory
-		String htmlFiles[] = htmlReportDir.list(new FilenameFilter()
-		{
-
-			public boolean accept(File dir, String name)
-			{
-				return name.endsWith(".html");
-			}
-		});
-		Arrays.sort(htmlFiles);
-
-		assertTrue(htmlFiles.length >= 5);
-
-		// Assert that all required files are there
-		String[] requiredFiles = { "index.html", "help.html", "frame-packages.html",
-				"frame-summary.html", "frame-sourcefiles.html" , "test.first.A.html"};
-
-		for (int i = 0; i < requiredFiles.length; i++)
-		{
-			if (!containsFile(htmlFiles, requiredFiles[i]))
-			{
-				fail("Test " + testName + ": File " + requiredFiles[i]
-						+ " not found among report files");
-			}
-		}
-
-		// Validate selected files
-		String previousPrefix = "NONE";
-		for (int i = 0; i < htmlFiles.length; i++)
-		{
-			// Validate file if has prefix different than previous one, or is required file
-			if (containsFile(requiredFiles, htmlFiles[i])
-					|| !htmlFiles[i].startsWith(previousPrefix))
-			{
-				JUnitXMLHelper.readXmlFile(new File(htmlReportDir, htmlFiles[i]), true);
-			}
-			if (htmlFiles[i].length() > 7)
-			{
-				previousPrefix = htmlFiles[i].substring(0, 7);
-			}
-			else
-			{
-				previousPrefix = htmlFiles[i];
-			}
-		}
-		BufferedReader reader = new BufferedReader(new FileReader(new File(htmlReportDir, "test.first.A.html")));
-		String line;
-		boolean foundSomeMethod = false;
-		while ((line = reader.readLine()) != null) {
-			if (line.matches(".*someMethod.*")) {
-				foundSomeMethod = true;
-			}
-		}
-		assertTrue("someMethod not found in test.first.A.html", foundSomeMethod);
-	}
-
-	private static boolean containsFile(String[] files, String fileName)
-	{
-		for (int i = 0; i < files.length; i++)
-		{
-			if (files[i].equals(fileName))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Use the ant 'java' task to run the test.xml
-	 * file and the specified target.
-	 */
-	private static void runTestAntScript(String testName, String target) throws IOException
-	{
-		Java task = new Java();
-		task.setTaskName("java");
-		task.setProject(new Project());
-		task.init();
-
-		// Call ant launcher.  Requires ant-lancher.jar.
-		task.setClassname("org.apache.tools.ant.launch.Launcher");
-		task.setFork(true);
-
-		AntUtil.transferCoberturaDataFileProperty(task);
-		
-		if (forkedJVMDebugPort > 0)
-		{
-			task.createJvmarg().setValue("-Xdebug");
-			task.createJvmarg().setValue("-Xrunjdwp:transport=dt_socket,address=" + forkedJVMDebugPort + ",server=y,suspend=y");
-		}
-
-
-		task.createArg().setValue("-f");
-		task.createArg().setValue(BASEDIR + "/build.xml");
-		task.createArg().setValue(target);
-
-		task.setFailonerror(true);
-
-		// Set output to go to a temp file
-		File outputFile = Util.createTemporaryTextFile("cobertura-test");
-		task.setOutput(outputFile);
-
-		// Set the classpath to the same classpath as this JVM
-		Path classpath = task.createClasspath();
-		PathElement pathElement = classpath.createPathElement();
-		pathElement.setPath(System.getProperty("java.class.path"));
-
-		try
-		{
-			task.execute();
-		}
-		finally
-		{
-			if (outputFile.exists())
-			{
-				// Put the contents of the output file in the exception
-				System.out.println("\n\n\nOutput from Ant for " + testName
-						+ " test:\n----------------------------------------\n"
-						+ Util.getText(outputFile) + "----------------------------------------");
-				outputFile.delete();
-			}
-		}
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2008 John Lewis
+ * Copyright (C) 2006 Mark Doliner
+ * 
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License 1.1 (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import net.sourceforge.cobertura.reporting.JUnitXMLHelper;
+import net.sourceforge.cobertura.test.AbstractCoberturaTestCase;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Path.PathElement;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.xpath.XPath;
+import org.junit.Test;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * These tests generally exec ant to run a test.xml file.  A different target is used for
+ * each test.  The text.xml file sets up a test, instruments, runs junit, and generates a
+ * coverage xml report.  Then the xml report is parsed and checked.
+ *
+ * @author jwlewi
+ */
+public class FunctionalTest extends AbstractCoberturaTestCase {
+	private static int forkedJVMDebugPort = 0;
+	private final static File BASEDIR = new File("src/test/resources/",
+			"examples/functionaltest1");
+
+	@Test
+	public void testInstrumentUsingDirSet() throws Exception {
+		runTestAntScript("dirset", "test-dirset");
+		verify("dirset");
+	}
+
+	@Test
+	public void testInstrumentUsingIncludesAndExcludes() throws Exception {
+		runTestAntScript("includes-and-excludes", "test-includes-and-excludes");
+		verify("includes-and-excludes");
+	}
+
+	@Test
+	public void testInstrumentUsingClassPath() throws Exception {
+		runTestAntScript("classpath", "test-classpath");
+		verify("classpath");
+	}
+
+	@Test
+	public void testInstrumentUsingWar() throws Exception {
+		runTestAntScript("classpath", "test-war");
+		verify("war");
+	}
+
+	private static void verify(String testName) throws Exception {
+		verifyXml(testName);
+		verifyHtml(testName);
+	}
+
+	private static void verifyXml(String testName) throws Exception {
+		Document document = getSummaryXmlReportDocument();
+		verifyOverallComplexity(document);
+
+		document = getXmlReportDocument();
+		verifyOverallComplexity(document);
+
+		// Get a list of all classes listed in the XML report
+		List classesList = getClassElements(document);
+		assertTrue("Test " + testName
+				+ ": Did not find any classes listed in the XML report.",
+				classesList.size() > 0);
+
+		// text.xml only instruments the two "A" classes, so make
+		// sure those are the only classes listed in the XML report.
+		boolean firstPackageFound = false;
+		boolean secondPackageFound = false;
+		for (Iterator iter = classesList.iterator(); iter.hasNext();) {
+			boolean verify = true;
+			Element classElement = (Element) iter.next();
+			String className = classElement.getAttributeValue("name");
+			if (className.equals("test.first.A")) {
+				firstPackageFound = true;
+			} else if (className.equals("test.second.A")) {
+				secondPackageFound = true;
+			} else if (className.equals("test.first.RemoteInterface")
+					|| (className.equals("test.first.RemoteListener"))
+					|| (className.equals("test.first.RemoteListener_Stub"))) {
+				//just ignore - it is ok
+				verify = false;
+			} else
+				fail("Test "
+						+ testName
+						+ ": Found a class with the name '"
+						+ className
+						+ "' in the XML report, but was only expecting either 'test.first.A' or 'test.second.A'.");
+			if (verify) {
+				verifyClass(className, testName, classElement);
+			}
+		}
+		assertTrue("Test " + testName
+				+ ": Did not find class 'test.first.A' in the XML report.",
+				firstPackageFound);
+		assertTrue("Test " + testName
+				+ ": Did not find class 'test.second.A' in the XML report.",
+				secondPackageFound);
+	}
+
+	private static void verifyOverallComplexity(Document document) {
+		String complexity = document.getRootElement().getAttributeValue(
+				"complexity");
+		assertEquals("Invalid overall complexity ", "1.0", complexity);
+	}
+
+	private static Document getXmlReportDocument() throws IOException,
+			JDOMException {
+		File xmlFile = new File(BASEDIR, "reports/cobertura-xml/coverage.xml");
+		Document document = JUnitXMLHelper.readXmlFile(xmlFile, true);
+		return document;
+	}
+
+	private static Document getSummaryXmlReportDocument() throws IOException,
+			JDOMException {
+		File xmlFile = new File(BASEDIR,
+				"reports/cobertura-xml/coverage-summary.xml");
+		Document document = JUnitXMLHelper.readXmlFile(xmlFile, true);
+		return document;
+	}
+
+	/**
+	 * Use XPath to get all <class> elements in the
+	 * cobertura.xml file under the given directory.
+	 *
+	 * @return A list of JDOM Elements.
+	 */
+	private static List getClassElements(Document document) throws IOException,
+			JDOMException {
+		XPath xpath = XPath
+				.newInstance("/coverage/packages/package/classes/class");
+		List classesList = xpath.selectNodes(document);
+		return classesList;
+	}
+
+	/**
+	 * Verify that the class's expected methods are found.  Look for
+	 * a method called "call" which should have a hit count of 1.
+	 * The method called "dontCall" should have a hit count of 0.
+	 *
+	 * @param testName
+	 */
+	private static void verifyClass(String className, String testName,
+			Element classElement) {
+		verifyComplexity(className, classElement);
+
+		// Get a list of methods
+		Element methodsElement = classElement.getChild("methods");
+		List methodList = methodsElement.getChildren("method");
+		assertTrue("Test " + testName
+				+ ": Did not find any methods listed in the class "
+				+ classElement.getAttributeValue("name"), methodList.size() > 0);
+		boolean callMethodFound = false;
+		boolean dontCallMethodFound = false;
+		for (Iterator iter = methodList.iterator(); iter.hasNext();) {
+			Element methodElement = (Element) iter.next();
+			String methodName = methodElement.getAttributeValue("name");
+			if (methodName.equals("call")) {
+				if (callMethodFound) {
+					fail("Test "
+							+ testName
+							+ ": Found more than one instance of the method 'call' in the class "
+							+ classElement.getAttributeValue("name"));
+				}
+				callMethodFound = true;
+				verifyMethod(testName, classElement, methodElement, 1);
+			} else if (methodName.equals("dontCall")) {
+				if (dontCallMethodFound) {
+					fail("Test "
+							+ testName
+							+ ": Found more than one instance of the method 'dontCall' in the class "
+							+ classElement.getAttributeValue("name"));
+				}
+				dontCallMethodFound = true;
+				verifyMethod(testName, classElement, methodElement, 0);
+			} else if (methodName.equals("<init>")
+					|| methodName.equals("someMethod")) {
+				// These methods are ok--ignore them.
+			} else {
+				fail("Test "
+						+ testName
+						+ ": Found method "
+						+ methodName
+						+ " in the class "
+						+ classElement.getAttributeValue("name")
+						+ ", but was only expecting either 'call' or 'dontCall'.");
+			}
+		}
+		assertTrue("Test " + testName
+				+ ": Did not find method 'call' in the class "
+				+ classElement.getAttributeValue("name"), callMethodFound);
+		assertTrue("Test " + testName
+				+ ": Did not find method 'dontCall' in the class "
+				+ classElement.getAttributeValue("name"), dontCallMethodFound);
+	}
+
+	private static void verifyComplexity(String className, Element classElement) {
+		String complexity = classElement.getAttributeValue("complexity");
+		assertEquals("Invalid complexity with class " + className, "1.0",
+				complexity);
+	}
+
+	/**
+	 * Look at all lines in a method and make sure they have hit counts that
+	 * match the expectedHits.
+	 */
+	private static void verifyMethod(String testName, Element classElement,
+			Element methodElement, int expectedHits) {
+		Element linesElement = methodElement.getChild("lines");
+		List lineList = linesElement.getChildren("line");
+		assertTrue("Test " + testName + ", class "
+				+ classElement.getAttributeValue("name")
+				+ ": Did not find any lines in the method "
+				+ methodElement.getAttributeValue("name"), lineList.size() > 0);
+
+		for (Iterator iter = lineList.iterator(); iter.hasNext();) {
+			Element lineElement = (Element) iter.next();
+			String hitsString = lineElement.getAttributeValue("hits");
+			int hits = Integer.parseInt(hitsString);
+			assertEquals("Test " + testName + ", class "
+					+ classElement.getAttributeValue("name")
+					+ ": Found incorrect hit count for the method "
+					+ methodElement.getAttributeValue("name"), expectedHits,
+					hits);
+		}
+	}
+
+	private static void verifyHtml(String testName) throws Exception {
+		File htmlReportDir = new File(BASEDIR, "reports/cobertura-html");
+
+		// Get all files from report directory
+		String htmlFiles[] = htmlReportDir.list(new FilenameFilter() {
+
+			public boolean accept(File dir, String name) {
+				return name.endsWith(".html");
+			}
+		});
+		Arrays.sort(htmlFiles);
+
+		assertTrue(htmlFiles.length >= 5);
+
+		// Assert that all required files are there
+		String[] requiredFiles = {"index.html", "help.html",
+				"frame-packages.html", "frame-summary.html",
+				"frame-sourcefiles.html", "test.first.A.html"};
+
+		for (int i = 0; i < requiredFiles.length; i++) {
+			if (!containsFile(htmlFiles, requiredFiles[i])) {
+				fail("Test " + testName + ": File " + requiredFiles[i]
+						+ " not found among report files");
+			}
+		}
+
+		// Validate selected files
+		String previousPrefix = "NONE";
+		for (int i = 0; i < htmlFiles.length; i++) {
+			// Validate file if has prefix different than previous one, or is required file
+			if (containsFile(requiredFiles, htmlFiles[i])
+					|| !htmlFiles[i].startsWith(previousPrefix)) {
+				JUnitXMLHelper.readXmlFile(
+						new File(htmlReportDir, htmlFiles[i]), true);
+			}
+			if (htmlFiles[i].length() > 7) {
+				previousPrefix = htmlFiles[i].substring(0, 7);
+			} else {
+				previousPrefix = htmlFiles[i];
+			}
+		}
+		BufferedReader reader = new BufferedReader(new FileReader(new File(
+				htmlReportDir, "test.first.A.html")));
+		String line;
+		boolean foundSomeMethod = false;
+		while ((line = reader.readLine()) != null) {
+			if (line.matches(".*someMethod.*")) {
+				foundSomeMethod = true;
+			}
+		}
+		assertTrue("someMethod not found in test.first.A.html", foundSomeMethod);
+	}
+
+	private static boolean containsFile(String[] files, String fileName) {
+		for (int i = 0; i < files.length; i++) {
+			if (files[i].equals(fileName))
+				return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Use the ant 'java' task to run the test.xml
+	 * file and the specified target.
+	 */
+	private static void runTestAntScript(String testName, String target)
+			throws IOException {
+		new File(BASEDIR, "reports/cobertura-xml").mkdirs();
+
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setTaskName("java");
+		// Call ant launcher.  Requires ant-lancher.jar.
+		java.setClassname("org.apache.tools.ant.launch.Launcher");
+		java.setFork(true);
+		AntUtil.transferCoberturaDataFileProperty(java);
+
+		if (forkedJVMDebugPort > 0) {
+			java.createJvmarg().setValue("-Xdebug");
+			java.createJvmarg().setValue(
+					"-Xrunjdwp:transport=dt_socket,address="
+							+ forkedJVMDebugPort + ",server=y,suspend=y");
+		}
+
+		java.createArg().setValue("-f");
+		java.createArg().setValue(BASEDIR + "/build.xml");
+		java.createArg().setValue(target);
+		java.setFailonerror(true);
+		File output = Util.createTemporaryTextFile("cobertura-test");
+		java.setOutput(output);
+		java.setFailonerror(true);
+
+		//Set the classpath to the same classpath as this JVM
+		Path classpath = new Path(TestUtils.project);
+		PathElement pathElement = classpath.new PathElement();
+		pathElement.setPath(System.getProperty("java.class.path"));
+		classpath.add(TestUtils.getCoberturaDefaultClasspath());
+		classpath.add(pathElement);
+		System.err.println(classpath);
+		java.setClasspath(classpath);
+
+		try {
+			java.executeJava();
+		} finally {
+			if (output.exists()) {
+				// Put the contents of the output file in the exception
+				System.out.println("\n\n\nOutput from Ant for " + testName
+						+ " test:\n----------------------------------------\n"
+						+ Util.getText(output)
+						+ "----------------------------------------");
+				output.delete();
+			}
+		}
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/ant/IgnoreMethodAnnotationAntTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/ant/IgnoreMethodAnnotationAntTest.java
new file mode 100644
index 0000000..d3a5ef1
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/ant/IgnoreMethodAnnotationAntTest.java
@@ -0,0 +1,35 @@
+package net.sourceforge.cobertura.ant;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+
+import net.sourceforge.cobertura.test.util.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class IgnoreMethodAnnotationAntTest extends AbstractCoberturaAntTestCase {
+	@Before
+	public void setUp() throws Exception {
+		buildXmlFile = new File("src",
+				"/test/resources/ant/IgnoreMethodAnnotation/build.xml");
+
+		String target = "all";
+		super.executeAntTarget(target);
+	}
+
+	@Test
+	public void test() {
+		String className = "test.condition.IgnoreMe";
+		String methodName = "foo";
+
+		assertEquals(0, TestUtils.getTotalHitCount(dom, className, methodName));
+
+		className = "test.condition.IgnoreMeAlso";
+		assertEquals(0, TestUtils.getTotalHitCount(dom, className, methodName));
+
+		className = "test.condition.IgnoreMeNot";
+		assertTrue(TestUtils.getHitCount(dom, className, methodName) > 0);
+	}
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/ant/IgnoreTrivialAntTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/ant/IgnoreTrivialAntTest.java
new file mode 100644
index 0000000..f5bdba2
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/ant/IgnoreTrivialAntTest.java
@@ -0,0 +1,128 @@
+package net.sourceforge.cobertura.ant;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import net.sourceforge.cobertura.test.IgnoreUtil;
+import net.sourceforge.cobertura.test.util.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.xml.sax.SAXException;
+
+public class IgnoreTrivialAntTest extends AbstractCoberturaAntTestCase {
+	IgnoreUtil ignoreUtil;
+	@Before
+	public void setUp() throws Exception {
+		buildXmlFile = new File("src",
+				"/test/resources/ant/IgnoreTrivial/build.xml");
+
+		String target = "all";
+		super.executeAntTarget(target);
+	}
+
+	@Test
+	public void test() throws ParserConfigurationException, SAXException,
+			IOException {
+		dom = TestUtils.getXMLReportDOM(new File(buildXmlFile.getParentFile(),
+				"reports/cobertura-xml/coverage.xml"));
+
+		ignoreUtil = new IgnoreUtil("mypackage.Main", dom);
+
+		// trivial empty constructor
+		assertIgnored("<init>", "()V");
+
+		// trivial constructor Main(Thread, String) that just calls super()
+		assertIgnored("<init>", "(Ljava/lang/Thread;Ljava/lang/String;)V");
+
+		// trivial getter
+		assertIgnored("getterTrivial");
+
+		// isBool is trivial
+		assertIgnored("isBool");
+
+		// hasBool is trivial
+		assertIgnored("hasBool");
+
+		// setInt is trivial
+		assertIgnored("setInt");
+
+		// Main(int) has non-trivial switch
+		assertNotIgnored("<init>", "(I)V");
+
+		// Main(boolean) has non-trivial conditional
+		assertNotIgnored("<init>", "(Z)V");
+
+		// "empty" does not start with "get", "is", "has", or "set".
+		assertNotIgnored("empty");
+
+		// gets with no return are considered non-trivial
+		assertNotIgnored("getVoid");
+
+		// gets that have parameters are considered non-trivial
+		assertNotIgnored("getIntWithIntParm");
+
+		// sets that have no parameters are considered non-trivial
+		assertNotIgnored("set");
+
+		// sets that have more than one parameters are considered non-trivial
+		assertNotIgnored("setIntWithTwoParms");
+
+		// don't ignore methods with multi-dimensional array creates
+		assertNotIgnored("getMultiDimArray");
+
+		// don't ignore methods with increment instructions for local variables
+		assertNotIgnored("setIncrement");
+
+		// don't ignore methods with LDC instructions (that use constants from the runtime pool)
+		assertNotIgnored("setConst");
+		assertNotIgnored("<init>", "(Ljava/lang/Thread;I)V"); // Main(Thread, int)
+
+		// don't ignore methods with a single int operand (like creating an array).
+		assertNotIgnored("getArray");
+
+		// don't ignore methods with type instructions (like creating an object).
+		assertNotIgnored("getObject");
+
+		// don't ignore methods that use statics.
+		assertNotIgnored("getStatic");
+		assertNotIgnored("setStatic");
+		assertNotIgnored("<init>", "(Ljava/lang/String;)V");
+
+		// non-trivial local variable instructions (causes visitVarInsn call)
+		assertNotIgnored("setISTORE");
+		assertNotIgnored("setLSTORE");
+		assertNotIgnored("setFSTORE");
+		assertNotIgnored("setDSTORE");
+		assertNotIgnored("setASTORE");
+
+		// non-trivial method calls
+		assertNotIgnored("getINVOKEVIRTUAL");
+		assertNotIgnored("getINVOKESPECIAL");
+		assertNotIgnored("getINVOKESTATIC");
+		assertNotIgnored("setINVOKEINTERFACE");
+		assertNotIgnored("<init>", "(Ljava/lang/String;Ljava/lang/String;)V"); // Main(String, String)
+		assertNotIgnored("<init>", "(Ljava/lang/String;I)V"); // Main(String, int)
+		assertNotIgnored("<init>", "(Ljava/lang/String;Z)V"); // Main(String, boolean)
+	}
+
+	public void assertIgnored(String methodName, String signature) {
+		ignoreUtil.assertIgnored(methodName, signature);
+	}
+
+	public void assertIgnored(String methodName) {
+		assertIgnored(methodName, null);
+	}
+
+	public void assertNotIgnored(String methodName, String signature) {
+		ignoreUtil.assertNotIgnored(methodName, signature);
+	}
+
+	public void assertNotIgnored(String methodName) {
+		assertNotIgnored(methodName, null);
+	}
+}
\ No newline at end of file
diff --git a/test/net/sourceforge/cobertura/ant/Util.java b/cobertura/src/test/java/net/sourceforge/cobertura/ant/Util.java
similarity index 75%
rename from test/net/sourceforge/cobertura/ant/Util.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/ant/Util.java
index a5cbcff..fea8443 100644
--- a/test/net/sourceforge/cobertura/ant/Util.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/ant/Util.java
@@ -1,89 +1,74 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2006 Mark Doliner
- * 
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License 1.1 (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.ant;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.PrintStream;
-
-class Util
-{
-
-	static File createTemporaryTextFile(String prefix) throws IOException
-	{
-		File outputFile;
-		outputFile = File.createTempFile(prefix, ".txt");
-		outputFile.deleteOnExit();
-		return outputFile;
-	}
-
-	/**
-	 * Returns the text of a file as a string.
-	 * 
-	 * @param file The file to read.
-	 * @return A string containing the text of the file
-	 */
-	static String getText(File file) throws FileNotFoundException, IOException
-	{
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		PrintStream ps = new PrintStream(baos);
-		BufferedReader reader = null;
-		try
-		{
-			reader = new BufferedReader(new FileReader(file));
-			String line;
-			while ((line = reader.readLine()) != null)
-			{
-				ps.println(line);
-			}
-			ps.close();
-		}
-		finally
-		{
-			ps.close();
-			if (reader != null)
-			{
-				try
-				{
-					reader.close();
-				}
-				catch (IOException e)
-				{
-					System.err.println("IOException when closing file " + file.getAbsolutePath());
-					e.printStackTrace();
-				}
-			}
-		}
-
-		return baos.toString();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ * Copyright (C) 2006 Mark Doliner
+ * 
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License 1.1 (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.ant;
+
+import java.io.*;
+
+class Util {
+
+	static File createTemporaryTextFile(String prefix) throws IOException {
+		File outputFile;
+		outputFile = File.createTempFile(prefix, ".txt");
+		outputFile.deleteOnExit();
+		return outputFile;
+	}
+
+	/**
+	 * Returns the text of a file as a string.
+	 *
+	 * @param file The file to read.
+	 *
+	 * @return A string containing the text of the file
+	 */
+	static String getText(File file) throws FileNotFoundException, IOException {
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		PrintStream ps = new PrintStream(baos);
+		BufferedReader reader = null;
+		try {
+			reader = new BufferedReader(new FileReader(file));
+			String line;
+			while ((line = reader.readLine()) != null) {
+				ps.println(line);
+			}
+			ps.close();
+		} finally {
+			ps.close();
+			if (reader != null) {
+				try {
+					reader.close();
+				} catch (IOException e) {
+					System.err.println("IOException when closing file "
+							+ file.getAbsolutePath());
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return baos.toString();
+	}
+
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue170.java b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue170.java
new file mode 100644
index 0000000..105f238
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue170.java
@@ -0,0 +1,97 @@
+/*
+ * The MIT License
+ * 
+ * Copyright (c) 2014 schristou88
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package net.sourceforge.cobertura.bugs;
+
+import groovy.util.Node;
+import net.sourceforge.cobertura.test.AbstractCoberturaTestCase;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.junit.Test;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author schristou88
+ */
+public class GithubIssue170 extends AbstractCoberturaTestCase {
+    Node dom;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        dom = super.createAndExecuteMainMethod(packageName, fileName, file1,
+                mainMethod);
+    }
+
+    @Test
+    public void testIssue() {
+        assertTrue(TestUtils.getTotalHitCount(dom,
+                "mypackage.GithubIssue170Test",
+                "test170") > 0);
+        assertEquals(4, TestUtils.getTotalHitCount(dom,
+                "mypackage.GithubIssue170Test",
+                "main"));
+        assertEquals(2, TestUtils.getTotalHitCount(dom, "mypackage.GithubIssue170Test",
+                "<init>"));
+        assertThat(TestUtils.getMethodBranchCoverage(dom, "mypackage.GithubIssue170Test",
+                "test170"), is(0.5));
+    }
+
+    static final String packageName = "mypackage";
+    static final String fileName = "GithubIssue170Test";
+    static final String mainMethod = "mypackage.GithubIssue170Test";
+    static final String file1 = "package mypackage;"
+            + "\n public class GithubIssue170Test {"
+            + "\n "
+            + "\n   public void cleanUp() {}"
+            + "\n   public void possiblyThrowAnException(int y) {"
+            + "\n     try {"
+            + "\n      int x = 1 / y;"
+            + "\n     } catch (java.lang.Exception e) {"
+            + "\n       throw e;"
+            + "\n     }"
+            + "\n   }"
+            + "\n   public void test170(int y) {"
+            + "\n     boolean error = true;"
+            + "\n     try {"
+            + "\n       possiblyThrowAnException(y);"
+            + "\n       error = false;"
+            + "\n      } finally {"
+            + "\n       if (error)"
+            + "\n          cleanUp();"
+            + "\n     }"
+            + "\n   }"
+            + "\n   public static void main(String[] args) {"
+            + "\n     try {"
+            + "\n     new GithubIssue170Test().test170(1);"
+            + "\n     new GithubIssue170Test().test170(0);"
+            + "\n      } catch (java.lang.Exception e){"
+            + "\n        // Ignore exceptions"
+            + "\n     }"
+            + "\n   }"
+            + "\n }";
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue191.java b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue191.java
new file mode 100644
index 0000000..c2b444f
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue191.java
@@ -0,0 +1,27 @@
+package net.sourceforge.cobertura.bugs;
+
+import net.sourceforge.cobertura.test.AbstractCoberturaTestCase;
+import org.junit.Test;
+
+import java.io.IOException;
+
+/**
+ * @author schristou88
+ */
+public class GithubIssue191 extends AbstractCoberturaTestCase {
+    @Test
+    public void testIssue191() throws IOException {
+      String imports = "import java.io.*;" +
+                    "\n import java.lang.*;";
+      String method =
+                "\n public class TestParse191 {"
+              + "\n   public void test191() {"
+              + "\n     try {new File(\"\").getCanonicalPath();"
+              + "\n     } catch (NullPointerException | IOException | SecurityException e) {"
+              + "\n     }"
+              + "\n   }"
+              + "\n }";
+
+      super.parseIssueTester(imports, method);
+    }
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue30.java b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue30.java
new file mode 100644
index 0000000..116ea6a
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue30.java
@@ -0,0 +1,66 @@
+package net.sourceforge.cobertura.bugs;
+
+import static org.junit.Assert.*;
+
+import groovy.util.Node;
+
+import org.junit.Test;
+
+import net.sourceforge.cobertura.test.AbstractCoberturaTestCase;
+import net.sourceforge.cobertura.test.util.TestUtils;
+
+public class GithubIssue30 extends AbstractCoberturaTestCase {
+
+	Node dom;
+
+	@Override
+	public void setUp() throws Exception {
+		super.setUp();
+
+		dom = super.createAndExecuteMainMethod(packageName, fileName, file1,
+				mainMethod);
+	}
+
+	@Test
+	public void testIssue() {
+		assertTrue(TestUtils.getTotalHitCount(dom,
+				"mypackage.InstrumentationFailsOnFirstNewClassInTryBlock",
+				"saveToDatabase") > 0);
+		assertEquals(3, TestUtils.getTotalHitCount(dom,
+				"mypackage.InstrumentationFailsOnFirstNewClassInTryBlock",
+				"main"));
+		assertEquals(2, TestUtils.getTotalHitCount(dom, "mypackage.DataAccess",
+				"<init>"));
+	}
+
+	static final String packageName = "mypackage";
+	static final String fileName = "InstrumentationFailsOnFirstNewClassInTryBlock";
+	static final String mainMethod = "mypackage.InstrumentationFailsOnFirstNewClassInTryBlock";
+	static final String file1 = "package mypackage;"
+			+ "\n public class InstrumentationFailsOnFirstNewClassInTryBlock {"
+			+ "\n "
+			+ "\n "
+			+ "\n  public void saveToDatabase() {"
+			+ "\n    try {"
+			+ "\n      // boolean b=false;"
+			+ "\n      // if (b) {"
+			+ "\n      //   System.out.println(\"no action\");"
+			+ "\n      // }"
+			+ "\n      DataAccess da = new DataAccess();"
+			+ "\n      System.out.println(\"nothing\");"
+			+ "\n "
+			+ "\n    } catch (Exception e) {"
+			+ "\n "
+			+ "\n "
+			+ "\n    }"
+			+ "\n   }"
+			+ "\n   public static void main(String[] args) {"
+			+ "\n     InstrumentationFailsOnFirstNewClassInTryBlock ifofncitb = new InstrumentationFailsOnFirstNewClassInTryBlock();"
+			+ "\n     ifofncitb.saveToDatabase();"
+			+ "\n   }"
+			+ "\n }"
+			+ "\n class DataAccess {"
+			+ "\n   public DataAccess() {"
+			+ "\n     //To change body of created methods use File | Settings | File Templates."
+			+ "\n   }" + "\n }";
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue37IT.java b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue37IT.java
new file mode 100644
index 0000000..465bc19
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue37IT.java
@@ -0,0 +1,43 @@
+package net.sourceforge.cobertura.bugs;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.Collection;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.Test;
+
+public class GithubIssue37IT {
+	@Test
+	public void testVersionCorrect() throws IOException {
+		Collection<File> allJars = FileUtils.listFiles(new File("target"),
+				new String[]{"jar"}, false);
+
+		File loc = null;
+
+		for (File file : allJars) {
+			if (!file.getName().contains("sources")
+					&& !file.getName().contains("javadoc")) {
+				loc = file;
+			}
+		}
+
+		assertNotNull("Could not locate the correct jar", loc);
+
+		JarFile jar = null;
+		try {
+			jar = new JarFile(loc);
+			Manifest mf = jar.getManifest();
+			assertNotNull(
+					"Failed to find Implementation Version in the mainAttribute",
+					mf.getMainAttributes().getValue("Implementation-Version"));
+		} finally {
+			jar.close();
+		}
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue42.java b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue42.java
new file mode 100644
index 0000000..60cfae8
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue42.java
@@ -0,0 +1,29 @@
+package net.sourceforge.cobertura.bugs;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import net.sourceforge.cobertura.test.AbstractCoberturaTestCase;
+
+public class GithubIssue42 extends AbstractCoberturaTestCase {
+
+	@Test
+	public void testPlusEqualsParsing() throws IOException {
+		String imports = "";
+		String method = "\n public void foo() {" + "\n   int yyn = 0;"
+				+ "\n   int yychar = 1;" + "\n   if ((yyn += yychar) >= 0)"
+				+ "\n   {} " + "\n   if ((yyn -= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn *= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn /= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn &= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn |= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn ^= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn %= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn <<= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn >>= yychar) >= 0)" + "\n   {} "
+				+ "\n   if ((yyn >>>= yychar) >= 0)" + "\n   {} " + "\n }";
+
+		super.parseIssueTester(imports, method);
+	}
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue53.java b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue53.java
new file mode 100644
index 0000000..0c11052
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue53.java
@@ -0,0 +1,30 @@
+/**
+ * 
+ */
+package net.sourceforge.cobertura.bugs;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import net.sourceforge.cobertura.test.AbstractCoberturaTestCase;
+
+/**
+ * @author schristou88
+ *
+ */
+public class GithubIssue53 extends AbstractCoberturaTestCase {
+	@Test
+	public void testInnersParsing() throws IOException {
+		String imports = "";
+		String method = "\n public class Outer {" + "\n   private Inner inner;"
+				+ "\n   public Outer() {" + "\n     inner = this.new Inner() {"
+				+ "\n       @Override" + "\n       public int getI() {"
+				+ "\n         return 15;" + "\n       }" + "\n     };"
+				+ "\n   }" + "\n   private class Inner {"
+				+ "\n     public int getI() {" + "\n       return 1;"
+				+ "\n     }" + "\n   }" + "\n }";
+
+		super.parseIssueTester(imports, method);
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageRateTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageRateTest.java
new file mode 100644
index 0000000..84ca1e8
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageRateTest.java
@@ -0,0 +1,31 @@
+package net.sourceforge.cobertura.check;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CoverageRateTest {
+	public static final double BRANCH_COVERAGE_RATE = 0.9;
+	public static final double LINE_COVERAGE_RATE = 0.9;
+	public static final double DELTA = 0.001;
+	private CoverageRate coverageRate;
+
+	@Before
+	public void setUp() throws Exception {
+		this.coverageRate = new CoverageRate(LINE_COVERAGE_RATE,
+				BRANCH_COVERAGE_RATE);
+	}
+
+	@Test
+	public void testGetLineCoverageRate() throws Exception {
+		assertEquals(LINE_COVERAGE_RATE, coverageRate.getLineCoverageRate(),
+				DELTA);
+	}
+
+	@Test
+	public void testGetBranchCoverageRate() throws Exception {
+		assertEquals(BRANCH_COVERAGE_RATE,
+				coverageRate.getBranchCoverageRate(), DELTA);
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageResultEntryTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageResultEntryTest.java
new file mode 100644
index 0000000..2aa5754
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageResultEntryTest.java
@@ -0,0 +1,62 @@
+package net.sourceforge.cobertura.check;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.TestCase.assertFalse;
+import static net.sourceforge.cobertura.check.CoverageResultEntry.CoverageLevel.PACKAGE;
+import static net.sourceforge.cobertura.check.CoverageResultEntry.CoverageType.BRANCH;
+import static org.junit.Assert.assertEquals;
+
+public class CoverageResultEntryTest {
+	private static final CoverageResultEntry.CoverageLevel COVERAGE_LEVEL = PACKAGE;
+	private static final CoverageResultEntry.CoverageType COVERAGE_TYPE = BRANCH;
+	private static final String NAME = "some.name";
+	private static final int CURRENT_COVERAGE = 10;
+	private static final int EXPECTED_COVERAGE = 20;
+	private CoverageResultEntry entry;
+
+	@Before
+	public void setUp() throws Exception {
+		entry = new CoverageResultEntry(COVERAGE_LEVEL, COVERAGE_TYPE, NAME,
+				CURRENT_COVERAGE, EXPECTED_COVERAGE);
+	}
+
+	@Test
+	public void testGetCoverageLevel() throws Exception {
+		assertEquals(COVERAGE_LEVEL, entry.getCoverageLevel());
+	}
+
+	@Test
+	public void testGetCoverageType() throws Exception {
+		assertEquals(COVERAGE_TYPE, entry.getCoverageType());
+	}
+
+	@Test
+	public void testGetName() throws Exception {
+		assertEquals(NAME, entry.getName());
+	}
+
+	@Test
+	public void testGetCurrentCoverage() throws Exception {
+		assertEquals(CURRENT_COVERAGE, entry.getCurrentCoverage(), 0);
+	}
+
+	@Test
+	public void testGetExpectedCoverage() throws Exception {
+		assertEquals(EXPECTED_COVERAGE, entry.getExpectedCoverage(), 0);
+	}
+
+	@Test
+	public void testIsBelowExpectedCoverage_true() throws Exception {
+		assertTrue(entry.isBelowExpectedCoverage());
+	}
+
+	@Test
+	public void testIsBelowExpectedCoverage_false() throws Exception {
+		entry = new CoverageResultEntry(COVERAGE_LEVEL, COVERAGE_TYPE, NAME,
+				EXPECTED_COVERAGE + 10, EXPECTED_COVERAGE);
+		assertFalse(entry.isBelowExpectedCoverage());
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageThresholdTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageThresholdTest.java
new file mode 100644
index 0000000..564179c
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/check/CoverageThresholdTest.java
@@ -0,0 +1,38 @@
+package net.sourceforge.cobertura.check;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CoverageThresholdTest {
+
+	private static final double MIN_LINE_PERCENTAGE = .5;
+	private static final double MIN_BRANCH_PERCENTAGE = .5;
+	private static final String REGEX = "*";
+	private static final double DELTA = .001;
+	private CoverageThreshold coverageThreshold;
+
+	@Before
+	public void setUp() throws Exception {
+		this.coverageThreshold = new CoverageThreshold(REGEX,
+				MIN_BRANCH_PERCENTAGE, MIN_LINE_PERCENTAGE);
+	}
+
+	@Test
+	public void testGetRegex() throws Exception {
+		assertEquals(REGEX, coverageThreshold.getRegex());
+	}
+
+	@Test
+	public void testGetMinBranchPercentage() throws Exception {
+		assertEquals(MIN_BRANCH_PERCENTAGE, coverageThreshold
+				.getMinBranchPercentage(), DELTA);
+	}
+
+	@Test
+	public void testGetMinLinePercentage() throws Exception {
+		assertEquals(MIN_LINE_PERCENTAGE, coverageThreshold
+				.getMinLinePercentage(), DELTA);
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/check/PackageCoverageTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/check/PackageCoverageTest.java
new file mode 100644
index 0000000..406aa45
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/check/PackageCoverageTest.java
@@ -0,0 +1,81 @@
+package net.sourceforge.cobertura.check;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class PackageCoverageTest {
+
+	public static final double DELTA = 0.001;
+	public static final double SAMPLE_COVERAGE_COUNT = 0.1;
+	public static final int TIMES = 3;
+	private PackageCoverage packageCoverage;
+
+	@Before
+	public void setUp() throws Exception {
+		this.packageCoverage = new PackageCoverage();
+	}
+
+	@Test
+	public void testGetBranchCount() throws Exception {
+		assertEquals(0, packageCoverage.getBranchCount(), DELTA);
+	}
+
+	@Test
+	public void testAddBranchCount() throws Exception {
+		int branchCountIncrement = 1;
+		for (int j = 0; j < TIMES; j++) {
+			packageCoverage.addBranchCount(branchCountIncrement);
+		}
+
+		assertEquals(TIMES * branchCountIncrement, packageCoverage
+				.getBranchCount(), DELTA);
+	}
+
+	@Test
+	public void testGetLineCount() throws Exception {
+		assertEquals(0, packageCoverage.getLineCount(), DELTA);
+	}
+
+	@Test
+	public void testAddLineCount() throws Exception {
+		int lineCountIncrement = 1;
+		for (int j = 0; j < TIMES; j++) {
+			packageCoverage.addLineCount(lineCountIncrement);
+		}
+
+		assertEquals(TIMES * lineCountIncrement,
+				packageCoverage.getLineCount(), DELTA);
+	}
+
+	@Test
+	public void testGetBranchCoverage() throws Exception {
+		assertEquals(0, packageCoverage.getBranchCoverage(), DELTA);
+	}
+
+	@Test
+	public void testAddBranchCoverage() throws Exception {
+		for (int j = 0; j < TIMES; j++) {
+			packageCoverage.addBranchCoverage(SAMPLE_COVERAGE_COUNT);
+		}
+
+		assertEquals(TIMES * SAMPLE_COVERAGE_COUNT, packageCoverage
+				.getBranchCoverage(), DELTA);
+	}
+
+	@Test
+	public void testGetLineCoverage() throws Exception {
+		assertEquals(0, packageCoverage.getLineCoverage(), DELTA);
+	}
+
+	@Test
+	public void testAddLineCoverage() throws Exception {
+		for (int j = 0; j < TIMES; j++) {
+			packageCoverage.addLineCoverage(SAMPLE_COVERAGE_COUNT);
+		}
+
+		assertEquals(TIMES * SAMPLE_COVERAGE_COUNT, packageCoverage
+				.getLineCoverage(), DELTA);
+	}
+}
diff --git a/test/net/sourceforge/cobertura/coveragedata/ClassDataTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/ClassDataTest.java
similarity index 82%
rename from test/net/sourceforge/cobertura/coveragedata/ClassDataTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/ClassDataTest.java
index 74b2327..9288377 100644
--- a/test/net/sourceforge/cobertura/coveragedata/ClassDataTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/ClassDataTest.java
@@ -1,264 +1,261 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.Collection;
-
-import junit.framework.TestCase;
-
-public class ClassDataTest extends TestCase
-{
-
-	private final ClassData a = new ClassData("com.example.HelloWorld");
-	private final ClassData b = new ClassData("com.example.HelloWorld");
-	private final ClassData c = new ClassData("com.example.HelloWorld");
-	private final ClassData defPckg = new ClassData("DefaultPackageClass");
-
-	public void setUp()
-	{
-		a.setSourceFileName("com/example/HelloWorld.java");
-		b.setSourceFileName("com/example/HelloWorld.java");
-		c.setSourceFileName("com/example/HelloWorld.java");
-		defPckg.setSourceFileName("DefaultPackageClass.java");
-
-		for (int i = 1; i <= 5; i++)
-			b.addLine(i, "test", "(I)B");
-		for (int i = 1; i <= 5; i++)
-			c.addLine(i, "test", "(I)B");
-		for (int i = 1; i <= 5; i++)
-			defPckg.addLine(i, "test", "(I)B");
-
-		b.touch(1,1);
-		b.touch(2,1);
-	}
-
-	public void testBranch()
-	{
-		// Setting an invalid line as a branch should not make the line valid
-		assertFalse(a.hasBranch(2));
-		a.addLineJump(2, 0);
-		assertFalse(a.hasBranch(2));
-
-		assertFalse(b.hasBranch(2));
-		b.addLineJump(2, 0);
-		assertTrue(b.hasBranch(2));
-
-		assertTrue(b.hasBranch(2));
-		b.addLineJump(2, 1);
-		assertTrue(b.hasBranch(2));
-
-		assertFalse(b.hasBranch(4));
-		b.addLineSwitch(4, 0, 1, 9);
-		assertTrue(b.hasBranch(4));
-
-		Collection branches = b.getBranches();
-		assertEquals(2, branches.size());
-		assertEquals(14, b.getNumberOfValidBranches());
-		assertTrue(branches.contains(new Integer(2)));
-		assertTrue(branches.contains(new Integer(4)));
-		//assertTrue(branches.contains(new LineData(2, "test", "(I)B")));
-		//assertTrue(branches.contains(new LineData(4, "test", "(I)B")));
-	}
-
-	public void testBranchCoverage()
-	{
-		assertEquals(0, a.getNumberOfValidBranches());
-		assertEquals(0, b.getNumberOfValidBranches());
-		assertEquals(1.00d, a.getBranchCoverageRate(), 0d);
-		assertEquals(1.00d, b.getBranchCoverageRate(), 0d);
-
-		assertEquals(1.00d, a.getBranchCoverageRate("test(I)B"), 0d);
-		assertEquals(1.00d, b.getBranchCoverageRate("test(I)B"), 0d);
-
-		c.addLineJump(1, 0);
-		c.addLineJump(2, 0);
-		c.addLineSwitch(3, 0, 1, 3);
-		c.addLineSwitch(4, 0, 1, 3);
-
-		assertEquals(12, c.getNumberOfValidBranches());
-		assertEquals(0, c.getNumberOfCoveredBranches());
-		assertEquals(0.00d, c.getBranchCoverageRate(), 0d);
-		assertEquals(0.00d, c.getBranchCoverageRate("test(I)B"), 0d);
-
-		c.touchJump(1, 0, true,1);
-		c.touchJump(1, 0, false,1);
-		c.touchJump(2, 0, true,1);
-		c.touchJump(2, 0, false,1);
-
-		assertEquals(12, c.getNumberOfValidBranches());
-		assertEquals(4, c.getNumberOfCoveredBranches());
-		assertEquals(0.33d, c.getBranchCoverageRate(), 0.01d);
-		assertEquals(0.33d, c.getBranchCoverageRate("test(I)B"), 0.01d);
-
-		c.touchSwitch(3, 0, 0,1);
-		c.touchSwitch(3, 0, 1,1);
-		c.touchSwitch(4, 0, 2,1);
-		c.touchSwitch(4, 0, -1,1);
-		
-		assertEquals(12, c.getNumberOfValidBranches());
-		assertEquals(8, c.getNumberOfCoveredBranches());
-		assertEquals(0.66d, c.getBranchCoverageRate(), 0.01d);
-		assertEquals(0.66d, c.getBranchCoverageRate("test(I)B"), 0.01d);
-	}
-
-	public void testConstructor()
-	{
-		try
-		{
-			new ClassData(null);
-			fail("Expected an IllegalArgumentException but did not receive one!");
-		}
-		catch (IllegalArgumentException e)
-		{
-			// Good!
-		}
-
-		assertEquals("HelloWorld", a.getBaseName());
-		assertEquals("com.example", a.getPackageName());
-		assertEquals("com.example.HelloWorld", a.getName());
-		
-		assertEquals("DefaultPackageClass", defPckg.getBaseName());
-		assertEquals("", defPckg.getPackageName());
-		assertEquals("DefaultPackageClass", defPckg.getName());
-	}
-
-	public void testEquals()
-	{
-		assertFalse(a.equals(null));
-		assertFalse(a.equals(new Integer(4)));
-		assertFalse(a.equals(new PackageData("com.example")));
-
-		assertTrue(a.equals(a));
-		assertFalse(a.equals(b));
-		assertFalse(a.equals(c));
-		assertFalse(a.equals(defPckg));
-		assertFalse(b.equals(a));
-		assertTrue(b.equals(b));
-		assertFalse(b.equals(c));
-		assertFalse(b.equals(defPckg));
-		assertFalse(c.equals(a));
-		assertFalse(c.equals(b));
-		assertTrue(c.equals(c));
-		assertFalse(c.equals(defPckg));
-		assertFalse(defPckg.equals(a));
-		assertFalse(defPckg.equals(b));
-		assertFalse(defPckg.equals(c));
-		assertTrue(defPckg.equals(defPckg));
-		
-
-		c.touch(1,1);
-		c.touch(2,1);
-		assertTrue(b.equals(c));
-	}
-
-	public void testLineCoverage()
-	{
-		assertEquals(0, a.getNumberOfCoveredLines());
-		assertEquals(0, a.getNumberOfValidLines());
-		assertEquals(2, b.getNumberOfCoveredLines());
-		assertEquals(5, b.getNumberOfValidLines());
-		assertEquals(0, c.getNumberOfCoveredLines());
-		assertEquals(5, c.getNumberOfValidLines());
-		assertEquals(1d, a.getLineCoverageRate(), 0d);
-		assertEquals(0.4d, b.getLineCoverageRate(), 0d);
-		assertEquals(0d, c.getLineCoverageRate(), 0d);
-
-		assertEquals(1d, a.getLineCoverageRate("test(I)B"), 0d);
-		assertEquals(0.4d, b.getLineCoverageRate("test(I)B"), 0d);
-		assertEquals(0d, c.getLineCoverageRate("test(I)B"), 0d);
-
-		assertEquals(1d, a.getLineCoverageRate("notReal(I)B"), 0d);
-		assertEquals(1d, b.getLineCoverageRate("notReal(I)B"), 0d);
-		assertEquals(1d, c.getLineCoverageRate("notReal(I)B"), 0d);
-	}
-
-	public void testRemoveLine()
-	{
-		assertEquals(0, a.getNumberOfValidBranches());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(0, a.getNumberOfValidLines());
-		a.removeLine(3);
-		assertEquals(0, a.getNumberOfValidBranches());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(0, a.getNumberOfValidLines());
-
-		assertEquals(0, b.getNumberOfValidBranches());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(5, b.getNumberOfValidLines());
-		b.removeLine(3);
-		assertEquals(0, b.getNumberOfValidBranches());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(4, b.getNumberOfValidLines());
-
-		c.addLineJump(2, 0);
-		c.addLineSwitch(3, 0, 1, 2);
-		c.addLineJump(3, 0);
-		c.addLineJump(4, 0);
-		assertEquals(9, c.getNumberOfValidBranches());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(5, c.getNumberOfValidLines());
-		c.removeLine(3);
-		assertEquals(4, c.getNumberOfValidBranches());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(4, c.getNumberOfValidLines());
-	}
-
-	public void testSourceFileName()
-	{
-		a.setSourceFileName(null);
-		assertEquals("com/example/HelloWorld.java", a.getSourceFileName());
-		a.setSourceFileName("HelloWorld.java");
-		assertEquals("com/example/HelloWorld.java", a.getSourceFileName());
-
-		ClassData d = new ClassData("org.jaxen.expr.IdentitySet$IdentityWrapp");
-		assertEquals("org/jaxen/expr/IdentitySet.java", d.getSourceFileName());
-
-		ClassData e = new ClassData("org.jaxen.expr.NodeComparator$1");
-		assertEquals("org/jaxen/expr/NodeComparator.java", e.getSourceFileName());
-		
-		assertEquals( "DefaultPackageClass.java", defPckg.getSourceFileName());
-		
-		ClassData f = new ClassData("$strangeClass");
-		assertEquals( "$strangeClass.java", f.getSourceFileName());
-	}
-
-	public void testTouch()
-	{
-		int line = 3;
-
-		assertFalse(a.isValidSourceLineNumber(line));
-		a.touch(line,1);
-		assertTrue(a.isValidSourceLineNumber(line));
-
-		assertTrue(b.isValidSourceLineNumber(line));
-		assertEquals(0, b.getLineCoverage(line).getHits());
-		b.touch(line,1);
-		assertTrue(b.isValidSourceLineNumber(line));
-		assertEquals(1, b.getLineCoverage(line).getHits());
-		b.touch(line,1);
-		assertEquals(2, b.getLineCoverage(line).getHits());
-		assertTrue(b.isValidSourceLineNumber(line));
-	}
-
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collection;
+
+import static org.junit.Assert.*;
+
+public class ClassDataTest {
+
+	private final ClassData a = new ClassData("com.example.HelloWorld");
+	private final ClassData b = new ClassData("com.example.HelloWorld");
+	private final ClassData c = new ClassData("com.example.HelloWorld");
+	private final ClassData defPckg = new ClassData("DefaultPackageClass");
+
+	@Before
+	public void setUp() {
+		a.setSourceFileName("com/example/HelloWorld.java");
+		b.setSourceFileName("com/example/HelloWorld.java");
+		c.setSourceFileName("com/example/HelloWorld.java");
+		defPckg.setSourceFileName("DefaultPackageClass.java");
+
+		for (int i = 1; i <= 5; i++)
+			b.addLine(i, "test", "(I)B");
+		for (int i = 1; i <= 5; i++)
+			c.addLine(i, "test", "(I)B");
+		for (int i = 1; i <= 5; i++)
+			defPckg.addLine(i, "test", "(I)B");
+
+		b.touch(1, 1);
+		b.touch(2, 1);
+	}
+
+	@Test
+	public void testBranch() {
+		// Setting an invalid line as a branch should not make the line valid
+		assertFalse(a.hasBranch(2));
+		a.addLineJump(2, 0);
+		assertFalse(a.hasBranch(2));
+
+		assertFalse(b.hasBranch(2));
+		b.addLineJump(2, 0);
+		assertTrue(b.hasBranch(2));
+
+		assertTrue(b.hasBranch(2));
+		b.addLineJump(2, 1);
+		assertTrue(b.hasBranch(2));
+
+		assertFalse(b.hasBranch(4));
+		b.addLineSwitch(4, 0, 1, 9, Integer.MAX_VALUE);
+		assertTrue(b.hasBranch(4));
+
+		Collection branches = b.getBranches();
+		assertEquals(2, branches.size());
+		assertEquals(14, b.getNumberOfValidBranches());
+		assertTrue(branches.contains(new Integer(2)));
+		assertTrue(branches.contains(new Integer(4)));
+		//assertTrue(branches.contains(new LineData(2, "test", "(I)B")));
+		//assertTrue(branches.contains(new LineData(4, "test", "(I)B")));
+	}
+
+	@Test
+	public void testBranchCoverage() {
+		assertEquals(0, a.getNumberOfValidBranches());
+		assertEquals(0, b.getNumberOfValidBranches());
+		assertEquals(1.00d, a.getBranchCoverageRate(), 0d);
+		assertEquals(1.00d, b.getBranchCoverageRate(), 0d);
+
+		assertEquals(1.00d, a.getBranchCoverageRate("test(I)B"), 0d);
+		assertEquals(1.00d, b.getBranchCoverageRate("test(I)B"), 0d);
+
+		c.addLineJump(1, 0);
+		c.addLineJump(2, 0);
+		c.addLineSwitch(3, 0, 1, 3, Integer.MAX_VALUE);
+		c.addLineSwitch(4, 0, 1, 3, Integer.MAX_VALUE);
+
+		assertEquals(12, c.getNumberOfValidBranches());
+		assertEquals(0, c.getNumberOfCoveredBranches());
+		assertEquals(0.00d, c.getBranchCoverageRate(), 0d);
+		assertEquals(0.00d, c.getBranchCoverageRate("test(I)B"), 0d);
+
+		c.touchJump(1, 0, true, 1);
+		c.touchJump(1, 0, false, 1);
+		c.touchJump(2, 0, true, 1);
+		c.touchJump(2, 0, false, 1);
+
+		assertEquals(12, c.getNumberOfValidBranches());
+		assertEquals(4, c.getNumberOfCoveredBranches());
+		assertEquals(0.33d, c.getBranchCoverageRate(), 0.01d);
+		assertEquals(0.33d, c.getBranchCoverageRate("test(I)B"), 0.01d);
+
+		c.touchSwitch(3, 0, 0, 1);
+		c.touchSwitch(3, 0, 1, 1);
+		c.touchSwitch(4, 0, 2, 1);
+		c.touchSwitch(4, 0, -1, 1);
+
+		assertEquals(12, c.getNumberOfValidBranches());
+		assertEquals(8, c.getNumberOfCoveredBranches());
+		assertEquals(0.66d, c.getBranchCoverageRate(), 0.01d);
+		assertEquals(0.66d, c.getBranchCoverageRate("test(I)B"), 0.01d);
+	}
+
+	@Test
+	public void testConstructor() {
+		assertEquals("HelloWorld", a.getBaseName());
+		assertEquals("com.example", a.getPackageName());
+		assertEquals("com.example.HelloWorld", a.getName());
+
+		assertEquals("DefaultPackageClass", defPckg.getBaseName());
+		assertEquals("", defPckg.getPackageName());
+		assertEquals("DefaultPackageClass", defPckg.getName());
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testConstructorNullArgument() {
+		new ClassData(null);
+	}
+
+	@Test
+	public void testEquals() {
+		assertFalse(a.equals(null));
+		assertFalse(a.equals(new Integer(4)));
+		assertFalse(a.equals(new PackageData("com.example")));
+
+		assertTrue(a.equals(a));
+		assertFalse(a.equals(b));
+		assertFalse(a.equals(c));
+		assertFalse(a.equals(defPckg));
+		assertFalse(b.equals(a));
+		assertTrue(b.equals(b));
+		assertFalse(b.equals(c));
+		assertFalse(b.equals(defPckg));
+		assertFalse(c.equals(a));
+		assertFalse(c.equals(b));
+		assertTrue(c.equals(c));
+		assertFalse(c.equals(defPckg));
+		assertFalse(defPckg.equals(a));
+		assertFalse(defPckg.equals(b));
+		assertFalse(defPckg.equals(c));
+		assertTrue(defPckg.equals(defPckg));
+
+		c.touch(1, 1);
+		c.touch(2, 1);
+		assertTrue(b.equals(c));
+	}
+
+	@Test
+	public void testLineCoverage() {
+		assertEquals(0, a.getNumberOfCoveredLines());
+		assertEquals(0, a.getNumberOfValidLines());
+		assertEquals(2, b.getNumberOfCoveredLines());
+		assertEquals(5, b.getNumberOfValidLines());
+		assertEquals(0, c.getNumberOfCoveredLines());
+		assertEquals(5, c.getNumberOfValidLines());
+		assertEquals(1d, a.getLineCoverageRate(), 0d);
+		assertEquals(0.4d, b.getLineCoverageRate(), 0d);
+		assertEquals(0d, c.getLineCoverageRate(), 0d);
+
+		assertEquals(1d, a.getLineCoverageRate("test(I)B"), 0d);
+		assertEquals(0.4d, b.getLineCoverageRate("test(I)B"), 0d);
+		assertEquals(0d, c.getLineCoverageRate("test(I)B"), 0d);
+
+		assertEquals(1d, a.getLineCoverageRate("notReal(I)B"), 0d);
+		assertEquals(1d, b.getLineCoverageRate("notReal(I)B"), 0d);
+		assertEquals(1d, c.getLineCoverageRate("notReal(I)B"), 0d);
+	}
+
+	@Test
+	public void testRemoveLine() {
+		assertEquals(0, a.getNumberOfValidBranches());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(0, a.getNumberOfValidLines());
+		a.removeLine(3);
+		assertEquals(0, a.getNumberOfValidBranches());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(0, a.getNumberOfValidLines());
+
+		assertEquals(0, b.getNumberOfValidBranches());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(5, b.getNumberOfValidLines());
+		b.removeLine(3);
+		assertEquals(0, b.getNumberOfValidBranches());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(4, b.getNumberOfValidLines());
+
+		c.addLineJump(2, 0);
+		c.addLineSwitch(3, 0, 1, 2, Integer.MAX_VALUE);
+		c.addLineJump(3, 0);
+		c.addLineJump(4, 0);
+		assertEquals(9, c.getNumberOfValidBranches());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(5, c.getNumberOfValidLines());
+		c.removeLine(3);
+		assertEquals(4, c.getNumberOfValidBranches());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(4, c.getNumberOfValidLines());
+	}
+
+	@Test
+	public void testSourceFileName() {
+		a.setSourceFileName(null);
+		assertEquals("com/example/HelloWorld.java", a.getSourceFileName());
+		a.setSourceFileName("HelloWorld.java");
+		assertEquals("com/example/HelloWorld.java", a.getSourceFileName());
+
+		ClassData d = new ClassData("org.jaxen.expr.IdentitySet$IdentityWrapp");
+		assertEquals("org/jaxen/expr/IdentitySet.java", d.getSourceFileName());
+
+		ClassData e = new ClassData("org.jaxen.expr.NodeComparator$1");
+		assertEquals("org/jaxen/expr/NodeComparator.java", e
+				.getSourceFileName());
+
+		assertEquals("DefaultPackageClass.java", defPckg.getSourceFileName());
+
+		ClassData f = new ClassData("$strangeClass");
+		assertEquals("$strangeClass.java", f.getSourceFileName());
+	}
+
+	@Test
+	public void testTouch() {
+		int line = 3;
+
+		assertFalse(a.isValidSourceLineNumber(line));
+		a.touch(line, 1);
+		assertTrue(a.isValidSourceLineNumber(line));
+
+		assertTrue(b.isValidSourceLineNumber(line));
+		assertEquals(0, b.getLineCoverage(line).getHits());
+		b.touch(line, 1);
+		assertTrue(b.isValidSourceLineNumber(line));
+		assertEquals(1, b.getLineCoverage(line).getHits());
+		b.touch(line, 1);
+		assertEquals(2, b.getLineCoverage(line).getHits());
+		assertTrue(b.isValidSourceLineNumber(line));
+	}
+
 }
\ No newline at end of file
diff --git a/test/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandlerTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandlerTest.java
similarity index 83%
rename from test/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandlerTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandlerTest.java
index db446b1..93fa28b 100644
--- a/test/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandlerTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandlerTest.java
@@ -1,86 +1,87 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.io.File;
-
-import junit.framework.TestCase;
-
-public class CoverageDataFileHandlerTest extends TestCase
-{
-
-	private final static String basedir = (System.getProperty("basedir") != null)
-			? System.getProperty("basedir")
-			: ".";
-	private final static String pathToTestOutput = basedir
-			+ "/build/test/CoverageDataFileHandlerTest";
-
-	private final ProjectData a = new ProjectData();
-	private File tmpDir = new File(pathToTestOutput);
-
-	public void setUp()
-	{
-		// Create some coverage data
-		ClassData classData;
-		assertEquals(0, a.getNumberOfClasses());
-		assertEquals(0, a.getNumberOfChildren());
-
-		classData = new ClassData("HelloWorld");
-		classData.setSourceFileName("com/example/HelloWorld.java");
-		for (int i = 0; i < 10; i++)
-			classData.addLine(i, "test", "(I)B");
-		a.addClassData(classData);
-		assertEquals(1, a.getNumberOfClasses());
-		assertEquals(1, a.getNumberOfChildren());
-
-		classData = new ClassData("HelloWorldHelper");
-		classData.setSourceFileName("com/example/HelloWorldHelper.java");
-		for (int i = 0; i < 14; i++)
-			classData.addLine(i, "test", "(I)B");
-		a.addClassData(classData);
-		assertEquals(2, a.getNumberOfClasses());
-		assertEquals(1, a.getNumberOfChildren());
-
-		// Create the directory for our serialized coverage data
-		tmpDir.mkdirs();
-	}
-
-	public void tearDown()
-	{
-		tmpDir = new File(pathToTestOutput);
-		File files[] = tmpDir.listFiles();
-		for (int i = 0; i < files.length; i++)
-			files[i].delete();
-		tmpDir.delete();
-	}
-
-	public void testSaveAndRestore()
-	{
-		File dataFile = new File(tmpDir, "cobertura.ser");
-		CoverageDataFileHandler.saveCoverageData(a, dataFile);
-
-		ProjectData b;
-		b = CoverageDataFileHandler.loadCoverageData(dataFile);
-		assertEquals(a, b);
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class CoverageDataFileHandlerTest {
+
+	private final static String basedir = ".";
+	private final static String pathToTestOutput = basedir
+			+ "/target/test/CoverageDataFileHandlerTest";
+
+	private final ProjectData a = new ProjectData();
+	private File tmpDir = new File(pathToTestOutput);
+
+	@Before
+	public void setUp() {
+		// Create some coverage data
+		ClassData classData;
+		assertEquals(0, a.getNumberOfClasses());
+		assertEquals(0, a.getNumberOfChildren());
+
+		classData = new ClassData("HelloWorld");
+		classData.setSourceFileName("com/example/HelloWorld.java");
+		for (int i = 0; i < 10; i++)
+			classData.addLine(i, "test", "(I)B");
+		a.addClassData(classData);
+		assertEquals(1, a.getNumberOfClasses());
+		assertEquals(1, a.getNumberOfChildren());
+
+		classData = new ClassData("HelloWorldHelper");
+		classData.setSourceFileName("com/example/HelloWorldHelper.java");
+		for (int i = 0; i < 14; i++)
+			classData.addLine(i, "test", "(I)B");
+		a.addClassData(classData);
+		assertEquals(2, a.getNumberOfClasses());
+		assertEquals(1, a.getNumberOfChildren());
+
+		// Create the directory for our serialized coverage data
+		tmpDir.mkdirs();
+	}
+
+	@After
+	public void tearDown() {
+		tmpDir = new File(pathToTestOutput);
+		File files[] = tmpDir.listFiles();
+		for (int i = 0; i < files.length; i++)
+			files[i].delete();
+		tmpDir.delete();
+	}
+
+	@Test
+	public void testSaveAndRestore() {
+		File dataFile = new File(tmpDir, "cobertura.ser");
+		CoverageDataFileHandler.saveCoverageData(a, dataFile);
+
+		ProjectData b;
+		b = CoverageDataFileHandler.loadCoverageData(dataFile);
+		assertEquals(a, b);
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/coveragedata/JumpDataTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/JumpDataTest.java
similarity index 79%
rename from test/net/sourceforge/cobertura/coveragedata/JumpDataTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/JumpDataTest.java
index e617cd5..3b9d73d 100644
--- a/test/net/sourceforge/cobertura/coveragedata/JumpDataTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/JumpDataTest.java
@@ -1,91 +1,93 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import junit.framework.TestCase;
-
-public class JumpDataTest extends TestCase
-{
-
-	private final JumpData a = new JumpData(0);
-	private final JumpData b = new JumpData(1);
-
-	public void testEquals()
-	{
-		assertFalse(a.equals(null));
-		assertFalse(a.equals(new Integer(4)));
-
-		assertTrue(a.equals(a));
-		assertFalse(a.equals(b));
-
-		JumpData aPrime = new JumpData(0);
-		assertTrue(a.equals(aPrime));
-	}
-
-	public void testHashCode()
-	{
-		assertEquals(a.hashCode(), a.hashCode());
-
-		JumpData aPrime = new JumpData(0);
-		assertEquals(a.hashCode(), aPrime.hashCode());
-	}
-
-	public void testGetBranchNumber()
-	{
-		assertEquals(0, a.getConditionNumber());
-		assertEquals(1, b.getConditionNumber());
-	}
-
-	public void testGetNumbers()
-	{
-		assertEquals(0, a.getBranchCoverageRate(), 0);
-		assertEquals(2, a.getNumberOfValidBranches());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-
-		for (int i = 0; i < 5; i++)
-		{
-			a.touchBranch(true,1);
-			assertEquals(0.5, a.getBranchCoverageRate(), 0);
-			assertEquals(2, a.getNumberOfValidBranches());
-			assertEquals(1, a.getNumberOfCoveredBranches());
-		}
-
-		a.touchBranch(false,1);
-		assertEquals(1, a.getBranchCoverageRate(), 0);
-		assertEquals(2, a.getNumberOfValidBranches());
-		assertEquals(2, a.getNumberOfCoveredBranches());
-	}
-
-	public void testTouchBranch()
-	{
-		assertEquals(0, a.getTrueHits());
-		for (int i = 0; i < 400; i++)
-			a.touchBranch(true,1);
-		assertEquals(400, a.getTrueHits());
-		
-		assertEquals(0, a.getFalseHits());
-		for (int i = 0; i < 200; i++)
-			a.touchBranch(false,1);
-		assertEquals(200, a.getFalseHits());
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class JumpDataTest {
+
+	private final JumpData a = new JumpData(0);
+	private final JumpData b = new JumpData(1);
+
+	@Test
+	public void testEquals() {
+		assertFalse(a.equals(null));
+		assertFalse(a.equals(new Integer(4)));
+
+		assertTrue(a.equals(a));
+		assertFalse(a.equals(b));
+
+		JumpData aPrime = new JumpData(0);
+		assertTrue(a.equals(aPrime));
+	}
+
+	@Test
+	public void testHashCode() {
+		assertEquals(a.hashCode(), a.hashCode());
+
+		JumpData aPrime = new JumpData(0);
+		assertEquals(a.hashCode(), aPrime.hashCode());
+	}
+
+	@Test
+	public void testGetBranchNumber() {
+		assertEquals(0, a.getConditionNumber());
+		assertEquals(1, b.getConditionNumber());
+	}
+
+	@Test
+	public void testGetNumbers() {
+		assertEquals(0, a.getBranchCoverageRate(), 0);
+		assertEquals(2, a.getNumberOfValidBranches());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+
+		for (int i = 0; i < 5; i++) {
+			a.touchBranch(true, 1);
+			assertEquals(0.5, a.getBranchCoverageRate(), 0);
+			assertEquals(2, a.getNumberOfValidBranches());
+			assertEquals(1, a.getNumberOfCoveredBranches());
+		}
+
+		a.touchBranch(false, 1);
+		assertEquals(1, a.getBranchCoverageRate(), 0);
+		assertEquals(2, a.getNumberOfValidBranches());
+		assertEquals(2, a.getNumberOfCoveredBranches());
+	}
+
+	@Test
+	public void testTouchBranch() {
+		assertEquals(0, a.getTrueHits());
+		for (int i = 0; i < 400; i++)
+			a.touchBranch(true, 1);
+		assertEquals(400, a.getTrueHits());
+
+		assertEquals(0, a.getFalseHits());
+		for (int i = 0; i < 200; i++)
+			a.touchBranch(false, 1);
+		assertEquals(200, a.getFalseHits());
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/coveragedata/LineDataTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/LineDataTest.java
similarity index 81%
rename from test/net/sourceforge/cobertura/coveragedata/LineDataTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/LineDataTest.java
index c8eec91..c4abc69 100644
--- a/test/net/sourceforge/cobertura/coveragedata/LineDataTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/LineDataTest.java
@@ -1,319 +1,309 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import junit.framework.TestCase;
-
-public class LineDataTest extends TestCase
-{
-
-	private final LineData a = new LineData(10, "test1", "(I)B");
-	private final LineData b = new LineData(11, "test1", "(I)B");
-	private final LineData c = new LineData(12, "test2", "(I)B");
-	private final LineData d = new LineData(13, "test2", "(I)B");
-	private final LineData e = new LineData(14);
-	private final LineData f = new LineData(15);
-
-	public void testEquals()
-	{
-		assertFalse(a.equals(null));
-		assertFalse(a.equals(new Integer(4)));
-
-		assertTrue(a.equals(a));
-		assertFalse(a.equals(b));
-		assertFalse(a.equals(c));
-		assertFalse(a.equals(d));
-		assertFalse(a.equals(e));
-		assertFalse(a.equals(f));
-
-		LineData aPrime = new LineData(10, "test1", "(I)B");
-		assertTrue(a.equals(aPrime));
-	}
-
-	public void testHashCode()
-	{
-		assertEquals(a.hashCode(), a.hashCode());
-
-		LineData aPrime = new LineData(10, "test1", "(I)B");
-		assertEquals(a.hashCode(), aPrime.hashCode());
-	}
-
-	public void testGetLineNumber()
-	{
-		assertEquals(10, a.getLineNumber());
-		assertEquals(11, b.getLineNumber());
-		assertEquals(12, c.getLineNumber());
-		assertEquals(13, d.getLineNumber());
-		assertEquals(14, e.getLineNumber());
-		assertEquals(15, f.getLineNumber());
-	}
-
-	public void testGetNumbers()
-	{
-		assertEquals(1, a.getBranchCoverageRate(), 0);
-		assertEquals(0, a.getLineCoverageRate(), 0);
-		assertEquals(0, a.getNumberOfCoveredLines());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(0, a.getNumberOfValidBranches());
-		assertEquals(1, a.getNumberOfValidLines());
-
-		a.addJump(0);
-		a.addJump(1);
-		assertEquals(0, a.getBranchCoverageRate(), 0);
-		assertEquals(0, a.getLineCoverageRate(), 0);
-		assertEquals(0, a.getNumberOfCoveredLines());
-		assertEquals(0, a.getNumberOfCoveredBranches());
-		assertEquals(4, a.getNumberOfValidBranches());
-		assertEquals(1, a.getNumberOfValidLines());
-
-		for (int i = 0; i < 5; i++)
-		{
-			a.touch(1);
-			assertEquals(0, a.getBranchCoverageRate(), 0);
-			assertEquals(1, a.getLineCoverageRate(), 0);
-			assertEquals(1, a.getNumberOfCoveredLines());
-			assertEquals(0, a.getNumberOfCoveredBranches());
-			assertEquals(4, a.getNumberOfValidBranches());
-			assertEquals(1, a.getNumberOfValidLines());
-		}
-
-		a.touchJump(0, true,1);
-		assertEquals(0.25, a.getBranchCoverageRate(), 0);
-		assertEquals(1, a.getLineCoverageRate(), 0);
-		assertEquals(1, a.getNumberOfCoveredLines());
-		assertEquals(1, a.getNumberOfCoveredBranches());
-		assertEquals(4, a.getNumberOfValidBranches());
-		assertEquals(1, a.getNumberOfValidLines());
-
-		a.touchJump(1, false,1);
-		assertEquals(0.5, a.getBranchCoverageRate(), 0);
-		assertEquals(1, a.getLineCoverageRate(), 0);
-		assertEquals(1, a.getNumberOfCoveredLines());
-		assertEquals(2, a.getNumberOfCoveredBranches());
-		assertEquals(4, a.getNumberOfValidBranches());
-		assertEquals(1, a.getNumberOfValidLines());
-
-		a.touchJump(1, true,1);
-		assertEquals(0.75, a.getBranchCoverageRate(), 0);
-		assertEquals(1, a.getLineCoverageRate(), 0);
-		assertEquals(1, a.getNumberOfCoveredLines());
-		assertEquals(3, a.getNumberOfCoveredBranches());
-		assertEquals(4, a.getNumberOfValidBranches());
-		assertEquals(1, a.getNumberOfValidLines());
-
-		a.touchJump(0, false,1);
-		assertEquals(1, a.getBranchCoverageRate(), 0);
-		assertEquals(1, a.getLineCoverageRate(), 0);
-		assertEquals(1, a.getNumberOfCoveredLines());
-		assertEquals(4, a.getNumberOfCoveredBranches());
-		assertEquals(4, a.getNumberOfValidBranches());
-		assertEquals(1, a.getNumberOfValidLines());
-	}
-
-	public void testSetConditional()
-	{
-		assertFalse(c.hasBranch());
-		c.addJump(0);
-		assertTrue(c.hasBranch());
-		c.addJump(1);
-		assertTrue(c.hasBranch());
-	}
-
-	public void testSetMethodNameAndDescriptor()
-	{
-		e.setMethodNameAndDescriptor("test3", "(I)B");
-		assertEquals("test3", e.getMethodName());
-		assertEquals("(I)B", e.getMethodDescriptor());
-
-		f.setMethodNameAndDescriptor("test4", "(I)B");
-		assertEquals("test4", f.getMethodName());
-		assertEquals("(I)B", f.getMethodDescriptor());
-	}
-
-	public void testTouch()
-	{
-		assertEquals(0, a.getHits());
-		for (int i = 0; i < 400; i++)
-			a.touch(2);
-		assertEquals(800, a.getHits());
-	}
-
-	private static void getSwitchDataIteratively(LineData data)
-	{
-		/*
-		 * When this test fails, it usually does so well before 2000 iterations.   If it
-		 * gets past 2000, it will usually pass, so there is not much need in going much
-		 * past 2000.
-		 */
-		for (int i=0; i<2000; i++)
-		{
-			/*
-			 * The following yield is needed to make sure the other thread gets
-			 * some CPU.  Otherwise, this thread will get too much of a jump ahead
-			 * of the other thread.
-			 */
-			Thread.yield(); 
-			
-			data.getSwitchData(i, new SwitchData(1));
-		}
-	}
-	
-	private void runGetSwitchDataTestWithTwoThreads() throws Throwable
-	{
-		final LineData data = new LineData(2);
-		final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>();
-		
-		ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") {
-			public void uncaughtException(Thread thread, Throwable t)
-			{
-				/*
-				 * Save the Throwable for later use and interrupt this thread so it exits
-				 */
-				possibleThrowable.set(t);
-				thread.interrupt();
-			}
-		};
-		
-		/*
-		 * Create two threads using the above thread group
-		 */
-		Thread thread1 = new Thread(threadGroup, "1") {
-			public void run()
-			{
-				getSwitchDataIteratively(data);
-			}
-		};
-		Thread thread2 = new Thread(threadGroup, "2") {
-			public void run()
-			{
-				getSwitchDataIteratively(data);
-			}
-		};
-		thread1.start();
-		thread2.start();
-		/*
-		 * Wait for the threads to exit
-		 */
-		if (thread1.isAlive()) thread1.join();
-		if (thread2.isAlive()) thread2.join();
-		Throwable t = possibleThrowable.get();
-		if (t != null)
-		{
-			throw t;
-		}
-	}
-
-	public void testMultiThreadedGetSwitchData() throws Throwable
-	{
-		/*
-		 * This test will often pass with only one iteration.
-		 * It passes once in a while with 10.   It never passes
-		 * with 100 (I hope).
-		 */
-		for (int i=0; i<100; i++)
-		{
-			runGetSwitchDataTestWithTwoThreads();
-		}
-	}
-	
-	private static void getJumpDataIteratively(LineData data)
-	{
-		/*
-		 * When this test fails, it usually does so well before 2000 iterations.   If it
-		 * gets past 2000, it will usually pass, so there is not much need in going much
-		 * past 2000.
-		 */
-		for (int i=0; i<2000; i++)
-		{
-			/*
-			 * The following yield is needed to make sure the other thread gets
-			 * some CPU.  Otherwise, this thread will get too much of a jump ahead
-			 * of the other thread.
-			 */
-			Thread.yield(); 
-			
-			data.getJumpData(i);
-		}
-	}
-	
-	private void runGetJumpDataTestWithTwoThreads() throws Throwable
-	{
-		final LineData data = new LineData(2);
-		final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>();
-		
-		ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") {
-			public void uncaughtException(Thread thread, Throwable t)
-			{
-				/*
-				 * Save the Throwable for later use and interrupt this thread so it exits
-				 */
-				possibleThrowable.set(t);
-				thread.interrupt();
-			}
-		};
-		
-		/*
-		 * Create two threads using the above thread group
-		 */
-		Thread thread1 = new Thread(threadGroup, "1") {
-			public void run()
-			{
-				getJumpDataIteratively(data);
-			}
-		};
-		Thread thread2 = new Thread(threadGroup, "2") {
-			public void run()
-			{
-				getJumpDataIteratively(data);
-			}
-		};
-		thread1.start();
-		thread2.start();
-		/*
-		 * Wait for the threads to exit
-		 */
-		if (thread1.isAlive()) thread1.join();
-		if (thread2.isAlive()) thread2.join();
-		Throwable t = possibleThrowable.get();
-		if (t != null)
-		{
-			throw t;
-		}
-	}
-
-	public void testMultiThreadedGetJumpData() throws Throwable
-	{
-		/*
-		 * This test will often pass with only one iteration.
-		 * It passes once in a while with 10.   It never passes
-		 * with 100 (I hope).
-		 */
-		for (int i=0; i<100; i++)
-		{
-			runGetJumpDataTestWithTwoThreads();
-		}
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import org.junit.Test;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class LineDataTest {
+
+	private final LineData a = new LineData(10, "test1", "(I)B");
+	private final LineData b = new LineData(11, "test1", "(I)B");
+	private final LineData c = new LineData(12, "test2", "(I)B");
+	private final LineData d = new LineData(13, "test2", "(I)B");
+	private final LineData e = new LineData(14);
+	private final LineData f = new LineData(15);
+
+	@Test
+	public void testEquals() {
+		assertFalse(a.equals(null));
+		assertFalse(a.equals(new Integer(4)));
+
+		assertTrue(a.equals(a));
+		assertFalse(a.equals(b));
+		assertFalse(a.equals(c));
+		assertFalse(a.equals(d));
+		assertFalse(a.equals(e));
+		assertFalse(a.equals(f));
+
+		LineData aPrime = new LineData(10, "test1", "(I)B");
+		assertTrue(a.equals(aPrime));
+	}
+
+	@Test
+	public void testHashCode() {
+		assertEquals(a.hashCode(), a.hashCode());
+
+		LineData aPrime = new LineData(10, "test1", "(I)B");
+		assertEquals(a.hashCode(), aPrime.hashCode());
+	}
+
+	@Test
+	public void testGetLineNumber() {
+		assertEquals(10, a.getLineNumber());
+		assertEquals(11, b.getLineNumber());
+		assertEquals(12, c.getLineNumber());
+		assertEquals(13, d.getLineNumber());
+		assertEquals(14, e.getLineNumber());
+		assertEquals(15, f.getLineNumber());
+	}
+
+	@Test
+	public void testGetNumbers() {
+		assertEquals(1, a.getBranchCoverageRate(), 0);
+		assertEquals(0, a.getLineCoverageRate(), 0);
+		assertEquals(0, a.getNumberOfCoveredLines());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(0, a.getNumberOfValidBranches());
+		assertEquals(1, a.getNumberOfValidLines());
+
+		a.addJump(0);
+		a.addJump(1);
+		assertEquals(0, a.getBranchCoverageRate(), 0);
+		assertEquals(0, a.getLineCoverageRate(), 0);
+		assertEquals(0, a.getNumberOfCoveredLines());
+		assertEquals(0, a.getNumberOfCoveredBranches());
+		assertEquals(4, a.getNumberOfValidBranches());
+		assertEquals(1, a.getNumberOfValidLines());
+
+		for (int i = 0; i < 5; i++) {
+			a.touch(1);
+			assertEquals(0, a.getBranchCoverageRate(), 0);
+			assertEquals(1, a.getLineCoverageRate(), 0);
+			assertEquals(1, a.getNumberOfCoveredLines());
+			assertEquals(0, a.getNumberOfCoveredBranches());
+			assertEquals(4, a.getNumberOfValidBranches());
+			assertEquals(1, a.getNumberOfValidLines());
+		}
+
+		a.touchJump(0, true, 1);
+		assertEquals(0.25, a.getBranchCoverageRate(), 0);
+		assertEquals(1, a.getLineCoverageRate(), 0);
+		assertEquals(1, a.getNumberOfCoveredLines());
+		assertEquals(1, a.getNumberOfCoveredBranches());
+		assertEquals(4, a.getNumberOfValidBranches());
+		assertEquals(1, a.getNumberOfValidLines());
+
+		a.touchJump(1, false, 1);
+		assertEquals(0.5, a.getBranchCoverageRate(), 0);
+		assertEquals(1, a.getLineCoverageRate(), 0);
+		assertEquals(1, a.getNumberOfCoveredLines());
+		assertEquals(2, a.getNumberOfCoveredBranches());
+		assertEquals(4, a.getNumberOfValidBranches());
+		assertEquals(1, a.getNumberOfValidLines());
+
+		a.touchJump(1, true, 1);
+		assertEquals(0.75, a.getBranchCoverageRate(), 0);
+		assertEquals(1, a.getLineCoverageRate(), 0);
+		assertEquals(1, a.getNumberOfCoveredLines());
+		assertEquals(3, a.getNumberOfCoveredBranches());
+		assertEquals(4, a.getNumberOfValidBranches());
+		assertEquals(1, a.getNumberOfValidLines());
+
+		a.touchJump(0, false, 1);
+		assertEquals(1, a.getBranchCoverageRate(), 0);
+		assertEquals(1, a.getLineCoverageRate(), 0);
+		assertEquals(1, a.getNumberOfCoveredLines());
+		assertEquals(4, a.getNumberOfCoveredBranches());
+		assertEquals(4, a.getNumberOfValidBranches());
+		assertEquals(1, a.getNumberOfValidLines());
+	}
+
+	@Test
+	public void testSetConditional() {
+		assertFalse(c.hasBranch());
+		c.addJump(0);
+		assertTrue(c.hasBranch());
+		c.addJump(1);
+		assertTrue(c.hasBranch());
+	}
+
+	@Test
+	public void testSetMethodNameAndDescriptor() {
+		e.setMethodNameAndDescriptor("test3", "(I)B");
+		assertEquals("test3", e.getMethodName());
+		assertEquals("(I)B", e.getMethodDescriptor());
+
+		f.setMethodNameAndDescriptor("test4", "(I)B");
+		assertEquals("test4", f.getMethodName());
+		assertEquals("(I)B", f.getMethodDescriptor());
+	}
+
+	@Test
+	public void testTouch() {
+		assertEquals(0, a.getHits());
+		for (int i = 0; i < 400; i++)
+			a.touch(2);
+		assertEquals(800, a.getHits());
+	}
+
+	private static void getSwitchDataIteratively(LineData data) {
+		/*
+		 * When this test fails, it usually does so well before 2000 iterations.   If it
+		 * gets past 2000, it will usually pass, so there is not much need in going much
+		 * past 2000.
+		 */
+		for (int i = 0; i < 2000; i++) {
+			/*
+			 * The following yield is needed to make sure the other thread gets
+			 * some CPU.  Otherwise, this thread will get too much of a jump ahead
+			 * of the other thread.
+			 */
+			Thread.yield();
+
+			data.getSwitchData(i, new SwitchData(1, Integer.MAX_VALUE));
+		}
+	}
+
+	private void runGetSwitchDataTestWithTwoThreads() throws Throwable {
+		final LineData data = new LineData(2);
+		final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>();
+
+		ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") {
+			public void uncaughtException(Thread thread, Throwable t) {
+				/*
+				 * Save the Throwable for later use and interrupt this thread so it exits
+				 */
+				possibleThrowable.set(t);
+				thread.interrupt();
+			}
+		};
+
+		/*
+		 * Create two threads using the above thread group
+		 */
+		Thread thread1 = new Thread(threadGroup, "1") {
+			public void run() {
+				getSwitchDataIteratively(data);
+			}
+		};
+		Thread thread2 = new Thread(threadGroup, "2") {
+			public void run() {
+				getSwitchDataIteratively(data);
+			}
+		};
+		thread1.start();
+		thread2.start();
+		/*
+		 * Wait for the threads to exit
+		 */
+		if (thread1.isAlive())
+			thread1.join();
+		if (thread2.isAlive())
+			thread2.join();
+		Throwable t = possibleThrowable.get();
+		if (t != null) {
+			throw t;
+		}
+	}
+
+	@Test
+	public void testMultiThreadedGetSwitchData() throws Throwable {
+		/*
+		 * This test will often pass with only one iteration.
+		 * It passes once in a while with 10.   It never passes
+		 * with 100 (I hope).
+		 */
+		for (int i = 0; i < 100; i++) {
+			runGetSwitchDataTestWithTwoThreads();
+		}
+	}
+
+	private static void getJumpDataIteratively(LineData data) {
+		/*
+		 * When this test fails, it usually does so well before 2000 iterations.   If it
+		 * gets past 2000, it will usually pass, so there is not much need in going much
+		 * past 2000.
+		 */
+		for (int i = 0; i < 2000; i++) {
+			/*
+			 * The following yield is needed to make sure the other thread gets
+			 * some CPU.  Otherwise, this thread will get too much of a jump ahead
+			 * of the other thread.
+			 */
+			Thread.yield();
+
+			data.getJumpData(i);
+		}
+	}
+
+	private void runGetJumpDataTestWithTwoThreads() throws Throwable {
+		final LineData data = new LineData(2);
+		final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>();
+
+		ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") {
+			public void uncaughtException(Thread thread, Throwable t) {
+				/*
+				 * Save the Throwable for later use and interrupt this thread so it exits
+				 */
+				possibleThrowable.set(t);
+				thread.interrupt();
+			}
+		};
+
+		/*
+		 * Create two threads using the above thread group
+		 */
+		Thread thread1 = new Thread(threadGroup, "1") {
+			public void run() {
+				getJumpDataIteratively(data);
+			}
+		};
+		Thread thread2 = new Thread(threadGroup, "2") {
+			public void run() {
+				getJumpDataIteratively(data);
+			}
+		};
+		thread1.start();
+		thread2.start();
+		/*
+		 * Wait for the threads to exit
+		 */
+		if (thread1.isAlive())
+			thread1.join();
+		if (thread2.isAlive())
+			thread2.join();
+		Throwable t = possibleThrowable.get();
+		if (t != null) {
+			throw t;
+		}
+	}
+
+	@Test
+	public void testMultiThreadedGetJumpData() throws Throwable {
+		/*
+		 * This test will often pass with only one iteration.
+		 * It passes once in a while with 10.   It never passes
+		 * with 100 (I hope).
+		 */
+		for (int i = 0; i < 100; i++) {
+			runGetJumpDataTestWithTwoThreads();
+		}
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/coveragedata/PackageDataTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/PackageDataTest.java
similarity index 63%
rename from test/net/sourceforge/cobertura/coveragedata/PackageDataTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/PackageDataTest.java
index d041fe6..f6702af 100644
--- a/test/net/sourceforge/cobertura/coveragedata/PackageDataTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/PackageDataTest.java
@@ -1,200 +1,195 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import junit.framework.TestCase;
-
-public class PackageDataTest extends TestCase
-{
-
-	private PackageData packageData;
-
-	public void setUp()
-	{
-		packageData = new PackageData("com.example");
-		assertEquals("com.example", packageData.getName());
-	}
-
-	public void testAddClass()
-	{
-		ClassData classData;
-
-		assertEquals(0, packageData.getNumberOfChildren());
-
-		classData = new ClassData("com.example.HelloWorld");
-		classData.setSourceFileName("com/example/HelloWorld.java");
-		for (int i = 0; i < 10; i++)
-			classData.addLine(i, "test", "(I)B");
-		packageData.addClassData(classData);
-		assertEquals(1, packageData.getNumberOfChildren());
-		assertTrue(packageData.contains(classData.getBaseName()));
-
-		classData = new ClassData("com.example.HelloWorldHelper");
-		classData.setSourceFileName("com/example/HelloWorldHelper.java");
-		for (int i = 0; i < 14; i++)
-			classData.addLine(i, "test", "(I)B");
-		packageData.addClassData(classData);
-		assertEquals(2, packageData.getNumberOfChildren());
-		assertTrue(packageData.contains(classData.getBaseName()));
-
-		// See what happens when we try to add the same class twice
-		classData = new ClassData("com.example.HelloWorld");
-		classData.setSourceFileName("com/example/HelloWorld.java");
-		for (int i = 0; i < 19; i++)
-			classData.addLine(i, "test", "(I)B");
-		try
-		{
-			packageData.addClassData(classData);
-			// removed by Jeremy Thomerson when changing PackageData
-			// fail("Expected an IllegalArgumentException but did not receive one!");
-		}
-		catch (IllegalArgumentException e)
-		{
-			// Good!
-		}
-
-		assertEquals(2, packageData.getNumberOfChildren());
-	}
-
-	public void testBranchCoverage()
-	{
-		assertEquals(0, packageData.getNumberOfCoveredBranches());
-		assertEquals(0, packageData.getNumberOfValidBranches());
-		assertEquals(1.00d, packageData.getBranchCoverageRate(), 0d);
-
-		ClassData classData = new ClassData("com.example.HelloWorld");
-		classData.setSourceFileName("com/example/HelloWorld.java");
-		for (int i = 0; i < 10; i++)
-			classData.addLine(i, "test", "(I)B");
-		packageData.addClassData(classData);
-
-		assertEquals(0, packageData.getNumberOfCoveredBranches());
-		assertEquals(0, packageData.getNumberOfValidBranches());
-		assertEquals(1.00d, packageData.getBranchCoverageRate(), 0d);
-
-		classData.addLineJump(1, 0);
-		classData.addLineSwitch(1, 1, new int[] {1,5});
-		classData.addLineJump(2, 0);
-		classData.addLineSwitch(3, 0, 1, 3);
-
-		assertEquals(0, packageData.getNumberOfCoveredBranches());
-		assertEquals(12, packageData.getNumberOfValidBranches());
-		assertEquals(0.00d, packageData.getBranchCoverageRate(), 0d);
-
-		classData.touch(1,1);
-		classData.touchJump(1, 0, true,1);
-		classData.touch(1,1);
-		classData.touchJump(1, 0, false,1);
-		classData.touchSwitch(1, 1, 0,1);
-		classData.touch(2,1);
-		classData.touchJump(2, 0, false,1);
-      
-		assertEquals(4, packageData.getNumberOfCoveredBranches());
-		assertEquals(12, packageData.getNumberOfValidBranches());
-		assertEquals(0.33d, packageData.getBranchCoverageRate(), 0.01d);
-	}
-
-	public void testConstructor()
-	{
-		try
-		{
-			new PackageData(null);
-			fail("Expected an IllegalArgumentException but did not receive one!");
-		}
-		catch (IllegalArgumentException e)
-		{
-			// Good!
-		}
-	}
-
-	public void testEquals()
-	{
-		PackageData a = new PackageData("com.example");
-		PackageData b = new PackageData("com.example");
-		PackageData c = new PackageData("com.example");
-		ClassData classData1 = new ClassData("com.example.HelloWorld1");
-		ClassData classData2 = new ClassData("com.example.HelloWorld2");
-		ClassData classData3 = new ClassData("com.example.HelloWorld3");
-		ClassData classData4 = new ClassData("com.example.HelloWorld4");
-
-		classData1.setSourceFileName("com/example/HelloWorld1.java");
-		classData2.setSourceFileName("com/example/HelloWorld2.java");
-		classData3.setSourceFileName("com/example/HelloWorld3.java");
-		classData4.setSourceFileName("com/example/HelloWorld4.java");
-
-		a.addClassData(classData1);
-		a.addClassData(classData2);
-		a.addClassData(classData3);
-		b.addClassData(classData1);
-		b.addClassData(classData2);
-		c.addClassData(classData1);
-		c.addClassData(classData2);
-		c.addClassData(classData4);
-
-		assertFalse(a.equals(null));
-		assertFalse(a.equals(classData1));
-
-		assertTrue(a.equals(a));
-		assertFalse(a.equals(b));
-		assertFalse(a.equals(c));
-		assertFalse(b.equals(a));
-		assertTrue(b.equals(b));
-		assertFalse(b.equals(c));
-		assertFalse(c.equals(a));
-		assertFalse(c.equals(b));
-		assertTrue(c.equals(c));
-
-		b.addClassData(classData3);
-		assertTrue(a.equals(b));
-		assertTrue(b.equals(a));
-
-		assertFalse(a.equals(c));
-		assertFalse(c.equals(a));
-	}
-
-	public void testHashCode()
-	{
-		PackageData a = new PackageData("com.example");
-		PackageData b = new PackageData("com.example");
-		ClassData classData1 = new ClassData("com.example.HelloWorld1");
-		ClassData classData2 = new ClassData("com.example.HelloWorld2");
-		ClassData classData3 = new ClassData("com.example.HelloWorld3");
-
-		classData1.setSourceFileName("com/example/HelloWorld1.java");
-		classData2.setSourceFileName("com/example/HelloWorld2.java");
-		classData3.setSourceFileName("com/example/HelloWorld3.java");
-
-		a.addClassData(classData1);
-		a.addClassData(classData2);
-		a.addClassData(classData3);
-		b.addClassData(classData1);
-		b.addClassData(classData2);
-
-		assertEquals(a.hashCode(), a.hashCode());
-		assertEquals(b.hashCode(), b.hashCode());
-
-		b.addClassData(classData3);
-		assertEquals(a.hashCode(), b.hashCode());
-		assertEquals(b.hashCode(), b.hashCode());
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class PackageDataTest {
+
+	private static final String COM_EXAMPLE = "com.example";
+	public static final String COM_EXAMPLE_HELLO_WORLD = "com.example.HelloWorld";
+	public static final String COM_EXAMPLE_HELLO_WORLD_JAVA = "com/example/HelloWorld.java";
+	public static final String COM_EXAMPLE_HELLO_WORLD_HELPER = "com.example.HelloWorldHelper";
+	public static final String COM_EXAMPLE_HELLO_WORLD_HELPER_JAVA = "com/example/HelloWorldHelper.java";
+	private PackageData packageData;
+
+	@Before
+	public void setUp() {
+		packageData = new PackageData(COM_EXAMPLE);
+		assertEquals(COM_EXAMPLE, packageData.getName());
+	}
+
+	@Test
+	public void testAddClass() {
+		ClassData classData;
+
+		assertEquals(0, packageData.getNumberOfChildren());
+
+		classData = new ClassData(COM_EXAMPLE_HELLO_WORLD);
+		classData.setSourceFileName(COM_EXAMPLE_HELLO_WORLD_JAVA);
+		for (int i = 0; i < 10; i++)
+			classData.addLine(i, "test", "(I)B");
+		packageData.addClassData(classData);
+		assertEquals(1, packageData.getNumberOfChildren());
+		assertTrue(packageData.contains(classData.getBaseName()));
+
+		classData = new ClassData(COM_EXAMPLE_HELLO_WORLD_HELPER);
+		classData.setSourceFileName(COM_EXAMPLE_HELLO_WORLD_HELPER_JAVA);
+		for (int i = 0; i < 14; i++)
+			classData.addLine(i, "test", "(I)B");
+		packageData.addClassData(classData);
+		assertEquals(2, packageData.getNumberOfChildren());
+		assertTrue(packageData.contains(classData.getBaseName()));
+
+		// See what happens when we try to add the same class twice
+		classData = new ClassData(COM_EXAMPLE_HELLO_WORLD);
+		classData.setSourceFileName(COM_EXAMPLE_HELLO_WORLD_JAVA);
+		for (int i = 0; i < 19; i++)
+			classData.addLine(i, "test", "(I)B");
+		try {
+			packageData.addClassData(classData);
+			// removed by Jeremy Thomerson when changing PackageData
+			// fail("Expected an IllegalArgumentException but did not receive one!");
+		} catch (IllegalArgumentException e) {
+			// Good!
+		}
+
+		assertEquals(2, packageData.getNumberOfChildren());
+	}
+
+	@Test
+	public void testBranchCoverage() {
+		assertEquals(0, packageData.getNumberOfCoveredBranches());
+		assertEquals(0, packageData.getNumberOfValidBranches());
+		assertEquals(1.00d, packageData.getBranchCoverageRate(), 0d);
+
+		ClassData classData = new ClassData(COM_EXAMPLE_HELLO_WORLD);
+		classData.setSourceFileName(COM_EXAMPLE_HELLO_WORLD_JAVA);
+		for (int i = 0; i < 10; i++)
+			classData.addLine(i, "test", "(I)B");
+		packageData.addClassData(classData);
+
+		assertEquals(0, packageData.getNumberOfCoveredBranches());
+		assertEquals(0, packageData.getNumberOfValidBranches());
+		assertEquals(1.00d, packageData.getBranchCoverageRate(), 0d);
+
+		classData.addLineJump(1, 0);
+		classData.addLineJump(2, 0);
+		classData.addLineSwitch(3, 0, 1, 3, 10);
+
+		assertEquals(0, packageData.getNumberOfCoveredBranches());
+		assertEquals(8, packageData.getNumberOfValidBranches());
+		assertEquals(0.00d, packageData.getBranchCoverageRate(), 0d);
+
+		classData.touch(1, 1);
+		classData.touchJump(1, 0, true, 1);
+		classData.touch(1, 1);
+		classData.touchJump(1, 0, false, 1);
+		classData.touchSwitch(1, 1, 0, 1);
+		classData.touch(2, 1);
+		classData.touchJump(2, 0, false, 1);
+
+		assertEquals(4, packageData.getNumberOfCoveredBranches());
+		assertEquals(11, packageData.getNumberOfValidBranches());
+		assertEquals(4.0d / 11.0d, packageData.getBranchCoverageRate(), 0.01d);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testConstructor() {
+		new PackageData(null);
+	}
+
+	@Test
+	public void testEquals() {
+		PackageData a = new PackageData(COM_EXAMPLE);
+		PackageData b = new PackageData(COM_EXAMPLE);
+		PackageData c = new PackageData(COM_EXAMPLE);
+		ClassData classData1 = new ClassData(COM_EXAMPLE_HELLO_WORLD + "1");
+		ClassData classData2 = new ClassData(COM_EXAMPLE_HELLO_WORLD + "2");
+		ClassData classData3 = new ClassData(COM_EXAMPLE_HELLO_WORLD + "3");
+		ClassData classData4 = new ClassData(COM_EXAMPLE_HELLO_WORLD + "4");
+
+		classData1.setSourceFileName("com/example/HelloWorld1.java");
+		classData2.setSourceFileName("com/example/HelloWorld2.java");
+		classData3.setSourceFileName("com/example/HelloWorld3.java");
+		classData4.setSourceFileName("com/example/HelloWorld4.java");
+
+		a.addClassData(classData1);
+		a.addClassData(classData2);
+		a.addClassData(classData3);
+		b.addClassData(classData1);
+		b.addClassData(classData2);
+		c.addClassData(classData1);
+		c.addClassData(classData2);
+		c.addClassData(classData4);
+
+		assertFalse(a.equals(null));
+		assertFalse(a.equals(classData1));
+
+		assertTrue(a.equals(a));
+		assertFalse(a.equals(b));
+		assertFalse(a.equals(c));
+		assertFalse(b.equals(a));
+		assertTrue(b.equals(b));
+		assertFalse(b.equals(c));
+		assertFalse(c.equals(a));
+		assertFalse(c.equals(b));
+		assertTrue(c.equals(c));
+
+		b.addClassData(classData3);
+		assertTrue(a.equals(b));
+		assertTrue(b.equals(a));
+
+		assertFalse(a.equals(c));
+		assertFalse(c.equals(a));
+	}
+
+	@Test
+	public void testHashCode() {
+		PackageData a = new PackageData(COM_EXAMPLE);
+		PackageData b = new PackageData(COM_EXAMPLE);
+		ClassData classData1 = new ClassData("com.example.HelloWorld1");
+		ClassData classData2 = new ClassData("com.example.HelloWorld2");
+		ClassData classData3 = new ClassData("com.example.HelloWorld3");
+
+		classData1.setSourceFileName("com/example/HelloWorld1.java");
+		classData2.setSourceFileName("com/example/HelloWorld2.java");
+		classData3.setSourceFileName("com/example/HelloWorld3.java");
+
+		a.addClassData(classData1);
+		a.addClassData(classData2);
+		a.addClassData(classData3);
+		b.addClassData(classData1);
+		b.addClassData(classData2);
+
+		assertEquals(a.hashCode(), a.hashCode());
+		assertEquals(b.hashCode(), b.hashCode());
+
+		b.addClassData(classData3);
+		assertEquals(a.hashCode(), b.hashCode());
+		assertEquals(b.hashCode(), b.hashCode());
+	}
+}
diff --git a/test/net/sourceforge/cobertura/coveragedata/ProjectDataTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/ProjectDataTest.java
similarity index 86%
rename from test/net/sourceforge/cobertura/coveragedata/ProjectDataTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/ProjectDataTest.java
index dfa25b2..ebf68b8 100644
--- a/test/net/sourceforge/cobertura/coveragedata/ProjectDataTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/ProjectDataTest.java
@@ -1,169 +1,173 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2010 Charlie Squires
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.Iterator;
-import java.util.SortedSet;
-
-import junit.framework.TestCase;
-
-public class ProjectDataTest extends TestCase
-{
-
-	private ProjectData coverageData;
-
-	public void setUp()
-	{
-		coverageData = new ProjectData();
-	}
-
-	public void testAddClass()
-	{
-		ClassData classData;
-
-		assertEquals(0, coverageData.getNumberOfChildren());
-		assertEquals(0, coverageData.getClasses().size());
-		assertEquals(null, coverageData.getClassData("gobbleDeeGoop"));
-
-		classData = new ClassData("com.example.HelloWorld");
-		classData.setSourceFileName("com/example/HelloWorld.java");
-		for (int i = 0; i < 10; i++)
-			classData.addLine(i, "test", "(I)B");
-		coverageData.addClassData(classData);
-		assertEquals(1, coverageData.getNumberOfChildren());
-		assertEquals(1, coverageData.getClasses().size());
-		assertEquals(classData, coverageData.getClassData(classData.getName()));
-
-		classData = new ClassData("com.example.HelloWorldHelper");
-		classData.setSourceFileName("com/example/HelloWorldHelper.java");
-		for (int i = 0; i < 14; i++)
-			classData.addLine(i, "test", "(I)B");
-		coverageData.addClassData(classData);
-		assertEquals(1, coverageData.getNumberOfChildren());
-		assertEquals(2, coverageData.getClasses().size());
-		assertEquals(classData, coverageData.getClassData(classData.getName()));
-
-		// See what happens when we try to add the same class twice
-		classData = new ClassData("com.example.HelloWorld");
-		classData.setSourceFileName("com/example/HelloWorld.java");
-		for (int i = 0; i < 19; i++)
-			classData.addLine(i, "test", "(I)B");
-		try
-		{
-			coverageData.addClassData(classData);
-			// removed by Jeremy Thomerson when changing PackageData
-			// fail("Expected an IllegalArgumentException but did not receive one!");
-		}
-		catch (IllegalArgumentException e)
-		{
-			// Good!
-		}
-		assertEquals(1, coverageData.getNumberOfChildren());
-		assertEquals(2, coverageData.getClasses().size());
-	}
-
-	public void testEquals()
-	{
-		ProjectData a = new ProjectData();
-		ProjectData b = new ProjectData();
-		ProjectData c = new ProjectData();
-		ClassData classData1 = new ClassData("com.example.HelloWorld1");
-		ClassData classData2 = new ClassData("com.example.HelloWorld2");
-		ClassData classData3 = new ClassData("com.example.HelloWorld3");
-		ClassData classData4 = new ClassData("com.example.HelloWorld4");
-
-		classData1.setSourceFileName("com/example/HelloWorld1.java");
-		classData2.setSourceFileName("com/example/HelloWorld2.java");
-		classData3.setSourceFileName("com/example/HelloWorld3.java");
-		classData4.setSourceFileName("com/example/HelloWorld4.java");
-
-		a.addClassData(classData1);
-		a.addClassData(classData2);
-		a.addClassData(classData3);
-		b.addClassData(classData1);
-		b.addClassData(classData2);
-		c.addClassData(classData1);
-		c.addClassData(classData2);
-		c.addClassData(classData4);
-
-		assertFalse(a.equals(null));
-		assertFalse(a.equals(classData1));
-
-		assertTrue(a.equals(a));
-		assertFalse(a.equals(b));
-		assertFalse(a.equals(c));
-		assertFalse(b.equals(a));
-		assertTrue(b.equals(b));
-		assertFalse(b.equals(c));
-		assertFalse(c.equals(a));
-		assertFalse(c.equals(b));
-		assertTrue(c.equals(c));
-
-		b.addClassData(classData3);
-		assertTrue(a.equals(b));
-		assertTrue(b.equals(a));
-
-		assertFalse(a.equals(c));
-		assertFalse(c.equals(a));
-	}
-	
-	public void testHashCode()
-	{
-		ProjectData a = new ProjectData();
-		ProjectData b = new ProjectData();
-		ClassData classData1 = new ClassData("com.example.HelloWorld1");
-		ClassData classData2 = new ClassData("com.example.HelloWorld2");
-		ClassData classData3 = new ClassData("com.example.HelloWorld3");
-
-		classData1.setSourceFileName("com/example/HelloWorld1.java");
-		classData2.setSourceFileName("com/example/HelloWorld2.java");
-		classData3.setSourceFileName("com/example/HelloWorld3.java");
-
-		a.addClassData(classData1);
-		a.addClassData(classData2);
-		a.addClassData(classData3);
-		b.addClassData(classData1);
-		b.addClassData(classData2);
-
-		assertEquals(a.hashCode(), a.hashCode());
-		assertEquals(b.hashCode(), b.hashCode());
-
-		b.addClassData(classData3);
-		assertEquals(a.hashCode(), b.hashCode());
-	}
-	
-	public void testGetSubPackages()
-	{
-		coverageData.addClassData(new ClassData("com.example.HelloWorld"));
-		coverageData.addClassData(new ClassData("com.example.test.HelloWorldTest"));
-		coverageData.addClassData(new ClassData("com.examplesomething.HelloWorld"));
-		
-		SortedSet subPackagesSet = coverageData.getSubPackages("com.example");
-		assertEquals(2, subPackagesSet.size());
-		
-		Iterator subPackages = subPackagesSet.iterator();
-		assertEquals("com.example", ((PackageData)subPackages.next()).getName());
-		assertEquals("com.example.test", ((PackageData)subPackages.next()).getName());
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2010 Charlie Squires
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Iterator;
+import java.util.SortedSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class ProjectDataTest {
+
+	private ProjectData coverageData;
+
+	@Before
+	public void setUp() {
+		coverageData = new ProjectData();
+	}
+
+	@Test
+	public void testAddClass() {
+		ClassData classData;
+
+		assertEquals(0, coverageData.getNumberOfChildren());
+		assertEquals(0, coverageData.getClasses().size());
+		assertEquals(null, coverageData.getClassData("gobbleDeeGoop"));
+
+		classData = new ClassData("com.example.HelloWorld");
+		classData.setSourceFileName("com/example/HelloWorld.java");
+		for (int i = 0; i < 10; i++)
+			classData.addLine(i, "test", "(I)B");
+		coverageData.addClassData(classData);
+		assertEquals(1, coverageData.getNumberOfChildren());
+		assertEquals(1, coverageData.getClasses().size());
+		assertEquals(classData, coverageData.getClassData(classData.getName()));
+
+		classData = new ClassData("com.example.HelloWorldHelper");
+		classData.setSourceFileName("com/example/HelloWorldHelper.java");
+		for (int i = 0; i < 14; i++)
+			classData.addLine(i, "test", "(I)B");
+		coverageData.addClassData(classData);
+		assertEquals(1, coverageData.getNumberOfChildren());
+		assertEquals(2, coverageData.getClasses().size());
+		assertEquals(classData, coverageData.getClassData(classData.getName()));
+
+		// See what happens when we try to add the same class twice
+		classData = new ClassData("com.example.HelloWorld");
+		classData.setSourceFileName("com/example/HelloWorld.java");
+		for (int i = 0; i < 19; i++)
+			classData.addLine(i, "test", "(I)B");
+		try {
+			coverageData.addClassData(classData);
+			// removed by Jeremy Thomerson when changing PackageData
+			// fail("Expected an IllegalArgumentException but did not receive one!");
+		} catch (IllegalArgumentException e) {
+			// Good!
+		}
+		assertEquals(1, coverageData.getNumberOfChildren());
+		assertEquals(2, coverageData.getClasses().size());
+	}
+
+	@Test
+	public void testEquals() {
+		ProjectData a = new ProjectData();
+		ProjectData b = new ProjectData();
+		ProjectData c = new ProjectData();
+		ClassData classData1 = new ClassData("com.example.HelloWorld1");
+		ClassData classData2 = new ClassData("com.example.HelloWorld2");
+		ClassData classData3 = new ClassData("com.example.HelloWorld3");
+		ClassData classData4 = new ClassData("com.example.HelloWorld4");
+
+		classData1.setSourceFileName("com/example/HelloWorld1.java");
+		classData2.setSourceFileName("com/example/HelloWorld2.java");
+		classData3.setSourceFileName("com/example/HelloWorld3.java");
+		classData4.setSourceFileName("com/example/HelloWorld4.java");
+
+		a.addClassData(classData1);
+		a.addClassData(classData2);
+		a.addClassData(classData3);
+		b.addClassData(classData1);
+		b.addClassData(classData2);
+		c.addClassData(classData1);
+		c.addClassData(classData2);
+		c.addClassData(classData4);
+
+		assertFalse(a.equals(null));
+		assertFalse(a.equals(classData1));
+
+		assertTrue(a.equals(a));
+		assertFalse(a.equals(b));
+		assertFalse(a.equals(c));
+		assertFalse(b.equals(a));
+		assertTrue(b.equals(b));
+		assertFalse(b.equals(c));
+		assertFalse(c.equals(a));
+		assertFalse(c.equals(b));
+		assertTrue(c.equals(c));
+
+		b.addClassData(classData3);
+		assertTrue(a.equals(b));
+		assertTrue(b.equals(a));
+
+		assertFalse(a.equals(c));
+		assertFalse(c.equals(a));
+	}
+
+	@Test
+	public void testHashCode() {
+		ProjectData a = new ProjectData();
+		ProjectData b = new ProjectData();
+		ClassData classData1 = new ClassData("com.example.HelloWorld1");
+		ClassData classData2 = new ClassData("com.example.HelloWorld2");
+		ClassData classData3 = new ClassData("com.example.HelloWorld3");
+
+		classData1.setSourceFileName("com/example/HelloWorld1.java");
+		classData2.setSourceFileName("com/example/HelloWorld2.java");
+		classData3.setSourceFileName("com/example/HelloWorld3.java");
+
+		a.addClassData(classData1);
+		a.addClassData(classData2);
+		a.addClassData(classData3);
+		b.addClassData(classData1);
+		b.addClassData(classData2);
+
+		assertEquals(a.hashCode(), a.hashCode());
+		assertEquals(b.hashCode(), b.hashCode());
+
+		b.addClassData(classData3);
+		assertEquals(a.hashCode(), b.hashCode());
+	}
+
+	@Test
+	public void testGetSubPackages() {
+		coverageData.addClassData(new ClassData("com.example.HelloWorld"));
+		coverageData.addClassData(new ClassData(
+				"com.example.test.HelloWorldTest"));
+		coverageData.addClassData(new ClassData(
+				"com.examplesomething.HelloWorld"));
+
+		SortedSet subPackagesSet = coverageData.getSubPackages("com.example");
+		assertEquals(2, subPackagesSet.size());
+
+		Iterator subPackages = subPackagesSet.iterator();
+		assertEquals("com.example", ((PackageData) subPackages.next())
+				.getName());
+		assertEquals("com.example.test", ((PackageData) subPackages.next())
+				.getName());
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/SwitchDataTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/SwitchDataTest.java
new file mode 100644
index 0000000..aa2d8b9
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/coveragedata/SwitchDataTest.java
@@ -0,0 +1,155 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.coveragedata;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class SwitchDataTest {
+
+	private final SwitchData a = new SwitchData(0, new int[]{0, 1, 2, 3},
+			Integer.MAX_VALUE);
+
+	private final SwitchData b = new SwitchData(1, 1, 9, Integer.MAX_VALUE);
+
+	@Test
+	public void testEquals() {
+		assertFalse(a.equals(null));
+		assertFalse(a.equals(Integer.valueOf(4)));
+
+		assertTrue(a.equals(a));
+		assertFalse(a.equals(b));
+
+		SwitchData aPrime = new SwitchData(0, new int[]{0, 1, 2, 3},
+				Integer.MAX_VALUE);
+		assertTrue(a.equals(aPrime));
+	}
+
+	@Test
+	public void testHashCode() {
+		assertEquals(a.hashCode(), a.hashCode());
+
+		SwitchData aPrime = new SwitchData(0, new int[]{0, 1, 2, 3},
+				Integer.MAX_VALUE);
+		assertEquals(a.hashCode(), aPrime.hashCode());
+	}
+
+	@Test
+	public void testGetSwitchNumber() {
+		assertEquals(0, a.getSwitchNumber());
+		assertEquals(1, b.getSwitchNumber());
+	}
+
+	@Test
+	public void testGetNumbers() {
+		assertEquals(0, a.getBranchCoverageRate(), 0);
+		assertEquals(5, a.getNumberOfValidBranches(), 0);
+		assertEquals(0, a.getNumberOfCoveredBranches(), 0);
+
+		for (int i = 0; i < 5; i++) {
+			a.touchBranch(1, 1);
+			assertEquals(0.2, a.getBranchCoverageRate(), 0);
+			assertEquals(5, a.getNumberOfValidBranches(), 0);
+			assertEquals(1, a.getNumberOfCoveredBranches(), 0);
+		}
+
+		a.touchBranch(-1, 1);
+		assertEquals(0.4, a.getBranchCoverageRate(), 0);
+		assertEquals(5, a.getNumberOfValidBranches(), 0);
+		assertEquals(2, a.getNumberOfCoveredBranches(), 0);
+
+		a.touchBranch(0, 1);
+		assertEquals(0.6, a.getBranchCoverageRate(), 0);
+		assertEquals(5, a.getNumberOfValidBranches(), 0);
+		assertEquals(3, a.getNumberOfCoveredBranches(), 0);
+
+		a.touchBranch(2, 1);
+		assertEquals(0.8, a.getBranchCoverageRate(), 0);
+		assertEquals(5, a.getNumberOfValidBranches(), 0);
+		assertEquals(4, a.getNumberOfCoveredBranches(), 0);
+
+		a.touchBranch(3, 1);
+		assertEquals(1, a.getBranchCoverageRate(), 0);
+		assertEquals(5, a.getNumberOfValidBranches(), 0);
+		assertEquals(5, a.getNumberOfCoveredBranches(), 0);
+	}
+
+	@Test
+	public void testTouch() {
+		assertEquals(0, a.getHits(0));
+		for (int i = 0; i < 400; i++)
+			a.touchBranch(0, 1);
+		assertEquals(400, a.getHits(0));
+
+		assertEquals(0, a.getHits(1));
+		for (int i = 0; i < 4500; i++)
+			a.touchBranch(1, 1);
+		assertEquals(4500, a.getHits(1));
+
+		assertEquals(0, a.getHits(2));
+		for (int i = 0; i < 300; i++)
+			a.touchBranch(2, 1);
+		assertEquals(300, a.getHits(2));
+
+		assertEquals(0, a.getHits(3));
+		for (int i = 0; i < 800; i++)
+			a.touchBranch(3, 1);
+		assertEquals(800, a.getHits(3));
+
+		assertEquals(0, a.getDefaultHits());
+		for (int i = 0; i < 200; i++)
+			a.touchBranch(-1, 1);
+		assertEquals(200, a.getDefaultHits());
+	}
+
+	@Test
+	public void testMerge() {
+		a.touchBranch(0, 1);
+		a.touchBranch(0, 1);
+		a.touchBranch(2, 1);
+		a.touchBranch(-1, 1);
+		SwitchData x = new SwitchData(0, Integer.MAX_VALUE);
+		x.touchBranch(3, 1);
+		x.touchBranch(3, 1);
+		a.merge(x);
+		assertEquals(2, a.getHits(0));
+		assertEquals(0, a.getHits(1));
+		assertEquals(1, a.getHits(2));
+		assertEquals(2, a.getHits(3));
+		assertEquals(1, a.getDefaultHits());
+
+		x = new SwitchData(0, Integer.MAX_VALUE);
+		x.touchBranch(5, 1);
+		x.touchBranch(-1, 1);
+		a.merge(x);
+		assertEquals(2, a.getHits(0));
+		assertEquals(0, a.getHits(1));
+		assertEquals(1, a.getHits(2));
+		assertEquals(2, a.getHits(3));
+		assertEquals(0, a.getHits(4));
+		assertEquals(1, a.getHits(5));
+		assertEquals(2, a.getDefaultHits());
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/dsl/ArgumentsBuilderTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/dsl/ArgumentsBuilderTest.java
new file mode 100644
index 0000000..ad1a0ab
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/dsl/ArgumentsBuilderTest.java
@@ -0,0 +1,352 @@
+package net.sourceforge.cobertura.dsl;
+
+import net.sourceforge.cobertura.check.CoverageThreshold;
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.instrument.CoberturaFile;
+import org.junit.Test;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.util.Iterator;
+
+import static org.junit.Assert.*;
+
+public class ArgumentsBuilderTest {
+
+	public static final double SAMPLE_VALID_THRESHOLD = 0.7;
+	public static final double DELTA = 0.001;
+	public static final double HIGHER_THAN_VALID_THRESHOLD = 1.2;
+	public static final int LOWER_THAN_VALID_THRESHOLD = -1;
+
+	@Test
+	public void testSetBaseDirectory() throws Exception {
+		String baseDir = "somedir";
+		assertEquals(baseDir, new ArgumentsBuilder().setBaseDirectory(baseDir)
+				.build().getBaseDirectory());
+	}
+
+	@Test
+	public void testSetDataFile() throws Exception {
+		String dataFile = "somedir";
+		assertEquals(dataFile, new ArgumentsBuilder().setDataFile(dataFile)
+				.build().getDataFile().getPath());
+	}
+
+	@Test
+	public void testSetDestinationFile() throws Exception {
+		String destinationDir = "somedir";
+		assertEquals(destinationDir, new ArgumentsBuilder()
+				.setDestinationDirectory(destinationDir).build()
+				.getDestinationDirectory().getPath());
+
+	}
+
+	@Test
+	public void testSetCommandsFile() throws Exception {
+		String commandsFile = "somedir";
+		assertEquals(commandsFile, new ArgumentsBuilder().setCommandsFile(
+				commandsFile).build().getCommandsFile().getPath());
+	}
+
+	@Test
+	public void testAddIgnoreRegex() throws Exception {
+		String someRegex = "someRegex";
+		assertEquals(
+				someRegex,
+				((org.apache.oro.text.regex.Perl5Pattern) new ArgumentsBuilder()
+						.addIgnoreRegex(someRegex).build().getIgnoreRegexes()
+						.iterator().next()).getPattern());
+	}
+
+	@Test
+	public void testAddIgnoreBranchRegex() throws Exception {
+		String someRegex = "someRegex";
+		assertEquals(someRegex, new ArgumentsBuilder().addIgnoreBranchRegex(
+				someRegex).build().getIgnoreBranchesRegexes().iterator().next()
+				.getPattern());
+	}
+
+	@Test
+	public void testAddIgnoreMethodAnnotation() throws Exception {
+		String someValue = "someValue";
+		assertEquals(someValue, new ArgumentsBuilder()
+				.addIgnoreMethodAnnotation(someValue).build()
+				.getIgnoreMethodAnnotations().iterator().next());
+	}
+
+	@Test
+	public void testAddIgnoreClassAnnotation() throws Exception {
+		String someValue = "someValue";
+		assertEquals(someValue, new ArgumentsBuilder()
+				.addIgnoreClassAnnotation(someValue).build()
+				.getIgnoreClassAnnotations().iterator().next());
+	}
+
+	@Test
+	public void testAddExcludeClassesRegex() throws Exception {
+		String someRegex = "someRegex";
+		assertEquals(someRegex, new ArgumentsBuilder().addExcludeClassesRegex(
+				someRegex).build().getClassPatternExcludeClassesRegexes()
+				.iterator().next().getPattern());
+	}
+
+	@Test
+	public void testAddIncludeClassesRegex() throws Exception {
+		String someRegex = "someRegex";
+		assertEquals(someRegex, new ArgumentsBuilder().addIncludeClassesRegex(
+				someRegex).build().getClassPatternIncludeClassesRegexes()
+				.iterator().next().getPattern());
+	}
+
+	@Test
+	public void testFailOnError() throws Exception {
+		boolean failOnError = true;
+		assertEquals(failOnError, new ArgumentsBuilder().failOnError(
+				failOnError).build().isFailOnError());
+	}
+
+	@Test
+	public void testIgnoreTrivial() throws Exception {
+		boolean ignoreTrivial = true;
+		assertEquals(ignoreTrivial, new ArgumentsBuilder().ignoreTrivial(
+				ignoreTrivial).build().isIgnoreTrivial());
+	}
+
+	@Test
+	public void testThreadsafeRigorous() throws Exception {
+		boolean threadSafeRigorous = true;
+		assertEquals(threadSafeRigorous, new ArgumentsBuilder()
+				.threadsafeRigorous(threadSafeRigorous).build()
+				.isThreadsafeRigorous());
+	}
+
+	@Test
+	public void testSetFormat() throws Exception {
+		boolean failOnError = true;
+		assertEquals(failOnError, new ArgumentsBuilder().failOnError(
+				failOnError).build().isFailOnError());
+	}
+
+	@Test
+	public void testSetEncoding() throws Exception {
+		String encoding = "US-ASCII";
+		assertEquals(encoding, new ArgumentsBuilder().setEncoding(encoding)
+				.build().getEncoding());
+	}
+
+	@Test
+	public void testAddMinimumCoverageRates() throws Exception {
+		String regex = "regex";
+		double lineCoverage = .5;
+		double branchCoverage = .55;
+		CoverageThreshold threshold = new ArgumentsBuilder()
+				.addMinimumCoverageRates(regex, branchCoverage, lineCoverage)
+				.build().getMinimumCoverageThresholds().iterator().next();
+		assertEquals(regex, threshold.getRegex());
+		assertEquals(lineCoverage, threshold.getMinLinePercentage(), DELTA);
+		assertEquals(branchCoverage, threshold.getMinBranchPercentage(), DELTA);
+	}
+
+	@Test
+	public void testSetClassBranchCoverageThreshold() throws Exception {
+		assertEquals(SAMPLE_VALID_THRESHOLD, new ArgumentsBuilder()
+				.setClassBranchCoverageThreshold(SAMPLE_VALID_THRESHOLD)
+				.build().getClassBranchThreshold(), DELTA);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetNegativeClassBranchCoverageThreshold() throws Exception {
+		new ArgumentsBuilder()
+				.setClassBranchCoverageThreshold(LOWER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetGreaterThanValidClassBranchCoverageThreshold()
+			throws Exception {
+		new ArgumentsBuilder()
+				.setClassBranchCoverageThreshold(HIGHER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test
+	public void testSetClassLineCoverageThreshold() throws Exception {
+		assertEquals(SAMPLE_VALID_THRESHOLD, new ArgumentsBuilder()
+				.setClassLineCoverageThreshold(SAMPLE_VALID_THRESHOLD).build()
+				.getClassLineThreshold(), DELTA);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetNegativeClassLineCoverageThreshold() throws Exception {
+		new ArgumentsBuilder()
+				.setClassLineCoverageThreshold(LOWER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetGreaterThanValidClassLineCoverageThreshold()
+			throws Exception {
+		new ArgumentsBuilder()
+				.setClassLineCoverageThreshold(HIGHER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test
+	public void testSetPackageBranchCoverageThreshold() throws Exception {
+		assertEquals(SAMPLE_VALID_THRESHOLD, new ArgumentsBuilder()
+				.setPackageBranchCoverageThreshold(SAMPLE_VALID_THRESHOLD)
+				.build().getPackageBranchThreshold(), DELTA);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetNegativePackageBranchCoverageThreshold()
+			throws Exception {
+		new ArgumentsBuilder()
+				.setPackageBranchCoverageThreshold(LOWER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetGreaterThanValidPackageBranchCoverageThreshold()
+			throws Exception {
+		new ArgumentsBuilder()
+				.setPackageBranchCoverageThreshold(HIGHER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test
+	public void testSetPackageLineCoverageThreshold() throws Exception {
+		assertEquals(SAMPLE_VALID_THRESHOLD, new ArgumentsBuilder()
+				.setPackageLineCoverageThreshold(SAMPLE_VALID_THRESHOLD)
+				.build().getPackageLineThreshold(), DELTA);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetNegativePackageLineCoverageThreshold() throws Exception {
+		new ArgumentsBuilder()
+				.setPackageLineCoverageThreshold(LOWER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetGreaterThanValidPackageLineCoverageThreshold()
+			throws Exception {
+		new ArgumentsBuilder()
+				.setPackageLineCoverageThreshold(HIGHER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test
+	public void testSetTotalBranchCoverageThreshold() throws Exception {
+		assertEquals(SAMPLE_VALID_THRESHOLD, new ArgumentsBuilder()
+				.setTotalBranchCoverageThreshold(SAMPLE_VALID_THRESHOLD)
+				.build().getTotalBranchThreshold(), DELTA);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetNegativeTotalBranchCoverageThreshold() throws Exception {
+		new ArgumentsBuilder()
+				.setTotalBranchCoverageThreshold(LOWER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetGreaterThanValidTotalBranchCoverageThreshold()
+			throws Exception {
+		new ArgumentsBuilder()
+				.setTotalBranchCoverageThreshold(HIGHER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test
+	public void testSetTotalLineCoverageThreshold() throws Exception {
+		assertEquals(SAMPLE_VALID_THRESHOLD, new ArgumentsBuilder()
+				.setTotalLineCoverageThreshold(SAMPLE_VALID_THRESHOLD).build()
+				.getTotalLineThreshold(), DELTA);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetNegativeTotalLineCoverageThreshold() throws Exception {
+		new ArgumentsBuilder()
+				.setTotalLineCoverageThreshold(LOWER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSetGreaterThanValidTotalLineCoverageThreshold()
+			throws Exception {
+		new ArgumentsBuilder()
+				.setTotalLineCoverageThreshold(HIGHER_THAN_VALID_THRESHOLD);
+	}
+
+	@Test
+	public void testAddFileToInstrument() throws Exception {
+		String fileToInstrument = "fileToInstrument";
+		CoberturaFile file = new ArgumentsBuilder().addFileToInstrument(
+				fileToInstrument).build().getFilesToInstrument().iterator()
+				.next();
+		assertEquals(new File((String)null, fileToInstrument).getPath(), file.getPath());
+	}
+
+	@Test
+	public void testListOfFilesToInstrument() throws Exception {
+		File listOfFilesFile = File.createTempFile("list2instrument", ".txt");
+		BufferedWriter outList = new BufferedWriter(new FileWriter(listOfFilesFile));
+		outList.write("foo\nbar\nbaz\n");
+		outList.close();
+		String tempFilename = listOfFilesFile.getAbsolutePath();
+		String tempDirname = listOfFilesFile.getParent();
+		String tempBasename = listOfFilesFile.getName();
+		Iterator<CoberturaFile> fileIter = new ArgumentsBuilder()
+				.setBaseDirectory(tempDirname).listOfFilesToInstrument(tempFilename)
+				.build().getFilesToInstrument().iterator();
+		assertEquals(new File(tempDirname, "foo").getPath(), fileIter.next().getPath());
+		assertEquals(new File(tempDirname, "bar").getPath(), fileIter.next().getPath());
+		assertEquals(new File(tempDirname, "baz").getPath(), fileIter.next().getPath());
+		assertFalse(fileIter.hasNext());
+	}
+
+	@Test
+	public void testAddFileToMerge() throws Exception {
+		String fileToMerge = "fileToMerge";
+		File file = new ArgumentsBuilder().addFileToMerge(fileToMerge).build()
+				.getFilesToMerge().iterator().next();
+		assertEquals(fileToMerge, file.getPath());
+	}
+
+	@Test
+	public void testDefaultValues() throws Exception {
+		Arguments defaultArgs = new ArgumentsBuilder().build();
+		assertNull(defaultArgs.getBaseDirectory());
+		assertEquals(CoverageDataFileHandler.getDefaultDataFile().getPath(),
+				defaultArgs.getDataFile().getPath());
+
+		assertNotNull(defaultArgs.getIgnoreBranchesRegexes());
+		assertTrue(defaultArgs.getIgnoreBranchesRegexes().isEmpty());
+		assertNotNull(defaultArgs.getIgnoreMethodAnnotations());
+		assertTrue(defaultArgs.getIgnoreMethodAnnotations().isEmpty());
+		assertNotNull(defaultArgs.getIgnoreClassAnnotations());
+		assertTrue(defaultArgs.getIgnoreClassAnnotations().isEmpty());
+		assertNotNull(defaultArgs.getClassPatternExcludeClassesRegexes());
+		assertTrue(defaultArgs.getClassPatternExcludeClassesRegexes().isEmpty());
+		assertNotNull(defaultArgs.getClassPatternIncludeClassesRegexes());
+		assertTrue(defaultArgs.getClassPatternIncludeClassesRegexes().isEmpty());
+		assertNotNull(defaultArgs.getFilesToInstrument());
+		assertTrue(defaultArgs.getFilesToInstrument().isEmpty());
+		assertNotNull(defaultArgs.getFilesToMerge());
+		assertTrue(defaultArgs.getFilesToMerge().isEmpty());
+		assertNotNull(defaultArgs.getMinimumCoverageThresholds());
+		assertTrue(defaultArgs.getMinimumCoverageThresholds().isEmpty());
+
+		assertEquals(ArgumentsBuilder.DEFAULT_THRESHOLD, defaultArgs
+				.getClassBranchThreshold(), DELTA);
+		assertEquals(ArgumentsBuilder.DEFAULT_THRESHOLD, defaultArgs
+				.getClassLineThreshold(), DELTA);
+		assertEquals(ArgumentsBuilder.DEFAULT_THRESHOLD, defaultArgs
+				.getPackageBranchThreshold(), DELTA);
+		assertEquals(ArgumentsBuilder.DEFAULT_THRESHOLD, defaultArgs
+				.getPackageLineThreshold(), DELTA);
+		assertEquals(ArgumentsBuilder.DEFAULT_THRESHOLD, defaultArgs
+				.getTotalBranchThreshold(), DELTA);
+		assertEquals(ArgumentsBuilder.DEFAULT_THRESHOLD, defaultArgs
+				.getTotalLineThreshold(), DELTA);
+		assertEquals(ArgumentsBuilder.DEFAULT_FAIL_ON_ERROR, defaultArgs
+				.isFailOnError());
+		assertEquals(ArgumentsBuilder.DEFAULT_IGNORE_TRIVIAL, defaultArgs
+				.isIgnoreTrivial());
+		assertEquals(ArgumentsBuilder.DEFAULT_THREADSAFE_RIGOROUS, defaultArgs
+				.isThreadsafeRigorous());
+		assertEquals(ArgumentsBuilder.DEFAULT_ENCODING, defaultArgs
+				.getEncoding());
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/dsl/ArgumentsTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/dsl/ArgumentsTest.java
new file mode 100644
index 0000000..bdc99fa
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/dsl/ArgumentsTest.java
@@ -0,0 +1,234 @@
+package net.sourceforge.cobertura.dsl;
+
+import net.sourceforge.cobertura.check.CoverageThreshold;
+import net.sourceforge.cobertura.instrument.CoberturaFile;
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.util.RegexUtil;
+import org.apache.oro.text.regex.Pattern;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ArgumentsTest {
+	private static final double CLASS_LINE_THRESHOLD = 0.5;
+	private static final double CLASS_BRANCH_THRESHOLD = 0.6;
+	private static final double PACKAGE_LINE_THRESHOLD = 0.7;
+	private static final double PACKAGE_BRANCH_THRESHOLD = 0.8;
+	private static final double TOTAL_LINE_THRESHOLD = 0.9;
+	private static final double TOTAL_BRANCH_THRESHOLD = 0.95;
+	private static final String BASEDIR = "basedir";
+	private static final File DATA_FILE = new File("dataFile");
+	private static final File DESTINATION_DIRECTORY = new File(
+			"destinationDirectory");
+	private static final File COMMANDS_FILE = new File("commandsFile");
+	private static final boolean CALCULATE_METHOD_COMPLEXITY = false;
+	private static final boolean FAIL_ON_ERROR = false;
+	private static final boolean IGNORE_TRIVIAL = true;
+	private static final boolean THREADSAFE_RIGOROUS = true;
+	private static final String ENCODING = "UTF-8";
+	private static final String IGNORE_REGEX_PATTERN = "ignoreRegexPattern";
+	private static final String IGNORE_BRANCHES_REGEXES = "ignoreBranchesRegexes";
+	private static final String CLASS_PATTERN_INCLUDE_CLASSES_REGEXES = "classPatternIncludeClassesRegexes";
+	private static final String CLASS_PATTERN_EXCLUDE_CLASSES_REGEXES = "classPatternExcludeClassesRegexes";
+	private static final String COVERAGE_THRESHOLD_REGEX = "coverageThresholdRegex";
+	private static final double MIN_BRANCH_PERCENTAGE = .5;
+	private static final double MIN_LINE_PERCENTAGE = .5;
+	private static final CoberturaFile FILE_TO_INSTRUMENT = new CoberturaFile(
+			".", "fileToInstrument");
+	private static final File FILE_TO_MERGE = new File("fileToMerge");
+	private static final String IGNORE_METHOD_ANNOTATIONS = "ignoreMethodAnnotations";
+	private static final String IGNORE_CLASS_ANNOTATIONS = "ignoreClassAnnotations";
+	private static final FileFinder SOURCES = new FileFinder();
+	private static final double DELTA = 0.001;
+	private Arguments arguments;
+
+	private Collection ignoreRegexes = new ArrayList();
+	private Collection<Pattern> ignoreBranchesRegexes = new ArrayList<Pattern>();
+	private Collection<Pattern> classPatternIncludeClassesRegexes = new ArrayList<Pattern>();
+	private Collection<Pattern> classPatternExcludeClassesRegexes = new ArrayList<Pattern>();
+	private Set<CoverageThreshold> minimumCoverageThresholds = new HashSet<CoverageThreshold>();
+	private Set<CoberturaFile> filesToInstrument = new HashSet<CoberturaFile>();
+	private Set<File> filesToMerge = new HashSet<File>();
+	private Set<String> ignoreMethodAnnotations = new HashSet<String>();
+	private Set<String> ignoreClassAnnotations = new HashSet<String>();
+
+	@Before
+	public void setUp() throws Exception {
+		ignoreRegexes.add(IGNORE_REGEX_PATTERN);
+		RegexUtil.addRegex(ignoreBranchesRegexes, IGNORE_BRANCHES_REGEXES);
+		RegexUtil.addRegex(classPatternIncludeClassesRegexes,
+				CLASS_PATTERN_INCLUDE_CLASSES_REGEXES);
+		RegexUtil.addRegex(classPatternExcludeClassesRegexes,
+				CLASS_PATTERN_EXCLUDE_CLASSES_REGEXES);
+		minimumCoverageThresholds.add(new CoverageThreshold(
+				COVERAGE_THRESHOLD_REGEX, MIN_BRANCH_PERCENTAGE,
+				MIN_LINE_PERCENTAGE));
+		filesToInstrument.add(FILE_TO_INSTRUMENT);
+		filesToMerge.add(FILE_TO_MERGE);
+		ignoreMethodAnnotations.add(IGNORE_METHOD_ANNOTATIONS);
+		ignoreClassAnnotations.add(IGNORE_CLASS_ANNOTATIONS);
+
+		this.arguments = new Arguments(BASEDIR, DATA_FILE,
+				DESTINATION_DIRECTORY, COMMANDS_FILE, ignoreRegexes,
+				ignoreBranchesRegexes, classPatternIncludeClassesRegexes,
+				classPatternExcludeClassesRegexes,
+				CALCULATE_METHOD_COMPLEXITY, FAIL_ON_ERROR,
+				IGNORE_TRIVIAL, THREADSAFE_RIGOROUS, ENCODING,
+				minimumCoverageThresholds, CLASS_LINE_THRESHOLD,
+				CLASS_BRANCH_THRESHOLD, PACKAGE_LINE_THRESHOLD,
+				PACKAGE_BRANCH_THRESHOLD, TOTAL_LINE_THRESHOLD,
+				TOTAL_BRANCH_THRESHOLD, filesToInstrument, filesToMerge,
+				ignoreMethodAnnotations, ignoreClassAnnotations, SOURCES);
+	}
+
+	@Test
+	public void testGetBaseDirectory() throws Exception {
+		assertEquals(BASEDIR, arguments.getBaseDirectory());
+	}
+
+	@Test
+	public void testGetDataFile() throws Exception {
+		assertEquals(DATA_FILE, arguments.getDataFile());
+	}
+
+	@Test
+	public void testGetDestinationDirectory() throws Exception {
+		assertEquals(DESTINATION_DIRECTORY, arguments.getDestinationDirectory());
+	}
+
+	@Test
+	public void testGetCommandsFile() throws Exception {
+		assertEquals(COMMANDS_FILE, arguments.getCommandsFile());
+	}
+
+	@Test
+	public void testGetIgnoreRegexes() throws Exception {
+		assertTrue(arguments.getIgnoreRegexes().contains(IGNORE_REGEX_PATTERN));
+	}
+
+	@Test(expected = UnsupportedOperationException.class)
+	public void testGetIgnoreBranchesRegexes() throws Exception {
+		assertTrue(arguments.getIgnoreBranchesRegexes().iterator().next()
+				.getPattern().equals(IGNORE_BRANCHES_REGEXES));
+		RegexUtil.addRegex(arguments.getIgnoreBranchesRegexes(), "someElement");
+	}
+
+	@Test(expected = UnsupportedOperationException.class)
+	public void testGetClassPatternIncludeClassesRegexes() throws Exception {
+		assertTrue(arguments.getClassPatternIncludeClassesRegexes().iterator()
+				.next().getPattern().equals(
+						CLASS_PATTERN_INCLUDE_CLASSES_REGEXES));
+		RegexUtil.addRegex(arguments.getClassPatternIncludeClassesRegexes(),
+				"someElement");
+	}
+
+	@Test(expected = UnsupportedOperationException.class)
+	public void testGetClassPatternExcludeClassesRegexes() throws Exception {
+		assertTrue(arguments.getClassPatternExcludeClassesRegexes().iterator()
+				.next().getPattern().equals(
+						CLASS_PATTERN_EXCLUDE_CLASSES_REGEXES));
+		RegexUtil.addRegex(arguments.getClassPatternExcludeClassesRegexes(),
+				"someElement");
+	}
+
+	@Test
+	public void testIsFailOnError() throws Exception {
+		assertEquals(FAIL_ON_ERROR, arguments.isFailOnError());
+	}
+
+	@Test
+	public void testIsIgnoreTrivial() throws Exception {
+		assertEquals(IGNORE_TRIVIAL, arguments.isIgnoreTrivial());
+	}
+
+	@Test
+	public void testIsThreadsafeRigorous() throws Exception {
+		assertEquals(THREADSAFE_RIGOROUS, arguments.isThreadsafeRigorous());
+	}
+
+	@Test
+	public void testGetEncoding() throws Exception {
+		assertEquals(ENCODING, arguments.getEncoding());
+	}
+
+	@Test
+	public void testGetMinimumCoverageThresholds() throws Exception {
+		CoverageThreshold threshold = arguments.getMinimumCoverageThresholds()
+				.iterator().next();
+		assertEquals(MIN_LINE_PERCENTAGE, threshold.getMinLinePercentage(), DELTA);
+		assertEquals(MIN_BRANCH_PERCENTAGE, threshold.getMinBranchPercentage(), DELTA);
+		assertEquals(COVERAGE_THRESHOLD_REGEX, threshold.getRegex());
+	}
+
+	@Test
+	public void testGetClassLineThreshold() throws Exception {
+		assertEquals(CLASS_LINE_THRESHOLD, arguments.getClassLineThreshold(),
+				DELTA);
+	}
+
+	@Test
+	public void testGetClassBranchThreshold() throws Exception {
+		assertEquals(CLASS_BRANCH_THRESHOLD, arguments
+				.getClassBranchThreshold(), DELTA);
+	}
+
+	@Test
+	public void testGetPackageLineThreshold() throws Exception {
+		assertEquals(PACKAGE_LINE_THRESHOLD, arguments
+				.getPackageLineThreshold(), DELTA);
+	}
+
+	@Test
+	public void testGetPackageBranchThreshold() throws Exception {
+		assertEquals(PACKAGE_BRANCH_THRESHOLD, arguments
+				.getPackageBranchThreshold(), DELTA);
+	}
+
+	@Test
+	public void testGetTotalLineThreshold() throws Exception {
+		assertEquals(TOTAL_LINE_THRESHOLD, arguments.getTotalLineThreshold(),
+				DELTA);
+	}
+
+	@Test
+	public void testGetTotalBranchThreshold() throws Exception {
+		assertEquals(TOTAL_BRANCH_THRESHOLD, arguments
+				.getTotalBranchThreshold(), DELTA);
+	}
+
+	@Test
+	public void testGetFilesToInstrument() throws Exception {
+		assertTrue(arguments.getFilesToInstrument()
+				.contains(FILE_TO_INSTRUMENT));
+	}
+
+	@Test
+	public void testGetFilesToMerge() throws Exception {
+		assertTrue(arguments.getFilesToMerge().contains(FILE_TO_MERGE));
+	}
+
+	@Test
+	public void testGetIgnoreMethodAnnotations() throws Exception {
+		assertTrue(arguments.getIgnoreMethodAnnotations().contains(
+				IGNORE_METHOD_ANNOTATIONS));
+	}
+
+	@Test
+	public void testGetIgnoreClassAnnotations() throws Exception {
+		assertTrue(arguments.getIgnoreClassAnnotations().contains(
+				IGNORE_CLASS_ANNOTATIONS));
+	}
+
+	@Test
+	public void testGetSources() throws Exception {
+		assertEquals(SOURCES, arguments.getSources());
+	}
+}
diff --git a/examples/functionaltest1/src/test/first/B.java b/cobertura/src/test/java/net/sourceforge/cobertura/instrument/CoberturaInstrumenterTest.java
similarity index 63%
copy from examples/functionaltest1/src/test/first/B.java
copy to cobertura/src/test/java/net/sourceforge/cobertura/instrument/CoberturaInstrumenterTest.java
index 807890f..40853f0 100644
--- a/examples/functionaltest1/src/test/first/B.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/instrument/CoberturaInstrumenterTest.java
@@ -1,46 +1,42 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.first;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-public class B
-{
-
-	public void call()
-	{
-		A.someMethod();
-	}
-
-	public void dontCall()
-	{
-		A.someMethod();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2011 Piotr Tabor
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.instrument;
+
+import org.junit.Test;
+
+import java.io.File;
+
+public class CoberturaInstrumenterTest {
+	private final CoberturaInstrumenter coberturaInstrumenter = new CoberturaInstrumenter();
+
+	@Test
+	public void instrumentNotExisting() {
+		coberturaInstrumenter.setDestinationDirectory(new File(System
+				.getProperty("java.io.tmpdir")));
+		coberturaInstrumenter.addInstrumentationToSingleClass(new File(
+				"test/net/sourceforge/cobertura/instrument/notExisting.class"));
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/jdk/JDK7Test.java b/cobertura/src/test/java/net/sourceforge/cobertura/jdk/JDK7Test.java
new file mode 100644
index 0000000..84b8f45
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/jdk/JDK7Test.java
@@ -0,0 +1,211 @@
+package net.sourceforge.cobertura.jdk;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class JDK7Test {
+	static AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+	static Node dom;
+
+	@BeforeClass
+	public static void setUpBeforeClass() throws IOException,
+			ParserConfigurationException, SAXException {
+		FileUtils.deleteDirectory(TestUtils.getTempDir());
+
+		/*
+		 * First create the junit test structure.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Java7TestCase.java");
+
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		FileUtils.write(mainSourceFile, java7TestFile);
+
+		/*
+		 * Next let's compile the test code we just made.
+		 */
+		TestUtils.compileSource(ant, srcDir);
+
+		/*
+		 * Let's now instrument all the classes. In this case we instrument with default items.
+		 */
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Java7TestCase");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(TestUtils.getCoberturaDefaultClasspath());
+		java.execute();
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		/*
+		 * 
+		 */
+		System.out.println(srcDir.getAbsolutePath());
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+	}
+
+	/**
+	 *    public void try_with_resource() throws Exception {
+	 *      try (FileOutputStream fos = new FileOutputStream(\"test.txt\");
+	 *           FileOutputStream fos2 = new FileOutputStream(\"meow.txt\")) {
+	 *        ....
+	 *      }
+	 *    }
+	 */
+	@Test
+	public void testTryWithResource() {
+		int hitCount = TestUtils.getTotalHitCount(dom,
+				"mypackage.Java7TestCase", "try_with_resource");
+		assertEquals(5, hitCount);
+	}
+
+	/**
+	 *    public void diamond_operator() {
+	 *      Map<String, List<String>> stringMaps = new TreeMap <> ();
+	 *    }
+	 */
+	@Test
+	public void testDiamondOperator() {
+		int hitCount = TestUtils.getTotalHitCount(dom,
+				"mypackage.Java7TestCase", "diamond_operator");
+		assertEquals(2, hitCount);
+	}
+
+	/**
+	 * public void string_in_switch() {
+	 *   String x = "asdfg";
+	 *   switch(x) {
+	 *     case "asdf":
+	 *       break;
+	 *     default:
+	 *       break;
+	 *   }
+	 * }
+	 */
+	@Test
+	public void testStringInSwitch() {
+		int hitCount = TestUtils.getTotalHitCount(dom,
+				"mypackage.Java7TestCase", "string_in_switch");
+		assertEquals(3, hitCount);
+	}
+
+	/**
+	 *   public void numerical_literals_underscores() {
+	 *     int thousand = 1_000;
+	 *     int million  = 1_000_000;
+	 *   }
+	 */
+	@Test
+	public void testNumericalLteralsUnderscores() {
+		int hitCount = TestUtils.getTotalHitCount(dom,
+				"mypackage.Java7TestCase", "numerical_literals_underscores");
+		assertEquals(3, hitCount);
+	}
+
+	/**
+	 *   public void multi_catch() {
+	 *     try {
+	 *       FileOutputStream fos = new FileOutputStream(\"test.txt\");
+	 *       int a = 5/0;
+	 *       } catch (IOException | ArithmeticException e){
+	 *     }
+	 *   }
+	 */
+	@Test
+	public void testMultiCatch() {
+		int hitCount = TestUtils.getTotalHitCount(dom,
+				"mypackage.Java7TestCase", "multi_catch");
+		assertEquals(4, hitCount);
+	}
+
+	@Test
+	public void testMain() throws Exception {
+		int hitCount = TestUtils.getTotalHitCount(dom,
+				"mypackage.Java7TestCase", "main");
+		assertEquals(7, hitCount);
+	}
+
+	static final String java7TestFile = "\n package mypackage;"
+			+ "\n "
+			+ "\n import java.util.*;"
+			+ "\n import java.io.*;"
+			+ "\n "
+			+ "\n public class Java7TestCase {"
+			+ "\n "
+			+ "\n   public static void main (String[] args) throws Exception {"
+			+ "\n     Java7TestCase t = new Java7TestCase();"
+			+ "\n     t.try_with_resource();"
+			+ "\n     t.diamond_operator();"
+			+ "\n     t.string_in_switch();"
+			+ "\n     t.numerical_literals_underscores();"
+			+ "\n     t.multi_catch();"
+			+ "\n   }"
+			+ "\n   "
+			+ "\n   public void try_with_resource() throws Exception {"
+			+ "\n     try (FileOutputStream fos = new FileOutputStream(\"test.txt\");"
+			+ "\n          FileOutputStream fos2 = new FileOutputStream(\"meow.txt\")) {"
+			+ "\n     }"
+			+ "\n   }"
+			+ "\n "
+			+ "\n   public void diamond_operator() {"
+			+ "\n     Map<String, List<String>> stringMaps = new TreeMap <> ();"
+			+ "\n   }"
+			+ "\n "
+			+ "\n   public void string_in_switch() {"
+			+ "\n     String x = \"asdfg\";"
+			+ "\n     switch(x) {"
+			+ "\n       case \"asdf\":"
+			+ "\n         break;"
+			+ "\n       default:"
+			+ "\n         break;"
+			+ "\n     }"
+			+ "\n   }"
+			+ "\n "
+			+ "\n   public void numerical_literals_underscores() {"
+			+ "\n     int thousand = 1_000;"
+			+ "\n     int million  = 1_000_000;"
+			+ "\n   }"
+			+ "\n   "
+			+ "\n   public void multi_catch() {"
+			+ "\n     try {"
+			+ "\n       FileOutputStream fos = new FileOutputStream(\"test.txt\");"
+			+ "\n       int a = 5/0;"
+			+ "\n     } catch (IOException | ArithmeticException e){"
+			+ "\n     }" + "\n   }" + "\n }";
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/jdk/JDKTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/jdk/JDKTest.java
new file mode 100644
index 0000000..6032eb0
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/jdk/JDKTest.java
@@ -0,0 +1,128 @@
+package net.sourceforge.cobertura.jdk;
+
+import static org.junit.Assert.*;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+
+import java.io.File;
+
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * This test is in here because there are a lot of issues with backward compatibility.
+ * We compile with each jdk version to verify that the simplest test will at least produce
+ * code coverage.
+ * 
+ * @author schristou88
+ *
+ */
+public class JDKTest {
+	static final AntBuilder ant = TestUtils.antBuilder;
+	static Node dom;
+
+	public static void setupAndExecuteTest(String jdkVersion) throws Exception {
+		FileUtils.deleteDirectory(TestUtils.getTempDir());
+
+		/*
+		 * First create the junit test structure.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+		instrumentDir.mkdirs();
+		File mainSourceFile = new File(srcDir, "mypackage/JDKTEST.java");
+
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		FileUtils.write(mainSourceFile, JDKTEST);
+
+		/*
+		 * Next let's compile the test code we just made.
+		 */
+		TestUtils.compileSource(ant, srcDir, jdkVersion);
+
+		/*
+		 * Let's now instrument all the classes. In this case we instrument with default items.
+		 */
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.JDKTEST");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(TestUtils.getCoberturaDefaultClasspath());
+		java.setJVMVersion(jdkVersion);
+		java.execute();
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		/*
+		 * 
+		 */
+		System.out.println(srcDir.getAbsolutePath());
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+	}
+
+	// Note: Tests for Java 1.1 and 1.2 has been removed, because using those
+	// values for the javac option -source is not supported in Java 1.5 or newer
+
+	@Test
+	public void testJDK3() throws Exception {
+		setupAndExecuteTest("1.3");
+		int hitCount = TestUtils.getTotalHitCount(dom, "mypackage.JDKTEST",
+				"main");
+		assertEquals(2, hitCount);
+	}
+
+	@Test
+	public void testJDK4() throws Exception {
+		setupAndExecuteTest("1.4");
+		int hitCount = TestUtils.getTotalHitCount(dom, "mypackage.JDKTEST",
+				"main");
+		assertEquals(2, hitCount);
+	}
+
+	@Test
+	public void testJDK5() throws Exception {
+		setupAndExecuteTest("1.5");
+		int hitCount = TestUtils.getTotalHitCount(dom, "mypackage.JDKTEST",
+				"main");
+		assertEquals(2, hitCount);
+	}
+
+	@Test
+	public void testJDK6() throws Exception {
+		setupAndExecuteTest("1.6");
+		int hitCount = TestUtils.getTotalHitCount(dom, "mypackage.JDKTEST",
+				"main");
+		assertEquals(2, hitCount);
+	}
+
+	static final String JDKTEST = "\n package mypackage;" + "\n "
+			+ "\n public class JDKTEST {"
+			+ "\n   public static void main(String[] args) {"
+			+ "\n     System.out.println(\"Hello world.\");" + "\n   }"
+			+ "\n }";
+}
diff --git a/test/net/sourceforge/cobertura/merge/MergeMainTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/merge/MergeMainTest.java
similarity index 57%
rename from test/net/sourceforge/cobertura/merge/MergeMainTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/merge/MergeMainTest.java
index f42055c..8504eb1 100644
--- a/test/net/sourceforge/cobertura/merge/MergeMainTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/merge/MergeMainTest.java
@@ -1,155 +1,160 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.merge;
-
-import java.util.List;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-
-import junit.framework.TestCase;
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-
-/**
- * Tests merging feature by launching Main class.
- */
-public class MergeMainTest extends TestCase {
-	private ClassData firstClass = new ClassData("test.First");
-	private ClassData secondClass = new ClassData("test.Second");
-	private ClassData seventhClass = new ClassData("Seventh");
-
-	private ProjectData greenProject = new ProjectData();
-	private ProjectData redProject = new ProjectData();
-	private ProjectData blueProject = new ProjectData();
-	
-	private List filesToRemove = new ArrayList();
-	
-	private File createTempSerFile() throws IOException {
-		File result = File.createTempFile( "cobertura", ".ser");
-		result.delete();
-		filesToRemove.add(result);
-		return result;
-	}
-	
-	protected void tearDown() throws Exception {
-		for( int i=0; i<filesToRemove.size(); i++) {
-			((File)filesToRemove.get(i)).delete();
-		}
-	}
-	
-	public void testNewDestinationFile() throws IOException {
-		// Create some coverage data
-		greenProject.addClassData( firstClass);
-		redProject.addClassData( secondClass);
-		redProject.addClassData( seventhClass);
-
-		// Generate filenames for serialized data 
-		File greenFile = createTempSerFile();
-		File redFile = createTempSerFile();
-		File dataFile = createTempSerFile();
-		
-		// Save coverage data for created data
-		CoverageDataFileHandler.saveCoverageData( greenProject, greenFile);
-		CoverageDataFileHandler.saveCoverageData( redProject, redFile);
-		
-		// Run merge task
-		String[] args = {"--datafile", dataFile.getAbsolutePath(), 
-				greenFile.getAbsolutePath(), redFile.getAbsolutePath()};
-		
-		Main.main( args);
-		
-		// Read merged data
-		ProjectData merged = CoverageDataFileHandler.loadCoverageData( dataFile);
-		
-		// Check if everything is ok
-		assertEquals( 3, merged.getNumberOfClasses());
-		assertNotNull( merged.getClassData("test.First"));
-		assertNotNull( merged.getClassData("test.Second"));
-		assertNotNull( merged.getClassData("Seventh"));
-		assertNull( merged.getClassData("test.Third"));
-	}
-
-	public void testExistingDestinationFile() throws IOException {
-		// Create some coverage data
-		greenProject.addClassData( firstClass);
-		redProject.addClassData( secondClass);
-
-		// Generate filenames for serialized data 
-		File greenFile = createTempSerFile();
-		File dataFile = createTempSerFile();
-		
-		// Save coverage data for created data
-		CoverageDataFileHandler.saveCoverageData( greenProject, greenFile);
-		CoverageDataFileHandler.saveCoverageData( redProject, dataFile);
-		
-		// Run merge task
-		String[] args = {"--datafile", dataFile.getAbsolutePath(), 
-				greenFile.getAbsolutePath()};
-		
-		Main.main( args);
-		
-		// Read merged data
-		ProjectData merged = CoverageDataFileHandler.loadCoverageData( dataFile);
-		
-		// Check if  everything is ok
-		assertEquals( 2, merged.getNumberOfClasses());
-		assertNotNull( merged.getClassData("test.First"));
-		assertNotNull( merged.getClassData("test.Second"));
-	}
-
-	public void testBaseDir() throws IOException {
-		// Create some coverage data
-		greenProject.addClassData( firstClass);
-		redProject.addClassData( seventhClass);
-		blueProject.addClassData( secondClass);
-
-		// Generate filenames for serialized data 
-		File greenFile = createTempSerFile();
-		File redFile = createTempSerFile();
-		File blueFile = createTempSerFile();
-		File dataFile = createTempSerFile();
-		
-		dataFile.delete();
-		
-		// Save coverage data for created data
-		CoverageDataFileHandler.saveCoverageData( greenProject, greenFile);
-		CoverageDataFileHandler.saveCoverageData( redProject, redFile);
-		CoverageDataFileHandler.saveCoverageData( blueProject, blueFile);
-		
-		// Run merge task
-		String[] args = {"--datafile", dataFile.getAbsolutePath(), 
-				greenFile.getAbsolutePath(), 
-				"--basedir", redFile.getParent(), redFile.getName(), blueFile.getName()};
-		
-		Main.main( args);
-		
-		// Read merged data
-		ProjectData merged = CoverageDataFileHandler.loadCoverageData( dataFile);
-		
-		// Check if everything is ok
-		assertEquals( 3, merged.getNumberOfClasses());
-		assertNotNull( merged.getClassData("test.First"));
-		assertNotNull( merged.getClassData("test.Second"));
-		assertNotNull( merged.getClassData("Seventh"));
-	}
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.merge;
+
+import junit.framework.TestCase;
+import net.sourceforge.cobertura.coveragedata.ClassData;
+import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests merging feature by launching Main class.
+ */
+public class MergeMainTest extends TestCase {
+	private ClassData firstClass = new ClassData("test.First");
+	private ClassData secondClass = new ClassData("test.Second");
+	private ClassData seventhClass = new ClassData("Seventh");
+
+	private ProjectData greenProject = new ProjectData();
+	private ProjectData redProject = new ProjectData();
+	private ProjectData blueProject = new ProjectData();
+
+	private List filesToRemove = new ArrayList();
+
+	private File createTempSerFile() throws IOException {
+		File result = File.createTempFile("cobertura", ".ser");
+		result.delete();
+		filesToRemove.add(result);
+		return result;
+	}
+
+	protected void tearDown() throws Exception {
+		for (int i = 0; i < filesToRemove.size(); i++) {
+			((File) filesToRemove.get(i)).delete();
+		}
+	}
+
+	public void testNewDestinationFile() throws IOException {
+		// Create some coverage data
+		greenProject.addClassData(firstClass);
+		redProject.addClassData(secondClass);
+		redProject.addClassData(seventhClass);
+
+		// Generate filenames for serialized data
+		File greenFile = createTempSerFile();
+		File redFile = createTempSerFile();
+		File dataFile = createTempSerFile();
+
+		// Save coverage data for created data
+		CoverageDataFileHandler.saveCoverageData(greenProject, greenFile);
+		CoverageDataFileHandler.saveCoverageData(redProject, redFile);
+
+		// Run merge task
+		String[] args = {"--datafile", dataFile.getAbsolutePath(),
+				greenFile.getAbsolutePath(), redFile.getAbsolutePath()};
+
+		System.out.println(String.format(
+				"### Will merge dataFiles: %s, %s, %s", dataFile
+						.getAbsolutePath(), greenFile.getAbsolutePath(),
+				redFile.getAbsolutePath()));
+
+		MergeMain.main(args);
+
+		// Read merged data
+		ProjectData merged = CoverageDataFileHandler.loadCoverageData(dataFile);
+
+		// Check if everything is ok
+		assertEquals(3, merged.getNumberOfClasses());
+		assertNotNull(merged.getClassData("test.First"));
+		assertNotNull(merged.getClassData("test.Second"));
+		assertNotNull(merged.getClassData("Seventh"));
+		assertNull(merged.getClassData("test.Third"));
+	}
+
+	public void testExistingDestinationFile() throws IOException {
+		// Create some coverage data
+		greenProject.addClassData(firstClass);
+		redProject.addClassData(secondClass);
+
+		// Generate filenames for serialized data
+		File greenFile = createTempSerFile();
+		File dataFile = createTempSerFile();
+
+		// Save coverage data for created data
+		CoverageDataFileHandler.saveCoverageData(greenProject, greenFile);
+		CoverageDataFileHandler.saveCoverageData(redProject, dataFile);
+
+		// Run merge task
+		String[] args = {"--datafile", dataFile.getAbsolutePath(),
+				greenFile.getAbsolutePath()};
+
+		MergeMain.main(args);
+
+		// Read merged data
+		ProjectData merged = CoverageDataFileHandler.loadCoverageData(dataFile);
+
+		// Check if  everything is ok
+		assertEquals(2, merged.getNumberOfClasses());
+		assertNotNull(merged.getClassData("test.First"));
+		assertNotNull(merged.getClassData("test.Second"));
+	}
+
+	public void testBaseDir() throws IOException {
+		// Create some coverage data
+		greenProject.addClassData(firstClass);
+		redProject.addClassData(seventhClass);
+		blueProject.addClassData(secondClass);
+
+		// Generate filenames for serialized data
+		File greenFile = createTempSerFile();
+		File redFile = createTempSerFile();
+		File blueFile = createTempSerFile();
+		File dataFile = createTempSerFile();
+
+		dataFile.delete();
+
+		// Save coverage data for created data
+		CoverageDataFileHandler.saveCoverageData(greenProject, greenFile);
+		CoverageDataFileHandler.saveCoverageData(redProject, redFile);
+		CoverageDataFileHandler.saveCoverageData(blueProject, blueFile);
+
+		// Run merge task
+		String[] args = {"--datafile", dataFile.getAbsolutePath(),
+				greenFile.getAbsolutePath(), "--basedir", redFile.getParent(),
+				redFile.getName(), blueFile.getName()};
+
+		MergeMain.main(args);
+
+		// Read merged data
+		ProjectData merged = CoverageDataFileHandler.loadCoverageData(dataFile);
+
+		// Check if everything is ok
+		assertEquals(3, merged.getNumberOfClasses());
+		assertNotNull(merged.getClassData("test.First"));
+		assertNotNull(merged.getClassData("test.Second"));
+		assertNotNull(merged.getClassData("Seventh"));
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/merge/MergeTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/merge/MergeTest.java
new file mode 100644
index 0000000..378f1db
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/merge/MergeTest.java
@@ -0,0 +1,287 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2006 Jiri Mares
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.merge;
+
+import junit.framework.TestCase;
+import net.sourceforge.cobertura.coveragedata.*;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * Tests merge feature by calling directly ProjectData.merge method.
+ */
+public class MergeTest extends TestCase {
+	private ClassData firstClass = new ClassData("test.First");
+	private ClassData secondClass = new ClassData("test.Second");
+	private ClassData thirdClass = new ClassData("test.Third");
+	private ClassData firstClassB = new ClassData("test.First");
+	private ClassData fourthClass = new ClassData("test.me.Fourth");
+	private ClassData fifthClass = new ClassData("beautiful.Fourth");
+	private ClassData sixthClass = new ClassData("Fourth");
+	private ClassData seventhClass = new ClassData("Seventh");
+
+	private ProjectData greenProject = new ProjectData();
+	private ProjectData redProject = new ProjectData();
+
+	public void testMergePackages() {
+		greenProject.addClassData(firstClass);
+		greenProject.addClassData(fourthClass);
+		redProject.addClassData(fifthClass);
+		redProject.addClassData(sixthClass);
+		redProject.addClassData(seventhClass);
+
+		//merge with null - should not change the greenProject
+		greenProject.merge(null);
+
+		greenProject.merge(redProject);
+
+		Iterator subpackages = greenProject.getSubPackages("").iterator();
+		assertEquals("", ((PackageData) subpackages.next()).getName());
+		assertEquals("beautiful", ((PackageData) subpackages.next()).getName());
+		assertEquals("test", ((PackageData) subpackages.next()).getName());
+		assertEquals("test.me", ((PackageData) subpackages.next()).getName());
+		assertFalse(subpackages.hasNext());
+
+		assertEquals(5, greenProject.getClasses().size());
+		assertEquals(3, redProject.getClasses().size());
+
+		assertNotNull(greenProject.getClassData("test.First"));
+		assertNotNull(greenProject.getClassData("test.me.Fourth"));
+		assertNotNull(greenProject.getClassData("beautiful.Fourth"));
+		assertNotNull(greenProject.getClassData("Fourth"));
+		assertNotNull(greenProject.getClassData("Seventh"));
+		assertNull(redProject.getClassData("test.First"));
+
+		Iterator packages = greenProject.getPackages().iterator();
+
+		PackageData first = (PackageData) packages.next();
+		assertEquals("", first.getName());
+		assertEquals(2, first.getNumberOfChildren());
+		assertNotNull(first.getChild("Fourth"));
+		assertNotNull(first.getChild("Seventh"));
+
+		PackageData beautiful = (PackageData) packages.next();
+		assertEquals("beautiful", beautiful.getName());
+		assertEquals(1, beautiful.getNumberOfChildren());
+		assertNotNull(beautiful.getChild("Fourth"));
+
+		PackageData test = (PackageData) packages.next();
+		assertEquals("test", test.getName());
+		assertEquals(1, test.getNumberOfChildren());
+		assertNotNull(test.getChild("First"));
+		assertNull(test.getChild("test/me/First.java"));
+		assertNull(test.getChild("Fourth.java"));
+
+		PackageData testMe = (PackageData) packages.next();
+		assertEquals("test.me", testMe.getName());
+		assertEquals(1, testMe.getNumberOfChildren());
+		assertNull(testMe.getChild("test/First.java"));
+		assertNotNull(testMe.getChild("Fourth"));
+		assertNull(testMe.getChild("Fourth.java"));
+
+		assertFalse(packages.hasNext());
+	}
+
+	public void testMergeDifferentClassData() {
+		greenProject.addClassData(firstClass);
+
+		redProject.addClassData(secondClass);
+		redProject.addClassData(thirdClass);
+
+		greenProject.merge(redProject);
+
+		assertEquals(1, greenProject.getNumberOfChildren());
+		assertEquals(3, greenProject.getClasses().size());
+
+		assertNotNull(greenProject.getClassData("test.First"));
+		assertNotNull(greenProject.getClassData("test.Second"));
+		assertNotNull(greenProject.getClassData("test.Third"));
+
+		assertNull(redProject.getClassData("test.First"));
+		assertNotNull(redProject.getClassData("test.Second"));
+		assertNotNull(redProject.getClassData("test.Third"));
+	}
+
+	public void testMergeSimillarClassData() {
+		greenProject.addClassData(secondClass);
+		greenProject.addClassData(thirdClass);
+
+		redProject.addClassData(firstClass);
+		redProject.addClassData(thirdClass);
+
+		greenProject.merge(redProject);
+
+		assertEquals(1, greenProject.getNumberOfChildren());
+		assertEquals(3, greenProject.getClasses().size());
+
+		assertNotNull(greenProject.getClassData("test.First"));
+		assertNotNull(greenProject.getClassData("test.Second"));
+		assertNotNull(greenProject.getClassData("test.Third"));
+
+		assertNotNull(redProject.getClassData("test.First"));
+		assertNull(redProject.getClassData("test.Second"));
+		assertNotNull(redProject.getClassData("test.Third"));
+	}
+
+	public void testMergeDifferentLineNumbers() {
+		firstClass.addLine(2, "helloWorld", "()V");
+		firstClass.addLine(3, "helloWorld", "()V");
+		greenProject.addClassData(firstClass);
+
+		firstClassB.addLine(1, "helloWorld", "()V");
+		firstClassB.addLine(5, "helloWorld", "()V");
+		redProject.addClassData(firstClassB);
+
+		greenProject.merge(redProject);
+
+		ClassData cd = greenProject.getClassData("test.First");
+		assertNotNull(cd);
+		assertEquals(4, cd.getNumberOfValidLines());
+		assertEquals(2, redProject.getClassData("test.First")
+				.getNumberOfValidLines());
+
+		Iterator lines = cd.getLines().iterator();
+		LineData line1 = (LineData) lines.next();
+		assertEquals(1, line1.getLineNumber());
+		LineData line2 = (LineData) lines.next();
+		assertEquals(2, line2.getLineNumber());
+		LineData line3 = (LineData) lines.next();
+		assertEquals(3, line3.getLineNumber());
+		LineData line5 = (LineData) lines.next();
+		assertEquals(5, line5.getLineNumber());
+		assertFalse(lines.hasNext());
+	}
+
+	public void testMergeSimillarLineNumbers() {
+		firstClass.addLine(2, "helloWorld", "()V");
+		firstClass.touch(2, 1);
+		firstClass.touch(2, 1);
+		firstClass.addLine(3, "helloWorld", "()V");
+		greenProject.addClassData(firstClass);
+
+		firstClassB.addLine(2, "helloWorld", "()V");
+		firstClassB.touch(2, 1);
+		firstClassB.touch(2, 1);
+		firstClassB.touch(2, 1);
+		firstClassB.addLine(3, "helloWorld", "()V");
+		firstClassB.touch(3, 1);
+		firstClassB.addLine(7, "helloWorld", "()V");
+		redProject.addClassData(firstClassB);
+
+		greenProject.merge(redProject);
+
+		ClassData cd = greenProject.getClassData("test.First");
+		assertNotNull(cd);
+		assertEquals(3, cd.getNumberOfValidLines());
+		assertEquals(3, redProject.getClassData("test.First")
+				.getNumberOfValidLines());
+
+		Iterator lines = cd.getLines().iterator();
+		LineData line2 = (LineData) lines.next();
+		assertEquals(2, line2.getLineNumber());
+		assertEquals(5, line2.getHits());
+		LineData line3 = (LineData) lines.next();
+		assertEquals(3, line3.getLineNumber());
+		assertEquals(1, line3.getHits());
+		LineData line7 = (LineData) lines.next();
+		assertEquals(7, line7.getLineNumber());
+		assertEquals(0, line7.getHits());
+		assertFalse(lines.hasNext());
+	}
+
+	public void testMergeBranches() {
+		firstClass.addLine(1, "helloWorld", "()V");
+		firstClass.addLineJump(1, 0);
+		firstClass.addLine(2, "helloWorld", "()V");
+		firstClass.addLineJump(2, 0);
+		firstClass.addLineJump(2, 1);
+		firstClass.addLine(3, "helloWorld", "()V");
+		firstClass.addLine(4, "helloWorld", "()V");
+		firstClass.addLineSwitch(4, 0, 0, 2, Integer.MAX_VALUE);
+		firstClass.addLine(5, "helloWorld", "()V");
+		firstClass.addLine(8, "helloWorld", "()V");
+		greenProject.addClassData(firstClass);
+
+		firstClassB.addLine(1, "helloWorld", "()V");
+		firstClassB.addLineJump(1, 0);
+		firstClassB.addLine(2, "helloWorld", "()V");
+		firstClassB.addLine(3, "helloWorld", "()V");
+		firstClassB.addLineSwitch(3, 0, 2, 4, Integer.MAX_VALUE);
+		firstClassB.addLine(6, "helloWorld", "()V");
+		firstClassB.addLineJump(6, 0);
+		firstClassB.addLine(7, "helloWorld", "()V");
+		firstClassB.addLine(8, "helloWorld", "()V");
+		redProject.addClassData(firstClassB);
+
+		greenProject.merge(redProject);
+
+		ClassData cd = greenProject.getClassData("test.First");
+
+		Iterator lines = cd.getLines().iterator();
+
+		LineData line1 = (LineData) lines.next();
+		assertTrue(line1.hasBranch());
+		LineData line2 = (LineData) lines.next();
+		assertTrue(line2.hasBranch());
+		LineData line3 = (LineData) lines.next();
+		assertTrue(line3.hasBranch());
+		LineData line4 = (LineData) lines.next();
+		assertTrue(line4.hasBranch());
+		LineData line5 = (LineData) lines.next();
+		assertFalse(line5.hasBranch());
+		LineData line6 = (LineData) lines.next();
+		assertTrue(line6.hasBranch());
+		LineData line7 = (LineData) lines.next();
+		assertFalse(line7.hasBranch());
+		LineData line8 = (LineData) lines.next();
+		assertFalse(line8.hasBranch());
+		assertFalse(lines.hasNext());
+	}
+
+	public void testMergeSourceFiles() {
+		greenProject.addClassData(secondClass);
+		greenProject.addClassData(fourthClass);
+
+		redProject.addClassData(firstClass);
+		redProject.addClassData(fifthClass);
+		redProject.addClassData(seventhClass);
+
+		greenProject.merge(redProject);
+
+		Collection sources = greenProject.getSourceFiles();
+		assertEquals(5, sources.size());
+
+		Set sourceNames = new HashSet();
+		Iterator it = sources.iterator();
+		while (it.hasNext())
+			sourceNames.add(((SourceFileData) it.next()).getName());
+
+		assertTrue(sourceNames.contains("test/First.java"));
+		assertTrue(sourceNames.contains("test/Second.java"));
+		assertTrue(sourceNames.contains("test/me/Fourth.java"));
+		assertTrue(sourceNames.contains("beautiful/Fourth.java"));
+		assertTrue(sourceNames.contains("Seventh.java"));
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculator2Test.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculator2Test.java
new file mode 100644
index 0000000..77baeee
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculator2Test.java
@@ -0,0 +1,155 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2008 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package net.sourceforge.cobertura.reporting;
+
+import junit.framework.TestCase;
+import net.sourceforge.cobertura.coveragedata.SourceFileData;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import net.sourceforge.cobertura.util.FileFinder;
+import org.apache.commons.io.FileUtils;
+import org.junit.Test;
+
+import java.io.File;
+
+public class ComplexityCalculator2Test extends TestCase {
+	@Test
+	public void testSearchJarsForSourceInJar() throws Exception {
+		File tempDir = TestUtils.getTempDir();
+		File zipFile = TestUtils.createSourceArchive(tempDir);
+
+		//create a ComplexityCalculator that will use the archive
+		FileFinder fileFinder = new FileFinder();
+		fileFinder
+				.addSourceDirectory(zipFile.getParentFile().getAbsolutePath());
+		ComplexityCalculator complexity = new ComplexityCalculator(fileFinder);
+
+		double ccn1 = complexity.getCCNForSourceFile(new SourceFileData(
+				TestUtils.SIMPLE_SOURCE_PATHNAME));
+		assertTrue(ccn1 == 1.0);
+	}
+
+	public void testAnnotatedSource() throws Exception {
+		/*
+		 * Test for bug #2818738.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		String filename = "TBSException.java";
+		File sourceFile = new File(tempDir, filename);
+		FileUtils
+				.write(
+						sourceFile,
+						"\n public class TBSException extends Exception {"
+								+ "\n public TBSException (ErrorHandler handler, Exception wrap) {"
+								+ "\n super(wrap);"
+								+ "\n @SuppressWarnings(\"unchecked\")"
+								+ "\n final Iterator<Exception> iter = handler.getExceptions().iterator();  // LINE 27"
+								+ "\n for (; iter.hasNext();) " + "\n {"
+								+ "\n Exception exception = iter.next();"
+								+ "\n this.errors.add(exception.getMessage());"
+								+ "\n }" + "\n 	}" + "\n }");
+
+		//create a ComplexityCalculator that will use the archive
+		FileFinder fileFinder = new FileFinder();
+		fileFinder.addSourceDirectory(tempDir.getAbsolutePath());
+		ComplexityCalculator complexity = new ComplexityCalculator(fileFinder);
+
+		double ccn1 = complexity.getCCNForSourceFile(new SourceFileData(
+				filename));
+		assertNotNull(ccn1);
+		assertEquals(2.0, ccn1, 0.01);
+	}
+
+	/**
+	 * This test highlights an issue with Javancss.
+	 * 
+	 * http://jira.codehaus.org/browse/JAVANCSS-37
+	 * @throws Exception 
+	 * 
+	 */
+	public void testGenericsProblem() throws Exception {
+		File tempDir = TestUtils.getTempDir();
+		String filename = "UserAudit.java";
+		File sourceFile = new File(tempDir, filename);
+		FileUtils
+				.write(
+						sourceFile,
+						"\n import java.util.ArrayList;"
+								+ "\n import java.util.List;"
+								+ "\n "
+								+ "\n "
+								+ "\n public class UserAudit extends UserAuditParent {"
+								+ "\n void postCopyOnDestination(String str) throws InstantiationException, IllegalAccessException {"
+								+ "\n List<AllowedMMProduct> listToReset = new ArrayList<AllowedMMProduct>();"
+								+ "\n"
+								+ "\n List<AllowedMMProductAudit> auditProducts;"
+								+ "\n auditProducts = this.<AllowedMMProduct,AllowedMMProductAudit>copyListFromParent(AllowedMMProductAudit.class, getMmAuthorisedProducts_());"
+								+ "\n }"
+								+ "\n"
+								+ "\n List<AllowedMMProduct> getMmAuthorisedProducts_() {"
+								+ "\n return null;" + "\n 	}" + "\n }");
+
+		//create a ComplexityCalculator that will use the archive
+		FileFinder fileFinder = new FileFinder();
+		fileFinder.addSourceDirectory(tempDir.getAbsolutePath());
+		ComplexityCalculator complexity = new ComplexityCalculator(fileFinder);
+
+		double ccn1 = complexity.getCCNForSourceFile(new SourceFileData(
+				filename));
+		assertNotNull(ccn1);
+		assertEquals(
+				"Javancss issue has been fixed: http://jira.codehaus.org/browse/JAVANCSS-37.   Now fix this test.",
+				0.0/*should be 2.0?*/, ccn1, 0.01);
+	}
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculatorGetCcnForMethodUnitTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculatorGetCcnForMethodUnitTest.java
new file mode 100644
index 0000000..f4fc08b
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculatorGetCcnForMethodUnitTest.java
@@ -0,0 +1,310 @@
+/**
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2014 Kunal Shah
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.reporting;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.regex.Pattern;
+
+import net.sourceforge.cobertura.coveragedata.ClassData;
+import net.sourceforge.cobertura.javancss.FunctionMetric;
+import net.sourceforge.cobertura.javancss.Javancss;
+import net.sourceforge.cobertura.javancss.JavancssFactory;
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.util.Source;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link ComplexityCalculator}.
+ *
+ * @author Kunal Shah
+ */
+public class ComplexityCalculatorGetCcnForMethodUnitTest {
+	private static final String METHOD_TEMPLATE = "%s(%s)";
+	private static final ClassData CLASS_DATA = new ClassData(Klass.class.getName());
+	private static final ClassData INNER_CLASS_DATA = new ClassData(Klass.InnerKlass.class.getName());
+	private static final ClassData GENERIC_CLASS_DATA = new ClassData(KlassToTestGenericType.class.getName());
+	private static final String CLASS_CONSTRUCTOR_NAME_FQ = CLASS_DATA.getName() + "." + CLASS_DATA.getBaseName();
+	private static final String INNER_CLASS_CONSTRUCTOR_NAME_FQ = (INNER_CLASS_DATA.getName() + "." + INNER_CLASS_DATA.getBaseName()).replaceAll(Pattern.quote("$"), ".");
+	private static final String METHOD_1_NAME = "method1";
+	private static final String METHOD_1_NAME_FQ = CLASS_DATA.getName() + "." + METHOD_1_NAME;
+	private static final String METHOD_2_NAME = "method2";
+	private static final String METHOD_2_NAME_FQ = CLASS_DATA.getName() + "." + METHOD_2_NAME;
+	private static final String METHOD_3_NAME_FQ = INNER_CLASS_DATA.getName().replaceAll(Pattern.quote("$"), ".") + "." + METHOD_1_NAME;
+	private static final String METHOD_1_NAME_GENERIC_FQ = GENERIC_CLASS_DATA.getName().replaceAll(Pattern.quote("$"), ".") + "." + METHOD_1_NAME;
+
+	private static JavancssFactory javancssFactory;
+	private static FileFinder fileFinder;
+	private static ComplexityCalculator complexityCalculator;
+
+
+	@BeforeClass
+	public static void setUp() {
+
+		// mock fileFinder
+		fileFinder = mock(FileFinder.class);
+		Source source = mock(Source.class);
+		when(fileFinder.getSource(any(String.class))).thenReturn(source);
+
+		// mock javancssFactory
+		javancssFactory = mock(JavancssFactory.class);
+		Javancss javancss = mock(Javancss.class);
+		List<FunctionMetric> functionMetrics = Arrays.asList(new FunctionMetric[]{
+			newFunctionMetric(METHOD_1_NAME_FQ, "", 1),
+			newFunctionMetric(METHOD_1_NAME_FQ, "long", 2),
+			newFunctionMetric(METHOD_1_NAME_FQ, "List<Integer>", 3),
+			newFunctionMetric(METHOD_1_NAME_FQ, "java.util.List<Integer>, Integer[]", 4),
+			newFunctionMetric(METHOD_1_NAME_FQ, "int[]", 5),
+			newFunctionMetric(METHOD_1_NAME_FQ, "String[][]", 6),
+			newFunctionMetric(METHOD_1_NAME_FQ, "Map<String, List<String>>", 7),
+			newFunctionMetric(METHOD_1_NAME_FQ, "Long", 8),
+			newFunctionMetric(METHOD_1_NAME_FQ, "AtomicLong", 9),
+			newFunctionMetric(METHOD_1_NAME_FQ, "Long[]", 10),
+			newFunctionMetric(METHOD_1_NAME_FQ, "int[][][], String", 11),
+			newFunctionMetric(CLASS_CONSTRUCTOR_NAME_FQ, "", 12),
+			newFunctionMetric(CLASS_CONSTRUCTOR_NAME_FQ, "boolean", 13),
+			newFunctionMetric(METHOD_2_NAME_FQ, "int[][][], String", 14),
+			newFunctionMetric(METHOD_3_NAME_FQ, "Long[]", 15),
+			newFunctionMetric(METHOD_3_NAME_FQ, "long", 16),
+			newFunctionMetric(INNER_CLASS_CONSTRUCTOR_NAME_FQ, "boolean", 17),
+
+			newFunctionMetric(METHOD_1_NAME_GENERIC_FQ, "E", 18),
+			newFunctionMetric(METHOD_1_NAME_GENERIC_FQ, "int, Object", 19),
+			newFunctionMetric(METHOD_1_NAME_GENERIC_FQ, "int, E[]", 20),
+			newFunctionMetric(METHOD_1_NAME_GENERIC_FQ, "int, Map<E, List<? extends E>>", 21),
+			newFunctionMetric(METHOD_1_NAME_GENERIC_FQ, "List<T>, T", 22),
+		});
+		when(javancss.getFunctionMetrics()).thenReturn(functionMetrics);
+		when(javancssFactory.newInstance(any(InputStream.class), any(String.class))).thenReturn(javancss);
+
+		complexityCalculator = new ComplexityCalculator(fileFinder, javancssFactory);
+		complexityCalculator.setCalculateMethodComplexity(true);
+	}
+
+	@Test
+	public void GIVEN_methodDoesNotExist_WHEN_getCCNForMethod_THEN_zeroCcn() {
+		int expectedCcn = 0;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, "doesNotExist", "()V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithNoParameters_THEN_correctCcn() {
+		int expectedCcn = 1;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "()V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithPrimitiveParameter_THEN_correctCcn() {
+		int expectedCcn = 2;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "(J)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithParameterizedTypeParameter_THEN_correctCcn() {
+		int expectedCcn = 3;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "(Ljava/util/List;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithFullyQualifiedParameterizedTypeAndReferenceVarargsParameters_THEN_correctCcn() {
+		int expectedCcn = 4;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "(Ljava/util/List;[Ljava/lang/Integer;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithPrimitiveArrayParameter_THEN_correctCcn() {
+		int expectedCcn = 5;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "([I)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithReferenceMultipleArrayVarargsParameter_THEN_correctCcn() {
+		int expectedCcn = 6;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "([[Ljava/lang/String;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithParameterizedTypeOfParameterizedTypeParameter_THEN_correctCcn() {
+		int expectedCcn = 7;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "(Ljava/util/Map;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithBoxedPrimitiveParameter_THEN_correctCcn() {
+		int expectedCcn = 8;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "(Ljava/lang/Long;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithBoxedPrimitiveLikeParameter_THEN_correctCcn() {
+		int expectedCcn = 9;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "(Ljava/util/concurrent/atomic/AtomicLong;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithBoxedPrimitiveArrayParameter_THEN_correctCcn() {
+		int expectedCcn = 10;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "([Ljava/lang/Long;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithPrimitiveMultiArrayAndReferenceParameter_THEN_correctCcn() {
+		int expectedCcn = 11;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_1_NAME, "([[[ILjava/lang/String;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_constructorExists_WHEN_getCCNForMethodWithConstructorAndNoParameters_THEN_correctCcn() {
+		int expectedCcn = 12;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, "<init>", "()V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_constructorExists_WHEN_getCCNForMethodWithConstructorAndSingleParameter_THEN_correctCcn() {
+		int expectedCcn = 13;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, "<init>", "(Z)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_nonOverloadedMethodExists_WHEN_getCCNForMethodWithParameterSameAsOtherMethod_THEN_correctCcn() {
+		int expectedCcn = 14;
+		int actualCcn = complexityCalculator.getCCNForMethod(CLASS_DATA, METHOD_2_NAME, "([[[ILjava/lang/String;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExistsInInnerClass_WHEN_getCCNForMethodWithSignatureSameAsEnclosingClass_THEN_correctCcn() {
+		int expectedCcn = 15;
+		int actualCcn = complexityCalculator.getCCNForMethod(INNER_CLASS_DATA, METHOD_1_NAME, "([Ljava/lang/Long;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_constructorExistsInInnerClass_WHEN_getCCNForMethodWithConstructorAndSingleParameter_THEN_correctCcn() {
+		int expectedCcn = 17;
+		int actualCcn = complexityCalculator.getCCNForMethod(INNER_CLASS_DATA, "<init>", "(Z)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithGenericTypeParameter_THEN_correctCcn() {
+		int expectedCcn = 18;
+		int actualCcn = complexityCalculator.getCCNForMethod(GENERIC_CLASS_DATA, METHOD_1_NAME, "(Ljava/lang/Object;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithPrimitveAndErasedTypeParameterEquivalentParameters_THEN_correctCcn() {
+		int expectedCcn = 19;
+		int actualCcn = complexityCalculator.getCCNForMethod(GENERIC_CLASS_DATA, METHOD_1_NAME, "(ILjava/lang/Object;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithPrimitveAndTypeParameterVarargsParameters_THEN_correctCcn() {
+		int expectedCcn = 20;
+		int actualCcn = complexityCalculator.getCCNForMethod(GENERIC_CLASS_DATA, METHOD_1_NAME, "(I[Ljava/lang/Object;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_methodExists_WHEN_getCCNForMethodWithPrimitveAndGenericTypeParameters_THEN_correctCcn() {
+		int expectedCcn = 21;
+		int actualCcn = complexityCalculator.getCCNForMethod(GENERIC_CLASS_DATA, METHOD_1_NAME, "(ILjava/util/Map;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	@Test
+	public void GIVEN_staticMethodExists_WHEN_getCCNForMethodWithGenericTypeParameter_THEN_correctCcn() {
+		int expectedCcn = 22;
+		int actualCcn = complexityCalculator.getCCNForMethod(GENERIC_CLASS_DATA, METHOD_1_NAME, "(Ljava/util/List;Ljava/lang/Comparable;)V");
+		assertEquals(expectedCcn, actualCcn);
+	}
+
+	private static FunctionMetric newFunctionMetric(String methodName, String methodSignature, int ccn) {
+		FunctionMetric functionMetric = new FunctionMetric();
+		functionMetric.name = String.format(METHOD_TEMPLATE, methodName, methodSignature);
+		functionMetric.ccn = ccn;
+		return functionMetric;
+	}
+
+}
+
+/**
+ * Class used for the unit tests in {@link ComplexityCalculatorGetCcnForMethodUnitTest}.
+ */
+class Klass {
+	Klass() {}
+	Klass(boolean a) {}
+	private void method1() {}
+	void method1(long a) {}
+	public void method1(List<Integer> a) {}
+	void method1(List<Integer> a, Integer... b) {}
+	private void method1(int[] a) {}
+	private void method1(String[]... a) {}
+	void method1(Map<String, List<String>> a) {}
+	public void method1(Long a) {}
+	private void method1(AtomicLong a) {}
+	void method1(Long... a) {}
+	public void method1(int[][][] a, String b) {}
+	public void method2(int[][][] a, String b) {}
+
+	class InnerKlass {
+		InnerKlass(boolean a) {}
+		private void method1(long a) {}
+		void method1(Long... a) {}
+	}
+}
+
+/**
+ * Class used for the unit tests in {@link ComplexityCalculatorGetCcnForMethodUnitTest}.
+ */
+class KlassToTestGenericType<E> {
+	private void method1(E a) {}
+	private void method1(int a, java.lang.Object b) {}
+	private void method1(int a, E... b) {}
+	private void method1(int a, Map<E, List<? extends E>> b) {}
+	private static <T extends Comparable<T>> void method1(List<T> a, T b) {}
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculatorTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculatorTest.java
new file mode 100644
index 0000000..7d8948d
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/ComplexityCalculatorTest.java
@@ -0,0 +1,190 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * 
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.reporting;
+
+import junit.framework.TestCase;
+import net.sourceforge.cobertura.coveragedata.ClassData;
+import net.sourceforge.cobertura.coveragedata.PackageData;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.coveragedata.SourceFileData;
+import net.sourceforge.cobertura.util.FileFinder;
+import net.sourceforge.cobertura.util.FileFixture;
+
+public class ComplexityCalculatorTest extends TestCase {
+	private FileFixture fileFixture;
+	private FileFinder fileFinder;
+	private ComplexityCalculator complexity;
+
+	public void testGetCCNForSourceFile() {
+		/*
+		 * Sample1.java has a @Deprecated annotation to make sure the complexity works with annotations.
+		 */
+		double ccn1 = complexity.getCCNForSourceFile(new SourceFileData(
+				"com/example/Sample1.java"));
+		assertTrue(ccn1 != 0.0);
+		double ccn2 = complexity.getCCNForSourceFile(new SourceFileData(
+				"com/example/Sample2.java"));
+		assertTrue(ccn2 != 0.0);
+		assertTrue(ccn1 != ccn2);
+
+		ccn1 = complexity.getCCNForSourceFile(new SourceFileData(
+				"com/example/Sample5.java"));
+		assertTrue(ccn1 != 0.0);
+		ccn2 = complexity.getCCNForSourceFile(new SourceFileData(
+				"com/example/Sample6.java"));
+		assertTrue(ccn2 != 0.0);
+		assertTrue(ccn1 != ccn2);
+
+		double ccn0 = complexity.getCCNForSourceFile(new SourceFileData(
+				"com/example/Sample8.java"));
+		assertTrue(ccn0 == 0.0);
+
+		ccn0 = complexity.getCCNForSourceFile(new SourceFileData("Foo.java"));
+		assertTrue(ccn0 == 0.0);
+	}
+
+	public void testGetCCNForClass() {
+		double ccn1 = complexity.getCCNForClass(new ClassData(
+				"com.example.Sample3"));
+		assertTrue(ccn1 != 0.0);
+		double ccn2 = complexity.getCCNForClass(new ClassData(
+				"com.example.Sample4"));
+		assertTrue(ccn2 != 0.0);
+		assertTrue(ccn1 != ccn2);
+
+		ccn1 = complexity.getCCNForClass(new ClassData("com.example.Sample5"));
+		assertTrue(ccn1 != 0.0);
+		ccn2 = complexity.getCCNForClass(new ClassData("com.example.Sample6"));
+		assertTrue(ccn2 != 0.0);
+		assertTrue(ccn1 != ccn2);
+
+		double ccn0 = complexity.getCCNForClass(new ClassData(
+				"com.example.Sample8"));
+		assertEquals(0.0, ccn0, 0.0);
+
+		ccn0 = complexity.getCCNForClass(new ClassData("Foo"));
+		assertEquals(0.0, ccn0, 0.0);
+	}
+
+	public void testGetCCNForPackage() {
+		PackageData pd = new PackageData("com.example");
+		pd.addClassData(new ClassData("com.example.Sample3"));
+		double ccn1 = complexity.getCCNForPackage(pd);
+		assertTrue(ccn1 != 0.0);
+
+		ComplexityCalculator complexity2 = new ComplexityCalculator(fileFinder);
+		pd.addClassData(new ClassData("com.example.Sample4"));
+		double ccn2 = complexity2.getCCNForPackage(pd);
+		double ccn3 = complexity2.getCCNForPackage(pd);
+		assertTrue(ccn2 != 0.0);
+		assertTrue(ccn1 != ccn2);
+		assertEquals(ccn2, ccn3, 0e-9);
+
+		PackageData empty = new PackageData("com.example2");
+		ComplexityCalculator complexity3 = new ComplexityCalculator(fileFinder);
+		assertEquals(0.0, complexity3.getCCNForPackage(empty), 0.0);
+	}
+
+	public void testGetCCNForProject() {
+		ProjectData project = new ProjectData();
+		project.addClassData(new ClassData("com.example.Sample5"));
+		double ccn1 = complexity.getCCNForProject(project);
+		assertTrue(ccn1 != 0.0);
+
+		ComplexityCalculator complexity2 = new ComplexityCalculator(fileFinder);
+		project.addClassData(new ClassData("com.example.Sample4"));
+		double ccn2 = complexity2.getCCNForProject(project);
+		assertTrue(ccn2 != 0.0);
+		assertTrue(ccn1 != ccn2);
+
+		ComplexityCalculator complexity3 = new ComplexityCalculator(fileFinder);
+		project.addClassData(new ClassData("com.example.Sample8"));
+		double ccn3 = complexity3.getCCNForProject(project);
+		assertEquals(ccn2, ccn3, 0e-9);
+
+		ComplexityCalculator complexity4 = new ComplexityCalculator(fileFinder);
+		double ccn0 = complexity4.getCCNForProject(new ProjectData());
+		assertEquals(0.0, ccn0, 0.0);
+	}
+
+	public void testGetCCNForSourceFile_null() {
+		try {
+			complexity.getCCNForSourceFile(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testGetCCNForPackage_null() {
+		try {
+			complexity.getCCNForPackage(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testGetCCNForProject_null() {
+		try {
+			complexity.getCCNForProject(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testConstructor_null() {
+		try {
+			new ComplexityCalculator(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		fileFixture = new FileFixture();
+		fileFixture.setUp();
+
+		fileFinder = new FileFinder();
+		fileFinder.addSourceDirectory(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0]).toString());
+		fileFinder.addSourceDirectory(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[1]).toString());
+		fileFinder.addSourceFile(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(),
+				"com/example\\Sample5.java");
+		fileFinder.addSourceFile(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(),
+				"com/example/Sample6.java");
+		fileFinder.addSourceFile(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(),
+				"com/example/Sample7.java");
+
+		// Do not add com/example/Sample8.java
+		// fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(), "com/example/Sample8.java");
+
+		complexity = new ComplexityCalculator(fileFinder);
+	}
+
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		fileFixture.tearDown();
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/reporting/CompositeReportTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/CompositeReportTest.java
new file mode 100644
index 0000000..ef82e41
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/CompositeReportTest.java
@@ -0,0 +1,42 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.check.CoverageResultEntry;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class CompositeReportTest {
+
+	private CompositeReport report;
+
+	@Before
+	public void setUp() throws Exception {
+		report = new CompositeReport();
+	}
+
+	@Test
+	public void testGetName() throws Exception {
+		assertEquals(ReportName.COMPOSITE_REPORT, report.getName());
+	}
+
+	@Test
+	public void testGetByName() throws Exception {
+		assertEquals(report.getClass(), report.getByName(
+				ReportName.COMPOSITE_REPORT).getClass());
+		assertEquals(NullReport.class, report.getByName(null).getClass());
+	}
+
+	@Test
+	public void testAddReport() throws Exception {
+		Report thresholdReport = new CoverageThresholdsReport(
+				new ArrayList<CoverageResultEntry>());
+		assertEquals(NullReport.class, report.getByName(
+				ReportName.THRESHOLDS_REPORT).getClass());
+		report.addReport(thresholdReport);
+		assertEquals(CoverageThresholdsReport.class, report.getByName(
+				ReportName.THRESHOLDS_REPORT).getClass());
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/reporting/CoverageThresholdsReportTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/CoverageThresholdsReportTest.java
new file mode 100644
index 0000000..4aa4ec5
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/CoverageThresholdsReportTest.java
@@ -0,0 +1,37 @@
+package net.sourceforge.cobertura.reporting;
+
+import net.sourceforge.cobertura.check.CoverageResultEntry;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class CoverageThresholdsReportTest {
+
+	private ArrayList<CoverageResultEntry> coverageResultEntries = new ArrayList<CoverageResultEntry>();
+	private CoverageThresholdsReport report;
+
+	@Before
+	public void setUp() throws Exception {
+		this.report = new CoverageThresholdsReport(coverageResultEntries);
+	}
+
+	@Test
+	public void testGetName() throws Exception {
+		assertEquals(ReportName.THRESHOLDS_REPORT, report.getName());
+	}
+
+	@Test
+	public void testGetByName() throws Exception {
+		assertEquals(report.getClass(), report.getByName(
+				ReportName.THRESHOLDS_REPORT).getClass());
+		assertEquals(NullReport.class, report.getByName(null).getClass());
+	}
+
+	@Test
+	public void testGetCoverageResultEntries() throws Exception {
+		assertEquals(coverageResultEntries, report.getCoverageResultEntries());
+	}
+}
diff --git a/test/net/sourceforge/cobertura/reporting/JUnitXMLHelper.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLHelper.java
similarity index 74%
rename from test/net/sourceforge/cobertura/reporting/JUnitXMLHelper.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLHelper.java
index e62f246..61f5baa 100644
--- a/test/net/sourceforge/cobertura/reporting/JUnitXMLHelper.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLHelper.java
@@ -1,64 +1,62 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Mark Doliner
- * Copyright (C) 2006 John Lewis
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import org.jdom.Document;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-
-public class JUnitXMLHelper
-{
-
-	private final static String BASEDIR = (System.getProperty("basedir") != null) ? System
-			.getProperty("basedir") : ".";
-
-	/**
-	 * This reads the given file into an XML Document.
-	 * @param file A valid file on the file system.
-	 * @param validate Whether to validate the XML or not.
-	 * @return An XML document representing the given XML file.
-	 * @throws FileNotFoundException If the file does not exist.
-	 * @throws IOException If the file could not be open/read.
-	 * @throws JDOMException If the file is not well-formed XML, or
-	 *         if validation is enabled and the document is not
-	 *         valid.
-	 */
-	public static Document readXmlFile(File file, boolean validate) throws FileNotFoundException,
-			IOException, JDOMException
-	{
-		System.out.println("Reading " + file.getAbsolutePath());
-
-		// First create an XML document parser
-		SAXBuilder saxBuilder = new SAXBuilder();
-		saxBuilder.setValidation(validate);
-		saxBuilder.setEntityResolver(new JUnitXMLParserEntityResolver(
-				new File(BASEDIR, "/etc/dtds")));
-		saxBuilder.setErrorHandler(new JUnitXMLParserErrorHandler());
-		return saxBuilder.build(file);
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 Mark Doliner
+ * Copyright (C) 2006 John Lewis
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting;
+
+import org.jdom.Document;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class JUnitXMLHelper {
+
+	/**
+	 * This reads the given file into an XML Document.
+	 *
+	 * @param file     A valid file on the file system.
+	 * @param validate Whether to validate the XML or not.
+	 *
+	 * @return An XML document representing the given XML file.
+	 *
+	 * @throws FileNotFoundException If the file does not exist.
+	 * @throws IOException           If the file could not be open/read.
+	 * @throws JDOMException         If the file is not well-formed XML, or
+	 *                               if validation is enabled and the document is not
+	 *                               valid.
+	 */
+	public static Document readXmlFile(File file, boolean validate)
+			throws FileNotFoundException, IOException, JDOMException {
+		System.out.println("Reading " + file.getAbsolutePath());
+
+		// First create an XML document parser
+		SAXBuilder saxBuilder = new SAXBuilder();
+		saxBuilder.setValidation(validate);
+		saxBuilder.setEntityResolver(new JUnitXMLParserEntityResolver(new File(
+				"src/test/resources/dtds")));
+		saxBuilder.setErrorHandler(new JUnitXMLParserErrorHandler());
+		return saxBuilder.build(file);
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/reporting/JUnitXMLParserEntityResolver.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLParserEntityResolver.java
similarity index 91%
rename from test/net/sourceforge/cobertura/reporting/JUnitXMLParserEntityResolver.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLParserEntityResolver.java
index 64374e6..bcd49ad 100644
--- a/test/net/sourceforge/cobertura/reporting/JUnitXMLParserEntityResolver.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLParserEntityResolver.java
@@ -1,89 +1,83 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * <p>
- * This is a very simple XML EntityResolver.  If
- * you are parsing an XML document using a DocumentBuilder,
- * and you set the DocumentBuilder's EntityResolver to an
- * instance of this class, then we never attempt to resolve
- * XML documents on the Internet.  Instead we use a local
- * copy of the DTD.
- * </p>
- *
- * <p>
- * This is done so that the XMLReportTest.java JUnit test will
- * not fail when the test is run on a non-networked machine,
- * or when webpages must be accessed through a proxy server.
- * </p>
- */
-public class JUnitXMLParserEntityResolver extends DefaultHandler
-{
-
-	private final File DTD_DIRECTORY;
-
-	public JUnitXMLParserEntityResolver(File dtdDirectory)
-	{
-		this.DTD_DIRECTORY = dtdDirectory;
-	}
-
-	public InputSource resolveEntity(String publicId, String systemId)
-			throws SAXException
-	{
-		System.out.println("systemId=" + systemId);
-		String systemIdBasename = systemId.substring(systemId.lastIndexOf('/'));
-		File localDtd = new File(this.DTD_DIRECTORY, systemIdBasename);
-		try
-		{
-			return new InputSource(new FileInputStream(localDtd));
-		}
-		catch (FileNotFoundException e)
-		{
-			System.out.println("Unable to open local DTD file "
-					+ localDtd.getAbsolutePath() + ", using " + systemId
-					+ " instead.");
-		}
-
-		InputSource source = null;
-
-		try {
-			super.resolveEntity(publicId, systemId);
-		} catch (Exception exception) {
-			// apparently 1.5 throws an IOException here, but we can't catch it specifically if
-			//	we're not on 1.5 (docs on both kind of say that they throw it)
-			//	actual code on 1.4.2 has it remmed out so that it only throws SAXException  
-			throw new SAXException(exception);
-		}
-
-		return source;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+/**
+ * <p>
+ * This is a very simple XML EntityResolver.  If
+ * you are parsing an XML document using a DocumentBuilder,
+ * and you set the DocumentBuilder's EntityResolver to an
+ * instance of this class, then we never attempt to resolve
+ * XML documents on the Internet.  Instead we use a local
+ * copy of the DTD.
+ * </p>
+ * <p/>
+ * <p>
+ * This is done so that the XMLReportTest.java JUnit test will
+ * not fail when the test is run on a non-networked machine,
+ * or when webpages must be accessed through a proxy server.
+ * </p>
+ */
+public class JUnitXMLParserEntityResolver extends DefaultHandler {
+
+	private final File DTD_DIRECTORY;
+
+	public JUnitXMLParserEntityResolver(File dtdDirectory) {
+		this.DTD_DIRECTORY = dtdDirectory;
+	}
+
+	public InputSource resolveEntity(String publicId, String systemId)
+			throws SAXException {
+		System.out.println("systemId=" + systemId);
+		String systemIdBasename = systemId.substring(systemId.lastIndexOf('/'));
+		File localDtd = new File(this.DTD_DIRECTORY, systemIdBasename);
+		try {
+			return new InputSource(new FileInputStream(localDtd));
+		} catch (FileNotFoundException e) {
+			System.out.println("Unable to open local DTD file "
+					+ localDtd.getAbsolutePath() + ", using " + systemId
+					+ " instead.");
+		}
+
+		InputSource source = null;
+
+		try {
+			super.resolveEntity(publicId, systemId);
+		} catch (Exception exception) {
+			// apparently 1.5 throws an IOException here, but we can't catch it specifically if
+			//	we're not on 1.5 (docs on both kind of say that they throw it)
+			//	actual code on 1.4.2 has it remmed out so that it only throws SAXException
+			throw new SAXException(exception);
+		}
+
+		return source;
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/reporting/JUnitXMLParserErrorHandler.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLParserErrorHandler.java
similarity index 73%
rename from test/net/sourceforge/cobertura/reporting/JUnitXMLParserErrorHandler.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLParserErrorHandler.java
index 5403c4f..d7d289b 100644
--- a/test/net/sourceforge/cobertura/reporting/JUnitXMLParserErrorHandler.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/JUnitXMLParserErrorHandler.java
@@ -1,64 +1,56 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting;
-
-import junit.framework.Assert;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXParseException;
-
-/**
- * This is a very simple SAX XML parser ErrorHandler.  If
- * you are parsing an XML document using a DocumentBuilder,
- * and you set the DocumentBuilder's ErrorHandler to an
- * instance of this class, and the XML document contains
- * any suspect XML, then this class will throw a JUnit
- * assertion failure.
- */
-public class JUnitXMLParserErrorHandler implements ErrorHandler
-{
-	
-	private void createErrorMessage(SAXParseException exception)
-	{
-		Assert.fail("Line number: " + exception.getLineNumber() 
-				+ " column: " +	exception.getColumnNumber() 
-				+ "\n"
-				+ exception.toString());
-	}
-
-	public void error(SAXParseException exception)
-	{
-		createErrorMessage(exception);
-	}
-
-	public void fatalError(SAXParseException exception)
-	{
-		createErrorMessage(exception);
-	}
-
-	public void warning(SAXParseException exception)
-	{
-		createErrorMessage(exception);
-	}
-
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting;
+
+import junit.framework.Assert;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+
+/**
+ * This is a very simple SAX XML parser ErrorHandler.  If
+ * you are parsing an XML document using a DocumentBuilder,
+ * and you set the DocumentBuilder's ErrorHandler to an
+ * instance of this class, and the XML document contains
+ * any suspect XML, then this class will throw a JUnit
+ * assertion failure.
+ */
+public class JUnitXMLParserErrorHandler implements ErrorHandler {
+
+	private void createErrorMessage(SAXParseException exception) {
+		Assert.fail("Line number: " + exception.getLineNumber() + " column: "
+				+ exception.getColumnNumber() + "\n" + exception.toString());
+	}
+
+	public void error(SAXParseException exception) {
+		createErrorMessage(exception);
+	}
+
+	public void fatalError(SAXParseException exception) {
+		createErrorMessage(exception);
+	}
+
+	public void warning(SAXParseException exception) {
+		createErrorMessage(exception);
+	}
+
 }
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/reporting/NullReportTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/NullReportTest.java
new file mode 100644
index 0000000..779f208
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/NullReportTest.java
@@ -0,0 +1,27 @@
+package net.sourceforge.cobertura.reporting;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class NullReportTest {
+
+	private NullReport report;
+
+	@Before
+	public void setUp() throws Exception {
+		this.report = new NullReport();
+	}
+
+	@Test
+	public void testGetName() throws Exception {
+		assertEquals(ReportName.NULL_REPORT, report.getName());
+	}
+
+	@Test
+	public void testGetByName() throws Exception {
+		assertEquals(report, report.getByName(ReportName.NULL_REPORT));
+		assertEquals(report, report.getByName(null));
+	}
+}
diff --git a/test/net/sourceforge/cobertura/reporting/html/JavaToHtmlTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/html/JavaToHtmlTest.java
similarity index 91%
rename from test/net/sourceforge/cobertura/reporting/html/JavaToHtmlTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/reporting/html/JavaToHtmlTest.java
index d028306..a8778f6 100644
--- a/test/net/sourceforge/cobertura/reporting/html/JavaToHtmlTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/html/JavaToHtmlTest.java
@@ -1,64 +1,61 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.html;
-
-import junit.framework.TestCase;
-
-public class JavaToHtmlTest extends TestCase
-{
-
-	public static void testSyntaxHighlight()
-	{
-		JavaToHtml javaToHtml = new JavaToHtml();
-
-		assertEquals(
-				"<span class=\"keyword\">package</span> net.sourceforge.cobertura.reporting.html;",
-				javaToHtml
-						.process("package net.sourceforge.cobertura.reporting.html;"));
-		assertEquals(
-				"<span class=\"keyword\">import</span> junit.framework.TestCase;",
-				javaToHtml.process("import junit.framework.TestCase;"));
-		assertEquals(
-				"<span class=\"keyword\">public</span> <span class=\"keyword\">class</span> javaToHtmlTest <span class=\"keyword\">extends</span> TestCase {",
-				javaToHtml
-						.process("public class javaToHtmlTest extends TestCase {"));
-		assertEquals(
-				"<span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> testSyntaxHighlight() {",
-				javaToHtml
-						.process("public static void testSyntaxHighlight() {"));
-		assertEquals(
-				"System.out.println(javaToHtml.process(<span class=\"string\">\"\"</span>));",
-				javaToHtml
-						.process("System.out.println(javaToHtml.process(\"\"));"));
-		assertEquals("}", javaToHtml.process("}"));
-		assertEquals(" ", javaToHtml.process(" "));
-		assertEquals("        ", javaToHtml.process("	"));
-		assertEquals(
-				"System.out.println(<span class=\"string\">'Q'</span>);",
-				javaToHtml.process("System.out.println('Q');"));
-		assertEquals(
-				".charAt(currentIndex - 1) == <span class=\"string\">'\\\\'</span>)));",
-				javaToHtml.process(".charAt(currentIndex - 1) == '\\\\')));"));
-		assertEquals("<span class=\"string\">'\\n'</span>", javaToHtml
-				.process("'\\n'"));
-	}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.html;
+
+import junit.framework.TestCase;
+
+public class JavaToHtmlTest extends TestCase {
+
+	public static void testSyntaxHighlight() {
+		JavaToHtml javaToHtml = new JavaToHtml();
+
+		assertEquals(
+				"<span class=\"keyword\">package</span> net.sourceforge.cobertura.reporting.html;",
+				javaToHtml
+						.process("package net.sourceforge.cobertura.reporting.html;"));
+		assertEquals(
+				"<span class=\"keyword\">import</span> junit.framework.TestCase;",
+				javaToHtml.process("import junit.framework.TestCase;"));
+		assertEquals(
+				"<span class=\"keyword\">public</span> <span class=\"keyword\">class</span> javaToHtmlTest <span class=\"keyword\">extends</span> TestCase {",
+				javaToHtml
+						.process("public class javaToHtmlTest extends TestCase {"));
+		assertEquals(
+				"<span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> testSyntaxHighlight() {",
+				javaToHtml
+						.process("public static void testSyntaxHighlight() {"));
+		assertEquals(
+				"System.out.println(javaToHtml.process(<span class=\"string\">\"\"</span>));",
+				javaToHtml
+						.process("System.out.println(javaToHtml.process(\"\"));"));
+		assertEquals("}", javaToHtml.process("}"));
+		assertEquals(" ", javaToHtml.process(" "));
+		assertEquals("        ", javaToHtml.process("	"));
+		assertEquals("System.out.println(<span class=\"string\">'Q'</span>);",
+				javaToHtml.process("System.out.println('Q');"));
+		assertEquals(
+				".charAt(currentIndex - 1) == <span class=\"string\">'\\\\'</span>)));",
+				javaToHtml.process(".charAt(currentIndex - 1) == '\\\\')));"));
+		assertEquals("<span class=\"string\">'\\n'</span>", javaToHtml
+				.process("'\\n'"));
+	}
 }
\ No newline at end of file
diff --git a/test/net/sourceforge/cobertura/reporting/html/files/CopyFilesTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/html/files/CopyFilesTest.java
similarity index 85%
rename from test/net/sourceforge/cobertura/reporting/html/files/CopyFilesTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/reporting/html/files/CopyFilesTest.java
index 7cef325..41758ab 100644
--- a/test/net/sourceforge/cobertura/reporting/html/files/CopyFilesTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/html/files/CopyFilesTest.java
@@ -1,86 +1,81 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.html.files;
-
-import java.io.File;
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-public class CopyFilesTest extends TestCase
-{
-	private final static String basedir = (System.getProperty("basedir") != null)
-			? System.getProperty("basedir")
-			: "./";
-	private final static File tmpDir = new File(basedir, "/build/test/tmp");
-
-	public void setUp()
-	{
-		tmpDir.mkdirs();
-	}
-
-	private final static void removeDir(File dir)
-	{
-		File files[] = dir.listFiles();
-		for (int i = 0; i < files.length; i++)
-		{
-			if (files[i].isDirectory())
-				removeDir(files[i]);
-			else
-				files[i].delete();
-		}
-		dir.delete();
-	}
-
-	public void tearDown()
-	{
-		removeDir(tmpDir);
-	}
-
-	public static void testCopy() throws IOException
-	{
-		CopyFiles.copy(tmpDir);
-		assertTrue(new File(tmpDir, "help.html").isFile());
-		assertTrue(new File(tmpDir, "index.html").isFile());
-
-		File cssDir = new File(tmpDir, "css");
-		assertTrue(cssDir.isDirectory());
-		assertTrue(new File(cssDir, "help.css").isFile());
-		assertTrue(new File(cssDir, "main.css").isFile());
-		assertTrue(new File(cssDir, "sortabletable.css").isFile());
-		assertTrue(new File(cssDir, "source-viewer.css").isFile());
-		assertTrue(new File(cssDir, "tooltip.css").isFile());
-
-		File imagesDir = new File(tmpDir, "images");
-		assertTrue(imagesDir.isDirectory());
-		assertTrue(new File(imagesDir, "blank.png").isFile());
-		assertTrue(new File(imagesDir, "downsimple.png").isFile());
-		assertTrue(new File(imagesDir, "upsimple.png").isFile());
-
-		File jsDir = new File(tmpDir, "js");
-		assertTrue(jsDir.isDirectory());
-		assertTrue(new File(jsDir, "customsorttypes.js").isFile());
-		assertTrue(new File(jsDir, "popup.js").isFile());
-		assertTrue(new File(jsDir, "sortabletable.js").isFile());
-		assertTrue(new File(jsDir, "stringbuilder.js").isFile());
-	}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.html.files;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.IOException;
+
+public class CopyFilesTest extends TestCase {
+	private final static String basedir = (System.getProperty("basedir") != null)
+			? System.getProperty("basedir")
+			: "./";
+	private final static File tmpDir = new File(basedir,
+			"/target/build/test/tmp");
+
+	public void setUp() {
+		tmpDir.mkdirs();
+	}
+
+	private final static void removeDir(File dir) {
+		File files[] = dir.listFiles();
+		for (int i = 0; i < files.length; i++) {
+			if (files[i].isDirectory())
+				removeDir(files[i]);
+			else
+				files[i].delete();
+		}
+		dir.delete();
+	}
+
+	public void tearDown() {
+		removeDir(tmpDir);
+	}
+
+	public static void testCopy() throws IOException {
+		CopyFiles.copy(tmpDir);
+		assertTrue(new File(tmpDir, "help.html").isFile());
+		assertTrue(new File(tmpDir, "index.html").isFile());
+
+		File cssDir = new File(tmpDir, "css");
+		assertTrue(cssDir.isDirectory());
+		assertTrue(new File(cssDir, "help.css").isFile());
+		assertTrue(new File(cssDir, "main.css").isFile());
+		assertTrue(new File(cssDir, "sortabletable.css").isFile());
+		assertTrue(new File(cssDir, "source-viewer.css").isFile());
+		assertTrue(new File(cssDir, "tooltip.css").isFile());
+
+		File imagesDir = new File(tmpDir, "images");
+		assertTrue(imagesDir.isDirectory());
+		assertTrue(new File(imagesDir, "blank.png").isFile());
+		assertTrue(new File(imagesDir, "downsimple.png").isFile());
+		assertTrue(new File(imagesDir, "upsimple.png").isFile());
+
+		File jsDir = new File(tmpDir, "js");
+		assertTrue(jsDir.isDirectory());
+		assertTrue(new File(jsDir, "customsorttypes.js").isFile());
+		assertTrue(new File(jsDir, "popup.js").isFile());
+		assertTrue(new File(jsDir, "sortabletable.js").isFile());
+		assertTrue(new File(jsDir, "stringbuilder.js").isFile());
+	}
 }
\ No newline at end of file
diff --git a/test/net/sourceforge/cobertura/reporting/xml/XMLReportTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/xml/XMLReportTest.java
similarity index 80%
rename from test/net/sourceforge/cobertura/reporting/xml/XMLReportTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/reporting/xml/XMLReportTest.java
index d0eab85..005a553 100644
--- a/test/net/sourceforge/cobertura/reporting/xml/XMLReportTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/reporting/xml/XMLReportTest.java
@@ -1,80 +1,77 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting.xml;
-
-import java.io.File;
-
-import junit.framework.TestCase;
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.reporting.ComplexityCalculator;
-import net.sourceforge.cobertura.reporting.JUnitXMLHelper;
-import net.sourceforge.cobertura.util.FileFinder;
-
-public class XMLReportTest extends TestCase
-{
-
-	private final static String BASEDIR = (System.getProperty("basedir") != null) ? System
-			.getProperty("basedir") : ".";
-	private final static String PATH_TO_TEST_OUTPUT = BASEDIR + "/build/test/XMLReportTest";
-	private File tmpDir;
-
-	public void setUp()
-	{
-		tmpDir = new File(PATH_TO_TEST_OUTPUT);
-		tmpDir.mkdirs();
-	}
-
-	public void tearDown()
-	{
-		tmpDir = new File(PATH_TO_TEST_OUTPUT);
-		File files[] = tmpDir.listFiles();
-		for (int i = 0; i < files.length; i++)
-			files[i].delete();
-		tmpDir.delete();
-	}
-
-	public void testXMLReportWithNonSourceLines() throws Exception
-	{
-		ProjectData projectData = new ProjectData();
-
-		// Adding line to the project data that hasn't been yet marked as source line 
-		ClassData cd = projectData.getOrCreateClassData(XMLReport.class.getName());
-		cd.touch(7777,1);
-
-		File reportDir = File.createTempFile("XMLReportTest", "");
-		reportDir.delete();
-		reportDir.mkdir();
-
-		FileFinder fileFinder = new FileFinder();
-		ComplexityCalculator complexity = new ComplexityCalculator(fileFinder);
-
-		new XMLReport(projectData, reportDir, fileFinder, complexity);
-
-		File coverageFile = new File(reportDir, "coverage.xml");
-		JUnitXMLHelper.readXmlFile(coverageFile, true);
-
-		coverageFile.delete();
-		reportDir.delete();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.reporting.xml;
+
+import junit.framework.TestCase;
+import net.sourceforge.cobertura.coveragedata.ClassData;
+import net.sourceforge.cobertura.coveragedata.ProjectData;
+import net.sourceforge.cobertura.reporting.ComplexityCalculator;
+import net.sourceforge.cobertura.reporting.JUnitXMLHelper;
+import net.sourceforge.cobertura.util.FileFinder;
+
+import java.io.File;
+
+public class XMLReportTest extends TestCase {
+
+	private final static String BASEDIR = ".";
+	private final static String PATH_TO_TEST_OUTPUT = BASEDIR
+			+ "/target/build/test/XMLReportTest";
+	private File tmpDir;
+
+	public void setUp() {
+		tmpDir = new File(PATH_TO_TEST_OUTPUT);
+		tmpDir.mkdirs();
+	}
+
+	public void tearDown() {
+		tmpDir = new File(PATH_TO_TEST_OUTPUT);
+		File files[] = tmpDir.listFiles();
+		for (int i = 0; i < files.length; i++)
+			files[i].delete();
+		tmpDir.delete();
+	}
+
+	public void testXMLReportWithNonSourceLines() throws Exception {
+		ProjectData projectData = new ProjectData();
+
+		// Adding line to the project data that hasn't been yet marked as source line
+		ClassData cd = projectData.getOrCreateClassData(XMLReport.class
+				.getName());
+		cd.touch(7777, 1);
+
+		File reportDir = File.createTempFile("XMLReportTest", "");
+		reportDir.delete();
+		reportDir.mkdir();
+
+		FileFinder fileFinder = new FileFinder();
+		ComplexityCalculator complexity = new ComplexityCalculator(fileFinder);
+
+		new XMLReport(projectData, reportDir, fileFinder, complexity);
+
+		File coverageFile = new File(reportDir, "coverage.xml");
+		JUnitXMLHelper.readXmlFile(coverageFile, true);
+
+		coverageFile.delete();
+		reportDir.delete();
+	}
+
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/AbstractCoberturaTestCase.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/AbstractCoberturaTestCase.java
new file mode 100644
index 0000000..71aa3ed
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/AbstractCoberturaTestCase.java
@@ -0,0 +1,189 @@
+/**
+ * 
+ */
+package net.sourceforge.cobertura.test;
+
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.reporting.ReportMain;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.Path;
+import org.junit.After;
+import org.junit.Before;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author schristou88
+ *
+ */
+public class AbstractCoberturaTestCase {
+	public static File tempDir;
+	public static File srcDir;
+	public static File reportDir;
+	public static File instrumentDir;
+	File mainSourceFile;
+	public static File datafile;
+
+	@Before
+	public void setUp() throws Exception {
+		tempDir = TestUtils.getTempDir();
+
+		FileUtils.deleteDirectory(tempDir);
+
+		srcDir = new File(tempDir, "src");
+		reportDir = new File(tempDir, "report");
+		instrumentDir = new File(tempDir, "instrument");
+		mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		datafile = new File(srcDir, "cobertura.ser");
+
+		srcDir.mkdirs();
+		reportDir.mkdirs();
+		instrumentDir.mkdirs();
+	}
+
+	@After
+	public void tearDown() {
+		// Default is do nothing since if we try
+		// debugging we can see logs of current failure.
+	}
+
+	public static void assertConditionCoverage(List<Node> lines,
+			String expectedValue, int lineNumber) {
+		boolean found = false;
+		for (Node node : lines) {
+			if (Integer.valueOf((String) node.attribute("number")) == lineNumber) {
+				found = true;
+				assertEquals(expectedValue, (String) node
+						.attribute("condition-coverage"));
+			}
+		}
+		assertTrue(found);
+	}
+
+	public Node createAndExecuteMainMethod(String packageName, String fileName,
+			String fileContent, String mainMethod) throws Exception {
+		return createAndExecuteMainMethod(packageName, fileName, fileContent,
+				mainMethod, "xml");
+	}
+
+	public Node createAndExecuteMainMethod(String packageName, String fileName,
+			String fileContent, String mainMethod, String format)
+			throws Exception {
+
+		FileUtils.write(new File(srcDir, packageName + "/" + fileName + ".java"), fileContent);
+
+		TestUtils.compileSource(srcDir);
+
+		TestUtils.instrumentClasses(TestUtils.antBuilder, srcDir, datafile,
+				instrumentDir);
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname(mainMethod);
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+        java.setClasspath(TestUtils.getCoberturaDefaultClasspath());
+		java.execute();
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		new File(reportDir, "/coverage-xml").mkdirs();
+		new File(reportDir, "/coverage-html").mkdirs();
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+        reportTask.setSrcDir(srcDir.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(new File(reportDir, "/coverage-xml"));
+		reportTask.execute();
+
+		reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+        reportTask.setSrcDir(srcDir.getAbsolutePath());
+		reportTask.setFormat("html");
+		reportTask.setDestDir(new File(reportDir, "/coverage-html"));
+		reportTask.execute();
+
+		return TestUtils.getXMLReportDOM(reportDir.getAbsolutePath()
+				+ "/coverage-xml/coverage.xml");
+	}
+
+	/**
+	 * 
+	 * @param method method with the parsing issue
+	 * @throws IOException 
+	 */
+	public static void parseIssueTester(String imports, String method)
+			throws IOException {
+		String wrapper = "\n package mypackage;" + "\n " + imports
+				+ "\n public class FooMain {" + method + "\n }";
+
+		FileUtils.write(new File(srcDir, "mypackage/FooMain.java"), wrapper);
+
+		TestUtils.compileSource(TestUtils.antBuilder, srcDir);
+
+		TestUtils.instrumentClasses(TestUtils.antBuilder, srcDir, datafile,
+				instrumentDir);
+
+		debugReportTask();
+
+		if (FileUtils
+				.readFileToString(new File(reportDir, "error.log"))
+				.contains(
+						"net.sourceforge.cobertura.javancss.parser.ParseException"))
+			fail("JavaNCSS Error, see console output or file: "
+					+ new File(reportDir, "error.log").getAbsolutePath());
+
+		if (FileUtils
+				.readFileToString(new File(reportDir, "std.log"))
+				.contains(
+						"net.sourceforge.cobertura.javancss.parser.ParseException"))
+			fail("JavaNCSS Error, see console output or file: "
+					+ new File(reportDir, "std.log").getAbsolutePath());
+	}
+
+	/**
+	 *
+	 * This report task allows you to insert break points in JavaParser class for
+	 * debugging parsing issues further.
+	 * 
+	 * Standard output gets put in ${reportDir}/std.log
+	 * Standard error  gets put in ${reportDir}/error.log
+	 * 
+	 * @throws FileNotFoundException
+	 */
+	public static void debugReportTask() throws FileNotFoundException {
+		String[] args = {"--format", "xml", "--destination",
+				reportDir.getAbsolutePath(), "--datafile",
+				datafile.getAbsolutePath(), srcDir.getAbsolutePath()};
+		PrintStream err = new PrintStream(new File(reportDir, "error.log"));
+		PrintStream out = new PrintStream(new File(reportDir, "std.log"));
+
+		PrintStream dErr = System.err;
+		PrintStream dOut = System.out;
+
+		try {
+			System.setErr(err);
+			System.setOut(out);
+			ReportMain.main(args);
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			System.setErr(dErr);
+			System.setOut(dOut);
+		}
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/FunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/FunctionalTest.java
new file mode 100644
index 0000000..a60fde2
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/FunctionalTest.java
@@ -0,0 +1,339 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2010 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class FunctionalTest extends AbstractCoberturaTestCase {
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+
+	Node dom;
+	IgnoreUtil ignoreUtil;
+
+	@Test
+	public void interfaceFunctionalTest() throws Exception {
+		/*
+		 * Interfaces are not instrumented (yet).   So, instrument an interface and make
+		 * sure line/conditional information is not in the report.
+		 */
+		/*
+		 * Use a temporary directory and create a few sources files.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		File interfaceSourceFile = new File(srcDir,
+				"mypackage/MyInterface.java");
+
+		FileUtils
+				.write(
+						interfaceSourceFile,
+						"\n package mypackage;"
+								+ "\n "
+								+ "\n public interface MyInterface {"
+								+ "\n 	public static final Object MY_CONSTANT = new Object();  /* the test expects this to be line 5 */"
+								+ "\n }");
+
+		FileUtils.write(mainSourceFile, "\n package mypackage;" + "\n "
+				+ "\n public class Main implements MyInterface {" + "\n "
+				+ "\n  public static void main(String[] args) {"
+				+ "\n   System.out.println(new Main());"
+				+ "\n   System.out.println(MY_CONSTANT);" + "\n  }" + "\n }");
+		TestUtils.compileSource(ant, srcDir);
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(TestUtils.getCoberturaDefaultClasspath());
+		java.execute();
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		List<Node> lines = TestUtils.getLineCounts(dom,
+				"mypackage.MyInterface", "<clinit>", null);
+
+		// When/if interfaces are instrumented, the next line can go away and the
+		// lines in this method that have been commented out, can be uncommented.
+		assertEquals("Interfaces are being instrumented", lines.size(), 0);
+	}
+
+	@Test
+	public void conditionalInFinallyFunctionalTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a few sources files.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		FileUtils.write(mainSourceFile, "\n package mypackage;" + "\n " + "\n "
+				+ "\n " + "\n public class Main {" + "\n  "
+				+ "\n  private boolean isDisabled() {" + "\n   return true;"
+				+ "\n  }" + "\n  " + "\n  private void doSomething() {"
+				+ "\n  }" + "\n  " + "\n  public void aMethod() {"
+				+ "\n   boolean disabled = false;" + "\n   try {"
+				+ "\n    disabled = isDisabled();" + "\n   } finally {"
+				+ "\n   if (disabled)" + "\n    doSomething();" + "\n   }"
+				+ "\n  }" + "\n  " + "\n  " + "\n }");
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		List<Node> lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"aMethod", null);
+		Node conditionalLine = null;
+		for (Node line : lines) {
+			if ("20".equals(line.attribute("number"))) {
+				conditionalLine = line;
+			}
+		}
+		assertNotNull(conditionalLine);
+		assertEquals("0% (0/2)", conditionalLine
+				.attribute("condition-coverage"));
+	}
+
+	@Test
+	public void callJunit() throws Exception {
+		/*
+		 * Use a temporary directory and create a few sources files.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		final File srcDir = new File(tempDir, "src");
+
+		final File reportDir = new File(tempDir, "report");
+		reportDir.mkdirs();
+
+		final File instrumentDir = new File(tempDir, "instrument");
+		instrumentDir.mkdirs();
+
+		File buildDir = new File(tempDir, "build");
+		buildDir.mkdirs();
+
+		File testSourceFile = new File(srcDir, "mypackage/MyTest.groovy");
+		testSourceFile.getParentFile().mkdirs();
+
+		FileUtils
+				.write(
+						testSourceFile,
+						"\n package mypackage"
+								+ "\n "
+								+ "\n import junit.framework.TestSuite"
+								+ "\n import junit.framework.Test"
+								+ "\n "
+								+ "\n "
+								+ "\n public class MyTest extends TestSuite {"
+								+ "\n public MyTest(String arg0) {"
+								+ "\n 	super(arg0);"
+								+ "\n }"
+								+ "\n "
+								+ "\n public static Test suite() {"
+								+ "\n 	"
+								+ "\n 	// do something that will cause Sub's static initializer to run"
+								+ "\n 	Sub.class" + "\n "
+								+ "\n 	return new TestSuite(\"Empty Suite\")"
+								+ "\n }" + "\n }");
+
+		File superSourceFile = new File(srcDir, "mypackage/Super.java");
+		File subSourceFile = new File(srcDir, "mypackage/Sub.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+
+		FileUtils.write(superSourceFile, "\n package mypackage;" + "\n "
+				+ "\n public class Super {" + "\n  static {"
+				+ "\n   Sub.aStaticMethod();" + "\n  };" + "\n }");
+
+		FileUtils.write(subSourceFile, "\n package mypackage;" + "\n "
+				+ "\n public class Sub extends Super {" + "\n  "
+				+ "\n  public static void aStaticMethod() {"
+				+ "\n   System.out.println(\"aStaticMethod called\");"
+				+ "\n  }" + "\n  " + "\n }");
+
+		// compile to the srcDir
+		TestUtils.compileGroovy(ant, srcDir);
+
+		// instrument all but the test class (in place)
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir,
+				new HashMap() {
+					{
+						put("excludeClassesRegexList", "mypackage.MyTest");
+					}
+				});
+
+		// run the MyTest
+		TestUtils.junit(new HashMap() {
+			{
+				put("testClass", "mypackage.MyTest");
+				put("ant", ant);
+				put("buildDir", srcDir);
+				put("instrumentDir", instrumentDir);
+				put("reportDir", reportDir);
+			}
+		});
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		List<Node> lines = TestUtils.getLineCounts(dom, "mypackage.Sub",
+				"aStaticMethod");
+
+		Node aStaticMethodLine = null;
+		for (Node line : lines) {
+			if ("7".equals(line.attribute("number"))) {
+				aStaticMethodLine = line;
+				break;
+			}
+		}
+
+		assertNotNull(aStaticMethodLine);
+		assertEquals(1, Integer.valueOf(
+				aStaticMethodLine.attribute("hits").toString()).intValue());
+	}
+
+	@Test
+	public void simpleFunctionalTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a few sources files.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File simpleSourceFile = new File(srcDir, "mypackage/Simple.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		FileUtils.write(simpleSourceFile, "\n package mypackage;" + "\n "
+				+ "\n public class Simple {" + "\n }");
+
+		FileUtils.write(mainSourceFile, "\n package mypackage;" + "\n " + "\n "
+				+ "\n " + "\n public class Main {" + "\n " + "\n "
+				+ "\n  public boolean isSimple() {" + "\n   return false;"
+				+ "\n  }" + "\n " + "\n " + "\n  private Object create() {"
+				+ "\n   if (isSimple()) {"
+				+ "\n    Object result = new Simple();" + "\n   } else {"
+				+ "\n    Object result = new Main();" + "\n   }"
+				+ "\n   return null;" + "\n " + "\n  }" + "\n }");
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+	}
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreMethodAnnotationFunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreMethodAnnotationFunctionalTest.java
new file mode 100644
index 0000000..f975d12
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreMethodAnnotationFunctionalTest.java
@@ -0,0 +1,187 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2010 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class IgnoreMethodAnnotationFunctionalTest {
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+	IgnoreUtil ignoreUtil;
+	Node dom;
+
+	@Before
+	public void setUp() throws IOException {
+		FileUtils.deleteQuietly(new File(TestUtils.getTempDir(), "src"));
+		FileUtils.deleteQuietly(new File(TestUtils.getTempDir(), "instrument"));
+	}
+
+	@Test
+	public void ignoreMethodAnnotationTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a Main.java source file that
+		 * has methods with annotations that we want to ignore.
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File annotationSourceFile = new File(srcDir,
+				"mypackage/IgnoreAnnotation.java");
+		File annotation2SourceFile = new File(srcDir,
+				"mypackage/IgnoreAnnotation2.java");
+
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		FileUtils.write(annotationSourceFile, "\n package mypackage;" + "\n "
+				+ "\n public @interface IgnoreAnnotation {}");
+
+		FileUtils.write(annotation2SourceFile, "\n package mypackage;" + "\n "
+				+ "\n public @interface IgnoreAnnotation2 {}");
+		FileUtils
+				.write(
+						mainSourceFile,
+						"\n package mypackage;"
+								+ "\n "
+								+ "\n public class Main"
+								+ "\n {"
+								+ "\n 	"
+								+ "\n public static void main(String[] args) {"
+								+ "\n Main main = new Main();"
+								+ "\n 			"
+								+ "\n 		/*"
+								+ "\n 		 * Call all methods so they will be considered \"covered\" unless"
+								+ "\n 		 * they are ignored." + "\n 		 *"
+								+ "\n 		 * These are in no particular order."
+								+ "\n 		 */" + "\n main.doNotIgnore();"
+								+ "\n main.ignore();" + "\n }" + "\n "
+								+ "\n public void doNotIgnore()" + "\n {"
+								+ "\n }" + "\n " + "\n @IgnoreAnnotation"
+								+ "\n public void ignore()" + "\n {" + "\n }"
+								+ "\n " + "\n 	@IgnoreAnnotation2"
+								+ "\n 	public void ignore2()" + "\n 	{"
+								+ "\n 	}" + "\n }");
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir,
+				new HashMap() {
+					{
+						put("ignoreAnnotationNames", new ArrayList<String>() {
+							{
+								add("mypackage.IgnoreAnnotation");
+								add("mypackage.IgnoreAnnotation2");
+							}
+						});
+					}
+				});
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(TestUtils.getCoberturaDefaultClasspath());
+		java.execute();
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		ignoreUtil = new IgnoreUtil("mypackage.Main", dom);
+
+		assertNotIgnored("doNotIgnore");
+
+		assertIgnored("ignore");
+
+		assertIgnored("ignore2");
+	}
+
+	public void assertIgnored(String methodName) {
+		ignoreUtil.assertIgnored(methodName, null);
+	}
+
+	public void assertNotIgnored(String methodName) {
+		ignoreUtil.assertNotIgnored(methodName, null);
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreTrivialFunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreTrivialFunctionalTest.java
new file mode 100644
index 0000000..75d3e39
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreTrivialFunctionalTest.java
@@ -0,0 +1,521 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2010 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.DirSet;
+import org.apache.tools.ant.types.Path;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.HashMap;
+
+import static org.junit.Assert.assertTrue;
+
+public class IgnoreTrivialFunctionalTest extends AbstractCoberturaTestCase {
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+	TestUtils testUtil = new TestUtils();
+	Node dom;
+	IgnoreUtil ignoreUtil;
+
+	@Test
+	public void ignoreTrivialTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a Main.java source file that
+		 * has trivial methods such as .
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File reportDir = new File(tempDir, "report");
+		File instrumentDir = new File(tempDir, "instrument");
+		instrumentDir.mkdirs();
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File interfaceSourceFile = new File(srcDir,
+				"mypackage/MyInterface.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		FileUtils.write(interfaceSourceFile, "\n package mypackage;" + "\n "
+				+ "\n public interface MyInterface {"
+				+ "\n 	public void myInterfaceMethod();" + "\n }");
+
+		FileUtils
+				.write(
+						mainSourceFile,
+						"\n package mypackage;"
+								+ "\n "
+								+ "\n public class Main extends Thread {"
+								+ "\n 			"
+								+ "\n 	public static class MyObject implements MyInterface"
+								+ "\n 	{"
+								+ "\n 		public void myInterfaceMethod()"
+								+ "\n 		{"
+								+ "\n 		}"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	public static void main(String[] args) {"
+								+ "\n 		Main main = new Main();"
+								+ "\n 			"
+								+ "\n 		/*"
+								+ "\n 		 * Call all methods so they will be considered \"covered\" unless"
+								+ "\n 		 * they are ignored as trivial."
+								+ "\n 		 *"
+								+ "\n 		 * These are in no particular order."
+								+ "\n 		 */"
+								+ "\n 		main.getterTrivial();"
+								+ "\n 		main.empty();"
+								+ "\n 		main.getVoid();"
+								+ "\n 		main.getIntWithIntParm(0);"
+								+ "\n 		main.isBool();"
+								+ "\n 		main.hasBool();"
+								+ "\n 		main.set();"
+								+ "\n 		main.setInt(1);"
+								+ "\n 		main.setIntWithTwoParms(1, 2);"
+								+ "\n 		main.getMultiDimArray();"
+								+ "\n 		main.setIncrement(1);"
+								+ "\n 		main.setConst(\"\");"
+								+ "\n 		main.getArray();"
+								+ "\n 		main.getObject();"
+								+ "\n 		main.getStatic();"
+								+ "\n 		main.setStatic(1);"
+								+ "\n 		main.setISTORE(1);"
+								+ "\n 		main.setLSTORE(1);"
+								+ "\n 		main.setFSTORE((float)1.0);"
+								+ "\n 		main.setDSTORE(1.0);"
+								+ "\n 		main.setASTORE(null);"
+								+ "\n 		main.getINVOKEVIRTUAL();"
+								+ "\n 		main.getINVOKESPECIAL();"
+								+ "\n 		main.getINVOKESTATIC();"
+								+ "\n 		main.setINVOKEINTERFACE(new MyObject());"
+								+ "\n 			"
+								+ "\n 		// call constructors in no particular order"
+								+ "\n 		new Main(1);"
+								+ "\n 		new Main(true);"
+								+ "\n 		new Main(\"str\");"
+								+ "\n 		new Main(\"\", \"\");"
+								+ "\n 		new Main(\"\", 0);"
+								+ "\n 		new Main(\"\", true);"
+								+ "\n 		new Main((Thread) null, \"string\");"
+								+ "\n 		new Main((Thread) null, 0);"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// Be careful when initializing members.  If you instantiate an"
+								+ "\n 	// object, then trivial constructors will become non-trivial."
+								+ "\n 	// Ex. Integer myInteger = new Integer(1); will cause Main() to be non-trivial."
+								+ "\n 	int myint;"
+								+ "\n 	boolean mybool;"
+								+ "\n 	private static int mystatic;"
+								+ "\n 			"
+								+ "\n 	// trivial constructor"
+								+ "\n 	public Main() {"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	// constructors that just call super() are trivial"
+								+ "\n 	public Main(Thread t, String str)"
+								+ "\n 	{"
+								+ "\n 		super(str);"
+								+ "\n 	}"
+								+ "\n 			"
+								+ "\n 	// constructors that just call super() are usually trivial, but"
+								+ "\n 	// this constructor uses a constant, so it is considered non-trivial."
+								+ "\n 	public Main(Thread t, int i)"
+								+ "\n 	{"
+								+ "\n 		super(\"string\");"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public Main(boolean bool) {"
+								+ "\n 		// non-trivial conditional"
+								+ "\n 		myint = bool ? 0 : 1;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public Main(int num) {"
+								+ "\n 		// non-trivial switch"
+								+ "\n 		switch(num) {"
+								+ "\n 			default:"
+								+ "\n 		}"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public Main(String str) {"
+								+ "\n 		// setting of statics is non-trivial"
+								+ "\n 		mystatic = 2;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public Main(String str1, String str2)"
+								+ "\n 	{"
+								+ "\n 		// non-trivial method call"
+								+ "\n 		privateMethod();"
+								+ "\n 	}"
+								+ "\n 			"
+								+ "\n 	public Main(String str1, int i)"
+								+ "\n 	{"
+								+ "\n 		// non-trivial object construction"
+								+ "\n 		new StringBuffer();"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public Main(String str1, boolean bool)"
+								+ "\n 	{"
+								+ "\n 		// non-trivial this() call"
+								+ "\n 		this(str1, 0);"
+								+ "\n 	}"
+								+ "\n 	"
+								+ "\n "
+								+ "\n 	// trivial getter"
+								+ "\n 	public int getterTrivial() {"
+								+ "\n 		return myint;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	// trivial getter"
+								+ "\n 	public boolean isBool() {"
+								+ "\n 		return mybool;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	// trivial getter"
+								+ "\n 	public boolean hasBool() {"
+								+ "\n 		return mybool;"
+								+ "\n 	}"
+								+ "\n 			"
+								+ "\n 	// trivial setter"
+								+ "\n 	public void setInt(int i) {"
+								+ "\n 		myint = i;"
+								+ "\n 	}"
+								+ "\n 			"
+								+ "\n 	// this would be trivial, but it is a getter that with no return value"
+								+ "\n 	public void getVoid() {"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	// \"empty\" does not start with \"get\", \"is\", \"has\", or \"set\", so"
+								+ "\n 	// it is considered non-trivial."
+								+ "\n 	private int empty() {"
+								+ "\n 		return 0;"
+								+ "\n 	}"
+								+ "\n 			"
+								+ "\n 	// this is a getter that takes a parameter, so it is non-trivial."
+								+ "\n 	public int getIntWithIntParm(int i) {"
+								+ "\n 		return 0;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	// this would be a trivial setter, but it does not have a parameter."
+								+ "\n 	public void set() {"
+								+ "\n 	}"
+								+ "\n 			"
+								+ "\n 	// this would be a trivial setter, but it has more than one parameter."
+								+ "\n 	public void setIntWithTwoParms(int i, int j) {"
+								+ "\n 		myint = i;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	public int[][] getMultiDimArray() {"
+								+ "\n 		// non-trivial construction of a multi-dimensional array"
+								+ "\n 		return new int[1][1];"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public void setIncrement(int i) {"
+								+ "\n 		// non-trivial increment of local variable"
+								+ "\n 		i++;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public void setConst(String str) {"
+								+ "\n 		/*"
+								+ "\n 		 * cause visitLdcInsn to be called because \"str\" is in the"
+								+ "\n 		 * runtime constant pool.  An LDC operation is performed"
+								+ "\n 		 * which is considered non-trivial."
+								+ "\n 		 */"
+								+ "\n 		System.out.println(\"str\");"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public int[] getArray() {"
+								+ "\n 		// causes visitIntInsn to be called.  Creating an array is a \"single int operand\"."
+								+ "\n 		// non-trivial."
+								+ "\n 		return new int[1];"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public Object getObject() {"
+								+ "\n 		// causes visitTypeInsn to be called.  Creating an object is a type instruction."
+								+ "\n 		// non-trivial."
+								+ "\n 		return new Object();"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public int getStatic() {"
+								+ "\n 		// getting a static is non-trivial."
+								+ "\n 		return mystatic;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	public void setStatic(int i) {"
+								+ "\n 		// setting a static is non-trivial."
+								+ "\n 		mystatic = i;"
+								+ "\n 	}"
+								+ "\n 		"
+								+ "\n 	// non-trivial local variable instruction (causes visitVarInsn(ISTORE)) (int store to local var)"
+								+ "\n 	public void setISTORE(int i) {"
+								+ "\n 		i = 0;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// non-trivial local variable instruction (causes visitVarInsn(LSTORE)) (long store to local var)"
+								+ "\n 	public void setLSTORE(long l) {"
+								+ "\n 		l = 0;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// non-trivial local variable instruction (causes visitVarInsn(FSTORE)) (floating store to local var)"
+								+ "\n 	public void setFSTORE(float f) {"
+								+ "\n 		f = 0;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// non-trivial local variable instruction (causes visitVarInsn(DSTORE)) (double store to local var)"
+								+ "\n 	public void setDSTORE(double d) {"
+								+ "\n 		d = 0;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// non-trivial local variable instruction (causes visitVarInsn(ASTORE)) (object store to local var)"
+								+ "\n 	public void setASTORE(Object obj) {"
+								+ "\n 		obj = null;"
+								+ "\n 	}"
+								+ "\n 			"
+								+ "\n 	public void publicMethod() {"
+								+ "\n 	}"
+								+ "\n 	private void privateMethod() {"
+								+ "\n 	}"
+								+ "\n 	public static void staticMethod() {"
+								+ "\n 	}"
+								+ "\n 	"
+								+ "\n 	// non-trivial public method call (causes visitMethodInsn(INVOKEVIRTUAL))"
+								+ "\n 	public int getINVOKEVIRTUAL() {"
+								+ "\n 		publicMethod();"
+								+ "\n 		return 0;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// non-trivial private method call (causes visitMethodInsn(INVOKESPECIAL)) "
+								+ "\n 	public int getINVOKESPECIAL() {"
+								+ "\n 		privateMethod();"
+								+ "\n 		return 0;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// non-trivial static method call (causes visitMethodInsn(INVOKESTATIC)) "
+								+ "\n 	public int getINVOKESTATIC() {"
+								+ "\n 		staticMethod();"
+								+ "\n 		return 0;"
+								+ "\n 	}"
+								+ "\n "
+								+ "\n 	// non-trivial interface method call (causes visitMethodInsn(INVOKEINTERFACE))"
+								+ "\n 	public void setINVOKEINTERFACE(MyInterface obj) {"
+								+ "\n 		obj.myInterfaceMethod();" + "\n 	}"
+								+ "\n }");
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir,
+				new HashMap() {
+					{
+						put("ignoretrivial", true);
+					}
+				});
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Path classpath = new Path(TestUtils.project);
+		DirSet dirSetInstrumentDir = new DirSet();
+		DirSet dirSetSrcDir = new DirSet();
+		dirSetInstrumentDir.setDir(instrumentDir);
+		dirSetSrcDir.setDir(srcDir);
+		classpath.addDirset(dirSetInstrumentDir);
+		classpath.addDirset(dirSetSrcDir);
+		classpath.addDirset(TestUtils.getCoberturaClassDirSet());
+		// This is needed to fix issue #213
+		classpath.add(TestUtils.createDependencyPath("org.slf4j", "slf4j-api", "1.7.5"));
+
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(classpath);
+		java.execute();
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		ignoreUtil = new IgnoreUtil("mypackage.Main", dom);
+
+		// trivial empty constructor
+		assertIgnored("<init>", "()V");
+
+		// trivial constructor Main(Thread, String) that just calls super()
+		assertIgnored("<init>", "(Ljava/lang/Thread;Ljava/lang/String;)V");
+
+		// trivial getter
+		assertIgnored("getterTrivial");
+
+		// isBool is trivial
+		assertIgnored("isBool");
+
+		// hasBool is trivial
+		assertIgnored("hasBool");
+
+		// setInt is trivial
+		assertIgnored("setInt");
+
+		// Main(int) has non-trivial switch
+		assertNotIgnored("<init>", "(I)V");
+
+		// Main(boolean) has non-trivial conditional
+		assertNotIgnored("<init>", "(Z)V");
+
+		// "empty" does not start with "get", "is", "has", or "set".
+		assertNotIgnored("empty");
+
+		// gets with no return are considered non-trivial
+		assertNotIgnored("getVoid");
+
+		// gets that have parameters are considered non-trivial
+		assertNotIgnored("getIntWithIntParm");
+
+		// sets that have no parameters are considered non-trivial
+		assertNotIgnored("set");
+
+		// sets that have more than one parameters are considered non-trivial
+		assertNotIgnored("setIntWithTwoParms");
+
+		// don't ignore methods with multi-dimensional array creates
+		assertNotIgnored("getMultiDimArray");
+
+		// don't ignore methods with increment instructions for local variables
+		assertNotIgnored("setIncrement");
+
+		// don't ignore methods with LDC instructions (that use constants from the runtime pool)
+		assertNotIgnored("setConst");
+		assertNotIgnored("<init>", "(Ljava/lang/Thread;I)V"); // Main(Thread, int)
+
+		// don't ignore methods with a single int operand (like creating an array).
+		assertNotIgnored("getArray");
+
+		// don't ignore methods with type instructions (like creating an object).
+		assertNotIgnored("getObject");
+
+		// don't ignore methods that use statics.
+		assertNotIgnored("getStatic");
+		assertNotIgnored("setStatic");
+		assertNotIgnored("<init>", "(Ljava/lang/String;)V");
+
+		// non-trivial local variable instructions (causes visitVarInsn call)
+		assertNotIgnored("setISTORE");
+		assertNotIgnored("setLSTORE");
+		assertNotIgnored("setFSTORE");
+		assertNotIgnored("setDSTORE");
+		assertNotIgnored("setASTORE");
+
+		// non-trivial method calls
+		assertNotIgnored("getINVOKEVIRTUAL");
+		assertNotIgnored("getINVOKESPECIAL");
+		assertNotIgnored("getINVOKESTATIC");
+		assertNotIgnored("setINVOKEINTERFACE");
+		assertNotIgnored("<init>", "(Ljava/lang/String;Ljava/lang/String;)V"); // Main(String, String)
+		assertNotIgnored("<init>", "(Ljava/lang/String;I)V"); // Main(String, int)
+		assertNotIgnored("<init>", "(Ljava/lang/String;Z)V"); // Main(String, boolean)
+
+		/*
+		 * Now create a cobertura html report and make sure the files are created.
+		 */
+		reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("html");
+		reportTask.setDestDir(reportDir);
+		reportTask.setSrcDir(srcDir.getAbsolutePath());
+		reportTask.execute();
+
+		assertTrue(new File(reportDir, "index.html").exists());
+		assertTrue(new File(reportDir, "mypackage.Main.html").exists());
+		assertTrue(new File(reportDir, "mypackage.MyInterface.html").exists());
+
+		File frameSummaryFile = new File(reportDir, "frame-summary.html");
+		assertTrue(frameSummaryFile.exists());
+
+		TestUtils.checkFrameSummaryHtmlFile(frameSummaryFile);
+	}
+
+	public void assertIgnored(String methodName, String signature) {
+		ignoreUtil.assertIgnored(methodName, signature);
+	}
+
+	public void assertIgnored(String methodName) {
+		assertIgnored(methodName, null);
+	}
+
+	public void assertNotIgnored(String methodName, String signature) {
+		ignoreUtil.assertNotIgnored(methodName, signature);
+	}
+
+	public void assertNotIgnored(String methodName) {
+		assertNotIgnored(methodName, null);
+	}
+}
diff --git a/src/net/sourceforge/cobertura/ant/Regex.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreUtil.java
similarity index 68%
rename from src/net/sourceforge/cobertura/ant/Regex.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreUtil.java
index 1128487..925cae4 100644
--- a/src/net/sourceforge/cobertura/ant/Regex.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/IgnoreUtil.java
@@ -1,91 +1,91 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class Regex
-{
-
-	String pattern;
-	String lineRate;
-	String branchRate;
-
-	public void setPattern(String pattern)
-	{
-		this.pattern = pattern;
-	}
-
-	public void setBranchRate(String branchRate)
-	{
-		this.branchRate = branchRate;
-	}
-
-	public void setLineRate(String lineRate)
-	{
-		this.lineRate = lineRate;
-	}
-
-	public String toString()
-	{
-		StringBuffer sb = new StringBuffer();
-		sb.append(pattern);
-		sb.append(':');
-		sb.append(lineRate);
-		sb.append(':');
-		sb.append(branchRate);
-		return sb.toString();
-	}
-}
\ No newline at end of file
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2010 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test;
+
+import groovy.util.Node;
+import net.sourceforge.cobertura.test.util.TestUtils;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class IgnoreUtil {
+	String className;
+	Node dom;
+	public IgnoreUtil(String classname, Node dom) {
+		this.className = classname;
+		this.dom = dom;
+	}
+
+	public void assertIgnored(String methodName, String signature) {
+		List<Node> lines = TestUtils.getLineCounts(dom, className, methodName,
+				signature);
+		String methodDesc = methodName
+				+ (signature != null ? "(" + signature + ")" : "");
+		assertEquals(methodDesc + " not ignored", 0, lines.size());
+	}
+
+	public void assertNotIgnored(String methodName, String signature) {
+		List<Node> lines = TestUtils.getLineCounts(dom, className, methodName,
+				signature);
+		String methodDesc = methodName
+				+ (signature != null ? "(" + signature + ")" : "");
+		assertTrue(methodDesc + " should not be ignored", lines.size() > 0);
+		assertTrue(methodDesc + " should not be ignored", Integer
+				.valueOf((String) lines.get(0).attribute("hits")) > 0);
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/LargeFileTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/LargeFileTest.java
new file mode 100644
index 0000000..cd5917a
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/LargeFileTest.java
@@ -0,0 +1,208 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2011 Piotr Tabor
+ * Copyright (C) 2011 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class LargeFileTest {
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+	Node dom;
+
+	@Test
+	public void largeFileTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a Main.java source file that
+		 * has trivial methods such as .
+		 */
+		File tempDir = TestUtils.getTempDir();
+		FileUtils.deleteDirectory(tempDir);
+
+		File srcDir = new File(tempDir, "src");
+		File reportDir = new File(tempDir, "report");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		StringBuilder content = new StringBuilder();
+		for (int i = 0; i < 500; i++) {
+			content.append("if (i < 1000) {i++;};\n");
+		}
+
+		FileUtils.write(mainSourceFile, "\n package mypackage;" + "\n "
+				+ "\n public class Main extends Thread {"
+				+ "\n public static void method1(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method2(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method3(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method4(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method5(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method6(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method7(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method8(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n public static void method9(){int i =0; "
+				+ content.toString()
+				+ " };"
+				+ "\n 		"
+				+ "\n public static void main(String[] args) {"
+				+ "\n method1();"
+				+ "\n method2();"
+				+ "\n method3();"
+				+ "\n method4();"
+				+ "\n method5();"
+				+ "\n method6();"
+				+ "\n method7();"
+				+ "\n method8();"
+				+ "\n method9();"
+				+ "\n 	}"
+				+ "\n }");
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir,
+				new HashMap() {
+					{
+						put("ignoretrivial", true);
+					}
+				});
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(TestUtils.getCoberturaDefaultClasspath());
+		java.execute();
+
+		/* Now create a cobertura html report and make sure the files are created.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("html");
+		reportTask.setDestDir(reportDir);
+		reportTask.setSrcDir(srcDir.getAbsolutePath());
+		reportTask.execute();
+
+		assertTrue(new File(reportDir, "index.html").exists());
+		assertTrue(new File(reportDir, "mypackage.Main.html").exists());
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		//look for the last method - method9
+		List<Node> lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"method9");
+
+		// take lines greater than 4500 - any big number will do
+		boolean found = false;
+		for (Node node : lines) {
+			if (Integer.valueOf((String) node.attribute("number")) > 4500
+					&& Integer.valueOf((String) node.attribute("number")) < 4513) {
+				assertEquals("50% (1/2)", (String) node
+						.attribute("condition-coverage"));
+				found = true;
+			}
+		}
+
+		assertTrue("Did not find line number larger than 4500.", found);
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/PerformanceTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/PerformanceTest.java
new file mode 100644
index 0000000..7299baf
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/PerformanceTest.java
@@ -0,0 +1,198 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2010 Piotr Tabor
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test;
+
+import groovy.util.AntBuilder;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.DirSet;
+import org.apache.tools.ant.types.Path;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.HashMap;
+
+public class PerformanceTest {
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+
+	@Test
+	public void performanceTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a Main.java source file that
+		 * has trivial methods such as .
+		 */
+		File tempDir = TestUtils.getTempDir();
+
+		FileUtils.deleteDirectory(tempDir);
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		FileUtils
+				.write(
+						mainSourceFile,
+						"\n package mypackage;"
+								+ "\n "
+								+ "\n public class Main extends Thread {"
+								+ "\n 	public static void main(String[] args) {"
+								+ "\n 		long start = System.nanoTime();"
+								+ "\n 		int j = 0;"
+								+ "\n 		for (int i = 0; i < 100000; i++) {"
+								+ "\n 		   if (i % 2 == 0) { j+=2; };"
+								+ "\n 		   switch (i % 4) {"
+								+ "\n 		      case 0 : "
+								+ "\n 		      case 1 : j++;"
+								+ "\n 		      case 2 : j+=2;"
+								+ "\n 		      default: j+=3;"
+								+ "\n 		   } "
+								+ "\n 		}"
+								+ "\n 		long stop = System.nanoTime();"
+								+ "\n 		System.out.println(\"Test took:\" + (stop - start)/100000.0 + \" milis\");"
+								+ "\n 	}" + "\n }");
+
+		TestUtils.compileSource(ant, srcDir);
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		System.out.println("Run without instrumentation:\n");
+		Path classpath = new Path(TestUtils.project);
+		DirSet dirSetSrcDir = new DirSet();
+		dirSetSrcDir.setDir(srcDir);
+		classpath.addDirset(dirSetSrcDir);
+
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(classpath);
+		java.setOutput(new File(tempDir, "PT_uninstrumented.log"));
+		java.execute();
+
+		System.out.println(FileUtils.readFileToString(new File(tempDir,
+				"PT_uninstrumented.log")));
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+
+		System.out
+				.println("Run with instrumentation (not threadsafe-rigorous):\n");
+
+		classpath = new Path(TestUtils.project);
+		DirSet dirSetInstrumentDir = new DirSet();
+		dirSetSrcDir = new DirSet();
+		dirSetInstrumentDir.setDir(instrumentDir);
+		dirSetSrcDir.setDir(srcDir);
+		classpath.addDirset(dirSetInstrumentDir);
+		classpath.addDirset(dirSetSrcDir);
+		classpath.addDirset(TestUtils.getCoberturaClassDirSet());
+		// This is needed to fix issue #213
+		classpath.add(TestUtils.createDependencyPath("org.slf4j", "slf4j-api", "1.7.5"));
+
+		java = new Java();
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(classpath);
+		java.setProject(TestUtils.project);
+		java.setOutput(new File(tempDir, "PT_instrumentedNonThreadSafe.log"));
+		java.execute();
+
+		System.out.println(FileUtils.readFileToString(
+				new File(tempDir, "PT_instrumentedNonThreadSafe.log"))
+				.toString());
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir,
+				new HashMap() {
+					{
+						put("threadsafeRigorous", true);
+					}
+				});
+
+		System.out.println("Run with instrumentation (threadsafe-rigorous):\n");
+
+		java = new Java();
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(classpath);
+		java.setProject(TestUtils.project);
+		java.setOutput(new File(tempDir, "PT_instrumentedThreadSafe.log"));
+		java.execute();
+		System.out.println(FileUtils.readFileToString(new File(tempDir,
+				"PT_instrumentedThreadSafe.log")));
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+	}
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/SwitchFunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/SwitchFunctionalTest.java
new file mode 100644
index 0000000..fae2bfb
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/SwitchFunctionalTest.java
@@ -0,0 +1,536 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2010 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Java;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class SwitchFunctionalTest extends AbstractCoberturaTestCase {
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+
+	@Test
+	public void noDefaultTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a Main.java source file that
+		 * has a switch statement with no default.
+		 */
+		mainSourceFile.getParentFile().mkdirs();
+
+		/*
+		 * Note that if the code below is changed, the line numbers in the
+		 * asserts at the bottom of this method will likely need to be adjusted.
+		 */
+		FileUtils
+				.write(
+						mainSourceFile,
+						"\n package mypackage;"
+								+ "\n "
+								+ "\n public class Main {"
+								+ "\n   public void callNoDefaultSwitch() {"
+								+ "\n    int i=2;"
+								+ "\n    switch (i) {"
+								+ "\n     case 1:"
+								+ "\n      System.out.println(\"1\");"
+								+ "\n      break;"
+								+ "\n     case 2:"
+								+ "\n      System.out.println(\"2\");"
+								+ "\n     break;"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchFallThrough() {"
+								+ "\n   switchFallThrough(5);"
+								+ "\n   switchFallThrough(1);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  private void switchFallThrough(int i) {"
+								+ "\n   switch (i) {"
+								+ "\n    case 2:"
+								+ "\n     System.out.println(\"2\");"
+								+ "\n     break;"
+								+ "\n    case 3:"
+								+ "\n     break;"
+								+ "\n    case 1: // fall-through!"
+								+ "\n    default:"
+								+ "\n     System.out.println(\"1 or default\");"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n     "
+								+ "\n  public void callSwitchWithDefault() {"
+								+ "\n   switchWithDefault(15);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  private void switchWithDefault(int i) {"
+								+ "\n   switch (i) {"
+								+ "\n    case 15:"
+								+ "\n     System.out.println(\"1\");"
+								+ "\n     break;"
+								+ "\n    case 16:"
+								+ "\n     System.out.println(\"2\");"
+								+ "\n     break;"
+								+ "\n    case 17:"
+								+ "\n     System.out.println(\"3\");"
+								+ "\n     break;"
+								+ "\n    case 18:"
+								+ "\n     System.out.println(\"4\");"
+								+ "\n     break;"
+								+ "\n     // intentionally skip 19 and 20"
+								+ "\n    case 21:"
+								+ "\n     System.out.println(\"5\");"
+								+ "\n     break;"
+								+ "\n    /*"
+								+ "\n     * The compiler will add cases for any numbers that are skipped."
+								+ "\n     * Note the next two cases are commented out, but the compiler"
+								+ "\n     * adds them to the default case."
+								+ "\n     */"
+								+ "\n    //case 19:"
+								+ "\n    //case 20:"
+								+ "\n    default:"
+								+ "\n     System.out.println(\"default\");"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchWithoutGaps() {"
+								+ "\n   switchWithoutGaps(1);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  private void switchWithoutGaps(int i) {"
+								+ "\n   boolean aBoolean = false;"
+								+ "\n "
+								+ "\n   switch (i) {                   // tests assume this is line 76"
+								+ "\n    // these cases have no gaps - the numbers are sequential"
+								+ "\n    case 0:"
+								+ "\n     System.out.println(\"0\");"
+								+ "\n     break;"
+								+ "\n    case 1:"
+								+ "\n     System.out.println(\"1\");"
+								+ "\n     break;"
+								+ "\n    case 2:"
+								+ "\n     System.out.println(\"2\");"
+								+ "\n     break;"
+								+ "\n    default:"
+								+ "\n     System.out.println(\"default\");"
+								+ "\n     break;"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchWithoutGapsWithFallThrough() {"
+								+ "\n   switchWithoutGapsWithFallThrough(1);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  private void switchWithoutGapsWithFallThrough(int i) {"
+								+ "\n   boolean aBoolean = false;"
+								+ "\n "
+								+ "\n   switch (i) {                   // tests assume this is line 100"
+								+ "\n   // these cases have no gaps - the numbers are sequential"
+								+ "\n    case 0:"
+								+ "\n     System.out.println(\"0\");"
+								+ "\n     break;"
+								+ "\n    case 1:"
+								+ "\n     if (aBoolean) {"
+								+ "\n      System.out.println(\"1\");"
+								+ "\n      // the break is intentionally put inside this block to cause a fall-through"
+								+ "\n      break;"
+								+ "\n     }"
+								+ "\n    case 2:"
+								+ "\n     System.out.println(\"2\");"
+								+ "\n     break;"
+								+ "\n    default:"
+								+ "\n     System.out.println(\"default\");"
+								+ "\n     break;"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public enum AnEnumeration {"
+								+ "\n   FOO, BAR, GONK"
+								+ "\n  };"
+								+ "\n "
+								+ "\n  public void callSwitchBug2075537() {"
+								+ "\n   switchBug2075537(AnEnumeration.FOO);"
+								+ "\n   switchBug2075537(AnEnumeration.BAR);"
+								+ "\n   switchBug2075537(AnEnumeration.GONK);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public boolean switchBug2075537(AnEnumeration e) {"
+								+ "\n   // see bug http://sourceforge.net/tracker/?func=detail&aid=2075537&group_id=130558&atid=720015"
+								+ "\n   switch (e) {                     // tests assume this is line 132"
+								+ "\n    case FOO:"
+								+ "\n    case BAR:"
+								+ "\n    case GONK:"
+								+ "\n     return true;"
+								+ "\n "
+								+ "\n    default:"
+								+ "\n     return false;"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchBug2075537_2() {"
+								+ "\n   switchBug2075537_2(AnEnumeration.FOO);"
+								+ "\n   switchBug2075537_2(AnEnumeration.BAR);"
+								+ "\n   switchBug2075537_2(AnEnumeration.GONK);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public boolean switchBug2075537_2(AnEnumeration e) {"
+								+ "\n   switch (e) {                     // tests assume this is line 150"
+								+ "\n    case FOO:"
+								+ "\n     return true;"
+								+ "\n "
+								+ "\n    case BAR:"
+								+ "\n     return true;"
+								+ "\n "
+								+ "\n    case GONK:"
+								+ "\n     return true;"
+								+ "\n "
+								+ "\n    default:"
+								+ "\n     return false;"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchNonDefaultFallThrough() {"
+								+ "\n   switchNonDefaultFallThrough(AnEnumeration.FOO);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public boolean switchNonDefaultFallThrough(AnEnumeration e) {"
+								+ "\n   switch (e) {                     // tests assume this is line 170"
+								+ "\n    case FOO:"
+								+ "\n     System.out.println(\"FOO\");"
+								+ "\n "
+								+ "\n    case BAR:"
+								+ "\n     System.out.println(\"BAR\");"
+								+ "\n     return true;"
+								+ "\n "
+								+ "\n    case GONK:"
+								+ "\n     return true;"
+								+ "\n "
+								+ "\n    default:"
+								+ "\n     return false;"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchWithBoolean() {"
+								+ "\n   switchWithBoolean(1, false);"
+								+ "\n   switchWithBoolean(3, false);"
+								+ "\n   switchWithBoolean(7, true);"
+								+ "\n   switchWithBoolean(7, false);"
+								+ "\n   switchWithBoolean(8, true);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void switchWithBoolean(int type, boolean aBoolean) {"
+								+ "\n   switch (type) {                     // tests assume this is line 195"
+								+ "\n    case 9:{"
+								+ "\n     System.out.println(\"9\");"
+								+ "\n     break;"
+								+ "\n    }"
+								+ "\n    case 1:{"
+								+ "\n     try {"
+								+ "\n      System.out.println(\"1\");"
+								+ "\n     } catch (Exception e) {}"
+								+ "\n     break;                     // tests assume this is line 204"
+								+ "\n    }"
+								+ "\n    case 5:{"
+								+ "\n     System.out.println(\"5\");"
+								+ "\n     break;"
+								+ "\n    }"
+								+ "\n    case 4:{"
+								+ "\n     System.out.println(\"4\");"
+								+ "\n     break;"
+								+ "\n    }"
+								+ "\n    case 3:{"
+								+ "\n     System.out.println(\"3\");"
+								+ "\n     break;"
+								+ "\n    }"
+								+ "\n    case 7:{"
+								+ "\n     if (aBoolean) {"
+								+ "\n      System.out.println(\"7\");"
+								+ "\n      break;"
+								+ "\n     }"
+								+ "\n     // if aBoolean == false, this will fall through to the next case."
+								+ "\n    }"
+								+ "\n    case 8:{"
+								+ "\n     if (aBoolean) {"
+								+ "\n      System.out.println(\"8\");"
+								+ "\n      break;"
+								+ "\n     }"
+								+ "\n    }"
+								+ "\n   }"
+								+ "\n  }"
+								+ "\n "
+								+ "\n enum ABCDEnum { A,B,C,D;};"
+								+ "\n "
+								+ "\n  public void switchWithEnum(ABCDEnum value) {"
+								+ "\n   switch (value) {			// tests assume this is line 237"
+								+ "\n    case B: "
+								+ "\n     System.out.println(\"B\");"
+								+ "\n     break;"
+								+ "\n    case C:"
+								+ "\n     System.out.println(\"C\");"
+								+ "\n    case A:"
+								+ "\n     System.out.println(\"A\");"
+								+ "\n     break;"
+								+ "\n    default:"
+								+ "\n     System.out.println(\"default\");"
+								+ "\n   }	"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void switchWithAllEnumValues(ABCDEnum value) {"
+								+ "\n   switch (value) {		// tests assume this is line 252"
+								+ "\n    case B: "
+								+ "\n     System.out.println(\"B\");"
+								+ "\n     break;"
+								+ "\n    case C:"
+								+ "\n     System.out.println(\"C\");"
+								+ "\n    case A:"
+								+ "\n     System.out.println(\"A\");"
+								+ "\n     break;"
+								+ "\n    case D:"
+								+ "\n     System.out.println(\"D\");"
+								+ "\n     break;"
+								+ "\n    default:"
+								+ "\n     // Not reachable, but compiler does not mark it as dead code."
+								+ "\n     System.out.println(\"default\");	// tests assume this is line 266"
+								+ "\n   }	"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void switchWithAllButDefaultEnumValues(ABCDEnum value) {"
+								+ "\n   switch (value) {			// tests assume this is line 271		"
+								+ "\n    case B: "
+								+ "\n     System.out.println(\"B\");"
+								+ "\n     break;"
+								+ "\n    case C:"
+								+ "\n     System.out.println(\"C\");"
+								+ "\n    case A:"
+								+ "\n     System.out.println(\"A\");"
+								+ "\n     break;"
+								+ "\n    case D:"
+								+ "\n     System.out.println(\"D\");"
+								+ "\n     break;"
+								+ "\n   }	"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchWithEnum() {"
+								+ "\n   switchWithEnum(ABCDEnum.B);"
+								+ "\n   switchWithEnum(ABCDEnum.C);"
+								+ "\n   switchWithEnum(ABCDEnum.D);"
+								+ "\n   switchWithEnum(ABCDEnum.B);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchWithAllEnumValues() {"
+								+ "\n   switchWithAllEnumValues(ABCDEnum.A);"
+								+ "\n   switchWithAllEnumValues(ABCDEnum.B);"
+								+ "\n   switchWithAllEnumValues(ABCDEnum.C);"
+								+ "\n   switchWithAllEnumValues(ABCDEnum.D);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n  public void callSwitchWithAllButDefaultEnumValues() {"
+								+ "\n   switchWithAllButDefaultEnumValues(ABCDEnum.A);"
+								+ "\n   switchWithAllButDefaultEnumValues(ABCDEnum.B);"
+								+ "\n   switchWithAllButDefaultEnumValues(ABCDEnum.C);"
+								+ "\n   switchWithAllButDefaultEnumValues(ABCDEnum.D);"
+								+ "\n  }"
+								+ "\n "
+								+ "\n "
+								+ "\n  public static void main(String[] args) {"
+								+ "\n   Main main = new Main();"
+								+ "\n   main.callNoDefaultSwitch();"
+								+ "\n   main.callSwitchFallThrough();"
+								+ "\n   main.callSwitchWithDefault();"
+								+ "\n   main.callSwitchWithoutGaps();"
+								+ "\n   main.callSwitchWithoutGapsWithFallThrough();"
+								+ "\n   main.callSwitchBug2075537();"
+								+ "\n   main.callSwitchBug2075537_2();"
+								+ "\n   main.callSwitchNonDefaultFallThrough();"
+								+ "\n   main.callSwitchWithBoolean();"
+								+ "\n   main.callSwitchWithEnum();"
+								+ "\n   main.callSwitchWithAllEnumValues();"
+								+ "\n   main.callSwitchWithAllButDefaultEnumValues();"
+								+ "\n  }	" + "\n }");
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+
+		/*
+		 * Kick off the Main (instrumented) class.
+		 */
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(TestUtils.getCoberturaDefaultClasspath());
+		java.execute();
+
+		/*
+		 * Now create a cobertura html report and make sure the files are created.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("html");
+		reportTask.setDestDir(reportDir);
+		reportTask.setSrcDir(srcDir.getAbsolutePath());
+		reportTask.execute();
+		assertTrue(new File(reportDir, "index.html").exists());
+		assertTrue(new File(reportDir, "mypackage.Main.html").exists());
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		Node dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		//switchWithBoolean
+		List<Node> lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchWithBoolean");
+
+		assertConditionCoverage(lines, "50% (4/8)", 195);
+
+		/*
+		 * A try catch just before a break statement used to cause Cobertura
+		 * to report the line with the break as uncovered.  Make sure
+		 * this no longer happens.
+		 */
+		// Unhapilly Java compiler is messing the code too much to support the case.			  
+		// def breakInSwitchWithBooleanLine = lines.grep {it.number == '204'}[0]
+		// assertEquals(1, breakInSwitchWithBooleanLine.hits)			
+
+		//switchNonDefaultFallThrough
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchNonDefaultFallThrough");
+
+		assertConditionCoverage(lines, "33% (1/3)", 170);
+
+		//switchBug2075537
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchBug2075537");
+
+		assertConditionCoverage(lines, "50% (1/2)", 132);
+
+		//switchBug2075537_2
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchBug2075537_2");
+
+		assertConditionCoverage(lines, "100% (3/3)", 150);
+
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchWithoutGaps");
+
+		assertConditionCoverage(lines, "25% (1/4)", 76);
+
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchWithoutGapsWithFallThrough");
+
+		assertConditionCoverage(lines, "25% (1/4)", 100);
+
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"callNoDefaultSwitch");
+
+		assertConditionCoverage(lines, "33% (1/3)", 7);
+
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchFallThrough");
+
+		assertConditionCoverage(lines, "33% (1/3)", 23);
+
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchWithDefault");
+
+		assertConditionCoverage(lines, "16% (1/6)", 40);
+
+		lines = TestUtils
+				.getLineCounts(dom, "mypackage.Main", "switchWithEnum");
+		assertConditionCoverage(lines, "75% (3/4)", 237);
+
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchWithAllEnumValues");
+		assertConditionCoverage(lines, "100% (4/4)", 252);
+
+		boolean found = false;
+		for (Node node : lines) {
+			if (Integer.valueOf((String) node.attribute("number")) == 266) {
+				found = true;
+				assertEquals((Integer) 0, Integer.valueOf((String) node
+						.attribute("hits")));
+			}
+		}
+
+		assertTrue("Failed to find node on line 266", found);
+
+		lines = TestUtils.getLineCounts(dom, "mypackage.Main",
+				"switchWithAllButDefaultEnumValues");
+		assertConditionCoverage(lines, "100% (4/4)", 271);
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/util/TestUtils.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/util/TestUtils.java
new file mode 100644
index 0000000..43ef53c
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/util/TestUtils.java
@@ -0,0 +1,725 @@
+package net.sourceforge.cobertura.test.util;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import groovy.util.XmlParser;
+import net.sourceforge.cobertura.ant.InstrumentTask;
+import net.sourceforge.cobertura.javancss.ccl.FileUtil;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Javac;
+import org.apache.tools.ant.taskdefs.Zip;
+import org.apache.tools.ant.taskdefs.optional.junit.FormatterElement;
+import org.apache.tools.ant.taskdefs.optional.junit.FormatterElement.TypeAttribute;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTask;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
+import org.apache.tools.ant.types.DirSet;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Path.PathElement;
+import org.codehaus.groovy.ant.Groovyc;
+import org.xml.sax.SAXException;
+
+import javax.tools.JavaCompiler;
+import javax.tools.ToolProvider;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.ConnectException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.util.*;
+
+import static org.junit.Assert.*;
+
+public class TestUtils {
+	private static final String SRC_DIR = "src/main/java";
+
+	static File coberturaClassDir;
+	public static final AntBuilder antBuilder = new AntBuilder();
+	public static final Project project = new Project();
+	public static final String SIMPLE_SOURCE_PATHNAME = "a/mypackage/SimpleSource.java";
+	public static final String SOURCE_TEXT = "\n package a.mypackage;" + "\n "
+			+ "\n public class SimpleSource {"
+			+ "\n 	public void aSimpleMethod() { " + "\n 	}" + "\n }";
+
+	static {
+		DefaultLogger consoleLogger = new DefaultLogger();
+		consoleLogger.setErrorPrintStream(System.err);
+		consoleLogger.setOutputPrintStream(System.out);
+		consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
+		project.addBuildListener(consoleLogger);
+	}
+
+	public synchronized static File getCoberturaClassDir() {
+		if (coberturaClassDir == null) {
+            // Should already be compiled
+            coberturaClassDir = new File("target/classes");
+		}
+
+		return coberturaClassDir;
+	}
+
+	public static DirSet getCoberturaClassDirSet() {
+		DirSet dirSet = new DirSet();
+		dirSet.setDir(getCoberturaClassDir());
+		return dirSet;
+	}
+
+	public static AntBuilder getCoberturaAntBuilder(File coberturaClassdir) {
+		Project project = new Project();
+		project.addTaskDefinition("groovyc",
+				org.codehaus.groovy.ant.Groovyc.class);
+		AntBuilder antBuilder = new AntBuilder(project);
+
+		return antBuilder;
+	}
+
+	public static File getTempDir() {
+		return new File("target/tmp", "cobertura");
+	}
+
+	public static Node getXMLReportDOM(File xmlReport)
+			throws ParserConfigurationException, SAXException, IOException {
+		return getXMLReportDOM(xmlReport.getAbsolutePath());
+	}
+
+	public static Node getXMLReportDOM(String xmlReport)
+			throws ParserConfigurationException, SAXException, IOException {
+		XmlParser parser = new XmlParser();
+		parser
+				.setFeature(
+						"http://apache.org/xml/features/nonvalidating/load-external-dtd",
+						false);
+		return parser.parse(xmlReport);
+	}
+
+	public static int getHitCount(Node dom, String className, String methodName) {
+		for (Iterator<Node> packagesIterator = dom.iterator(); packagesIterator
+				.hasNext();) {
+			Node packagesNode = packagesIterator.next();
+			if ("packages".equals(packagesNode.name())) {
+				for (Iterator<Node> packageIterator = packagesNode.iterator(); packageIterator.hasNext();) {
+					Node packageNode = packageIterator.next();
+					if ("package".equals(packageNode.name())) {
+						for (Iterator<Node> classesIterator = packageNode.iterator(); classesIterator.hasNext();) {
+							Node classesNode = classesIterator.next();
+							if ("classes".equals(classesNode.name())) {
+								for (Iterator<Node> classIterator = classesNode.iterator(); classIterator.hasNext();) {
+									Node classNode = classIterator.next();
+									if ("class".equals(classNode.name())) {
+										if (className.equals(classNode.attribute("name"))) {
+											for (Iterator<Node> methodsIterator = classNode.iterator(); methodsIterator.hasNext();) {
+												Node methodsNode = methodsIterator.next();
+												if ("methods".equals(methodsNode.name())) {
+													for (Iterator<Node> methodIterator = methodsNode.iterator(); methodIterator.hasNext();) {
+														Node methodNode = methodIterator.next();
+														if ("method".equals(methodNode.name())) {
+															if (methodName.equals(methodNode.attribute("name"))) {
+																for (Iterator<Node> linesIterator = methodNode.iterator(); linesIterator.hasNext();) {
+																	Node linesNode = linesIterator.next();
+																	if ("lines".equals(linesNode.name())) {
+																		for (Iterator<Node> lineIterator = linesNode.iterator(); lineIterator.hasNext();) {
+																			Node lineNode = lineIterator.next();
+																			if ("line".equals(lineNode.name())) {
+																				return Integer.valueOf((String) lineNode.attribute("hits"));
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return 0;
+	}
+
+	public static int getTotalHitCount(Node dom, String className,
+			String methodName) {
+		int sum = 0;
+		for (Iterator<Node> packagesIterator = dom.iterator(); packagesIterator.hasNext();) {
+			Node packagesNode = packagesIterator.next();
+			if ("packages".equals(packagesNode.name())) {
+				for (Iterator<Node> packageIterator = packagesNode.iterator(); packageIterator.hasNext();) {
+					Node packageNode = packageIterator.next();
+					if ("package".equals(packageNode.name())) {
+						for (Iterator<Node> classesIterator = packageNode.iterator(); classesIterator.hasNext();) {
+							Node classesNode = classesIterator.next();
+							if ("classes".equals(classesNode.name())) {
+								for (Iterator<Node> classIterator = classesNode.iterator(); classIterator.hasNext();) {
+									Node classNode = classIterator.next();
+									if ("class".equals(classNode.name())) {
+										if (className.equals(classNode.attribute("name"))) {
+											for (Iterator<Node> methodsIterator = classNode.iterator(); methodsIterator.hasNext();) {
+												Node methodsNode = methodsIterator.next();
+												if ("methods".equals(methodsNode.name())) {
+													for (Iterator<Node> methodIterator = methodsNode.iterator(); methodIterator.hasNext();) {
+														Node methodNode = methodIterator.next();
+														if ("method".equals(methodNode.name())) {
+															if (methodName.equals(methodNode.attribute("name"))) {
+																for (Iterator<Node> linesIterator = methodNode.iterator(); linesIterator.hasNext();) {
+																	Node linesNode = linesIterator.next();
+																	if ("lines".equals(linesNode.name())) {
+																		for (Iterator<Node> lineIterator = linesNode.iterator(); lineIterator.hasNext();) {
+																			Node lineNode = lineIterator.next();
+																			if ("line".equals(lineNode.name())) {
+																				sum += Integer.valueOf((String) lineNode.attribute("hits"));
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return sum;
+	}
+
+    public static double getMethodBranchCoverage(Node dom, String className, String methodName) {
+        for (Iterator<Node> packagesIterator = dom.iterator(); packagesIterator.hasNext();) {
+            Node packagesNode = packagesIterator.next();
+            if ("packages".equals(packagesNode.name())) {
+                for (Iterator<Node> packageIterator = packagesNode.iterator(); packageIterator.hasNext();) {
+                    Node packageNode = packageIterator.next();
+                    if ("package".equals(packageNode.name())) {
+                        for (Iterator<Node> classesIterator = packageNode.iterator(); classesIterator.hasNext();) {
+                            Node classesNode = classesIterator.next();
+                            if ("classes".equals(classesNode.name())) {
+                                for (Iterator<Node> classIterator = classesNode.iterator(); classIterator.hasNext();) {
+                                    Node classNode = classIterator.next();
+                                    if ("class".equals(classNode.name())) {
+                                        if (className.equals(classNode.attribute("name"))) {
+                                            for (Iterator<Node> methodsIterator = classNode.iterator(); methodsIterator.hasNext();) {
+                                                Node methodsNode = methodsIterator.next();
+                                                if ("methods".equals(methodsNode.name())) {
+                                                    for (Iterator<Node> methodIterator = methodsNode.iterator(); methodIterator.hasNext();) {
+                                                        Node methodNode = methodIterator.next();
+                                                        if ("method".equals(methodNode.name())) {
+                                                            if (methodName.equals(methodNode.attribute("name"))) {
+                                                                return Double.valueOf((String)methodNode.attribute("branch-rate"));
+                                                            }
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        // Could not find branch
+        return 0;
+    }
+
+    //TODO: remove
+	public static void instrumentClasses(AntBuilder ant, File srcDir,
+			File datafile, File instrumentDir, Map arguments) {
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(srcDir);
+		fileSet.setIncludes("**/*.class");
+
+		InstrumentTask instrumentTask = new InstrumentTask();
+		instrumentTask.setProject(project);
+		instrumentTask.addFileset(fileSet);
+		instrumentTask.createIncludeClasses().setRegex("mypackage.*");
+		instrumentTask.setDataFile(datafile.getAbsolutePath());
+		instrumentTask.setToDir(instrumentDir);
+		instrumentTask.setThreadsafeRigorous(arguments != null
+				&& arguments.containsKey("threadsafeRigorous")
+				? (Boolean) arguments.get("threadsafeRigorous")
+				: false);
+		instrumentTask.setIgnoreTrivial(arguments != null
+				&& arguments.containsKey("ignoretrivial") ? (Boolean) arguments
+				.get("ignoretrivial") : false);
+
+		if (arguments != null && arguments.containsKey("ignoreAnnotationNames")) {
+			List<String> ignoreAnnotations = (List<String>) arguments
+				.get("ignoreAnnotationNames");
+			for (String annotation : ignoreAnnotations) {
+				instrumentTask.createIgnoreMethodAnnotation()
+						.setAnnotationName(annotation);
+			}
+		}
+
+		if (arguments != null
+				&& arguments.containsKey("excludeClassesRegexList")) {
+			instrumentTask.createExcludeClasses().setRegex(
+					(String) arguments.get("excludeClassesRegexList"));
+		}
+
+		instrumentTask.execute();
+	}
+
+	public static void compileSource(File srcDir, File destDir) {
+		compileSource(srcDir, destDir, "1.7");
+	}
+
+    public static void compileSource(File srcDir) {
+        compileSource(srcDir, srcDir);
+    }
+
+    //TODO: remove
+    public static void compileSource(AntBuilder builder, File srcDir) {
+        compileSource(srcDir);
+    }
+
+    //TODO: remove
+    public static void compileSource(AntBuilder builder, File srcDir,
+                                     String jdkVersion) {
+        compileSource(srcDir, srcDir, jdkVersion);
+    }
+
+	public static void compileSource(File srcDir, File destDir,
+			String jdkVersion) {
+
+        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+        Collection<File> files = FileUtils.listFiles(srcDir, new String[]{"java"}, true);
+
+        List jvmArguments = new LinkedList();
+
+        jvmArguments.add("-sourcepath");
+        jvmArguments.add(srcDir.getAbsolutePath());
+        jvmArguments.add("-g");
+        jvmArguments.add("-verbose");
+        jvmArguments.add("-d");
+        jvmArguments.add(srcDir.getAbsolutePath());
+        jvmArguments.add("-source");
+        jvmArguments.add(jdkVersion);
+        jvmArguments.add("-target");
+        jvmArguments.add(jdkVersion);
+
+        for (File file : files) {
+            jvmArguments.add(file.getAbsolutePath());
+        }
+
+        System.out.println("====== Compiling ======");
+        System.out.print("JDK VERSION: ");
+        compiler.run(System.in, System.out, System.err, "-version");
+
+        System.out.println("JVM ARGS: " + jvmArguments);
+
+        int result = compiler.run(System.in, System.out, System.err,
+                (String[]) jvmArguments.toArray(new String[jvmArguments.size()]));
+        if (result == 0) {
+            System.out.println("Successful Compilation.");
+        } else {
+            System.err.println("======= Failed to compile =======");
+        }
+	}
+
+	public static void compileGroovy(AntBuilder ant, File srcDir) {
+		Javac javac = new Javac();
+		javac.setDebug(true);
+
+		Groovyc groovyc = new Groovyc();
+		groovyc.setProject(project);
+		groovyc.setSrcdir(new Path(project, srcDir.getAbsolutePath()));
+		groovyc.setDestdir(srcDir);
+		groovyc.addConfiguredJavac(javac);
+		groovyc.execute();
+	}
+
+	public static List<Node> getLineCounts(Node dom, String className,
+			String methodName, String signature) {
+		List<Node> returnList = new ArrayList<Node>();
+
+		for (Iterator<Node> packagesIterator = dom.iterator(); packagesIterator
+				.hasNext();) {
+			Node packagesNode = packagesIterator.next();
+			if ("packages".equals(packagesNode.name())) {
+				for (Iterator<Node> packageIterator = packagesNode.iterator(); packageIterator
+						.hasNext();) {
+					Node packageNode = packageIterator.next();
+					if ("package".equals(packageNode.name())) {
+						for (Iterator<Node> classesIterator = packageNode
+								.iterator(); classesIterator.hasNext();) {
+							Node classesNode = classesIterator.next();
+							if ("classes".equals(classesNode.name())) {
+								for (Iterator<Node> classIterator = classesNode
+										.iterator(); classIterator.hasNext();) {
+									Node classNode = classIterator.next();
+									if ("class".equals(classNode.name())) {
+										if (className.equals(classNode
+												.attribute("name"))) {
+											for (Iterator<Node> methodsIterator = classNode
+													.iterator(); methodsIterator
+													.hasNext();) {
+												Node methodsNode = methodsIterator
+														.next();
+												if ("methods"
+														.equals(methodsNode
+																.name())) {
+													for (Iterator<Node> methodIterator = methodsNode
+															.iterator(); methodIterator
+															.hasNext();) {
+														Node methodNode = methodIterator
+																.next();
+														if ("method"
+																.equals(methodNode
+																		.name())) {
+															if (methodName
+																	.equals(methodNode
+																			.attribute("name"))) {
+																if (signature != null) {
+																	returnList
+																			.clear();
+																} // Keep clearing if signature isn't null
+																for (Iterator<Node> linesIterator = methodNode
+																		.iterator(); linesIterator
+																		.hasNext();) {
+																	Node linesNode = linesIterator
+																			.next();
+																	if ("lines"
+																			.equals(linesNode
+																					.name())) {
+																		for (Iterator<Node> lineIterator = linesNode
+																				.iterator(); lineIterator
+																				.hasNext();) {
+																			Node lineNode = lineIterator
+																					.next();
+																			if ("line"
+																					.equals(lineNode
+																							.name())) {
+																				returnList
+																						.add(lineNode);
+																			}
+																		}
+																	}
+																}
+																if (signature != null) {
+																	if (signature
+																			.equals(methodNode
+																					.attribute("signature"))) {
+																		return returnList;
+																	} else {
+																		returnList
+																				.clear();
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return returnList;
+	}
+
+	public static File createSourceArchive(File dir) throws IOException {
+		File sourceDir = new File(dir, SRC_DIR);
+		File sourceFile = new File(sourceDir, SIMPLE_SOURCE_PATHNAME);
+		sourceFile.getParentFile().mkdirs();
+
+		BufferedWriter bw = null;
+		try {
+			bw = new BufferedWriter(new FileWriter(sourceFile));
+			bw.write(SOURCE_TEXT);
+		} finally {
+			if (bw != null)
+				bw.close();
+		}
+
+		File zipDir = new File(dir, "zip");
+		zipDir.mkdirs();
+		File zipFile = new File(zipDir, "source.zip");
+
+		Zip zip = new Zip();
+		zip.setProject(project);
+		zip.setDestFile(zipFile);
+		zip.setBasedir(sourceDir);
+		zip.execute();
+
+		assertTrue(sourceFile.delete());
+
+		return zipFile;
+	}
+
+	public static void instrumentClasses(AntBuilder ant, File srcDir,
+			File datafile, File instrumentDir) {
+		instrumentClasses(ant, srcDir, datafile, instrumentDir, null);
+	}
+
+	public static void checkFrameSummaryHtmlFile(File frameSummaryFile)
+			throws Exception {
+		XmlParser parser = new XmlParser();
+		// the next line is to suppress loading the dtd
+		parser
+				.setFeature(
+						"http://apache.org/xml/features/nonvalidating/load-external-dtd",
+						false);
+
+		Node doc = parser.parse(frameSummaryFile);
+		List<Node> list = doc.depthFirst();
+		int totalClasses = 0;
+		int expectedTotalNumberOfClasses = 0;
+
+		for (Iterator<Node> tableIterator = list.iterator(); tableIterator
+				.hasNext();) {
+			Node tableNode = tableIterator.next();
+			if ("table".equals(tableNode.name())) {
+				if ("report".equals(tableNode.attribute("class"))) {
+					for (Iterator<Node> tbodyIterator = tableNode.iterator(); tbodyIterator
+							.hasNext();) {
+						Node tbodyNode = tbodyIterator.next();
+						if ("tbody".equals(tbodyNode.name())) {
+							for (Iterator<Node> trIterator = tbodyNode
+									.iterator(); trIterator.hasNext();) {
+								Node trNode = trIterator.next();
+								if ("tr".equals(trNode.name())) {
+									String tdClassString = "td[attributes={class=value}; value=[";
+									int tdClassLength = tdClassString.length();
+
+									String value = trNode.value().toString();
+									int tdClassFirstOccurance = value
+											.indexOf(tdClassString);
+
+									String tdClassStart = value
+											.substring(tdClassFirstOccurance);
+									int tdClassElement = Integer
+											.valueOf(tdClassStart
+													.substring(
+															tdClassString
+																	.length(),
+															tdClassStart
+																	.indexOf("]],")));
+									if (trNode.value().toString().contains(
+											"All Packages")) {
+										expectedTotalNumberOfClasses = tdClassElement;
+									} else {
+										totalClasses += tdClassElement;
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		assertFalse("All classes should not be 0.",
+				0 == expectedTotalNumberOfClasses);
+
+		assertEquals(
+				"Class count in All Packages of frame-summary.html does not match the sum of the package class counts",
+				expectedTotalNumberOfClasses, totalClasses);
+	}
+
+	public static Path getCoberturaDefaultClasspath() {
+		Path classpath = new Path(TestUtils.project);
+		DirSet dirSetInstrumentDir = new DirSet();
+		DirSet dirSetSrcDir = new DirSet();
+		dirSetInstrumentDir.setDir(new File(getTempDir(), "instrument"));
+		dirSetSrcDir.setDir(new File(getTempDir(), "src"));
+		classpath.addDirset(dirSetInstrumentDir);
+		classpath.addDirset(dirSetSrcDir);
+		classpath.addDirset(TestUtils.getCoberturaClassDirSet());
+		// This is needed to fix issue #213
+		classpath.add(createDependencyPath("org.slf4j", "slf4j-api", "1.7.5"));
+		return classpath;
+	}
+
+	/**
+	 * Create the path to a dependency in the current user's local Maven repository.
+	 * For this to work the local Maven repository must exist in the default location:
+	 * <code>${user.home}/.m2/repository</code>
+	 *
+	 * This is a hack, to get tests that build their own classpath using Ant-classes to work.
+	 * Ideally those tests should be rewritten into proper integration tests.
+	 *
+	 * @param groupId The groupId for the dependency
+	 * @param artifactId The artifactId for the dependency
+	 * @param version The version for the dependency
+	 * @return A Path to the dependency in the local Maven repository
+	 */
+	public static Path createDependencyPath(String groupId, String artifactId, String version) {
+		// Create a path to the current user's local Maven repository
+		String userHome = System.getProperty("user.home");
+		String localRepository = userHome + File.separator + ".m2" + File.separator + "repository";
+
+		// Create the path to a dependency within the local Maven repository
+		String dependencyPath = groupId.replace( ".", File.separator ) + File.separator
+			+ artifactId + File.separator + version + File.separator
+			+ artifactId + "-" + version + ".jar";
+
+		return new Path(TestUtils.project, localRepository + File.separator + dependencyPath);
+	}
+
+	/**
+	 * Run Ant's junit task.   Typical usage:
+	 * 
+	 * 			testUtil.junit(                         Types
+	 *				testClass     : 'mypackage.MyTest', String
+	 *				ant           : ant,                AntBuilder
+	 *				buildDir      : buildDir,           File
+	 *				instrumentDir : instrumentDir,      File
+	 *				reportDir     : reportDir,          File
+	 *			)
+	 *
+	 * 'ant' is the AntBuilder that is used.   Instrumented classes are in
+	 * instrumentDir; The remaining classes are in buildDir.
+	 * An XML report is created in reportDir.
+	 *
+	 * @param hashMap
+	 * @return
+	 * @throws Exception 
+	 */
+	public static void junit(HashMap hashMap) throws Exception {
+		Path classpath = new Path(project);
+		PathElement instDirPathElement = classpath.new PathElement();
+		PathElement buildDirPathElement = classpath.new PathElement();
+		PathElement coberturaClassDirPathElement = classpath.new PathElement();
+		PathElement computerClasspath = classpath.new PathElement();
+
+		FileSet fileSet = new FileSet();
+
+		instDirPathElement.setLocation((File) hashMap.get("instrumentDir"));
+		buildDirPathElement.setLocation((File) hashMap.get("buildDir"));
+		coberturaClassDirPathElement.setLocation(getCoberturaClassDir());
+		computerClasspath.setPath(System.getProperty("java.class.path"));
+
+		fileSet.setDir(new File("src/test/resources/antLibrary/common/groovy"));
+		fileSet.setIncludes("*.jar");
+
+		classpath.add(instDirPathElement);
+		classpath.add(buildDirPathElement);
+		classpath.add(coberturaClassDirPathElement);
+		classpath.add(computerClasspath);
+		classpath.addFileset(fileSet);
+
+		// Create junitTask
+		JUnitTask junit = new JUnitTask();
+		junit.setProject(project);
+		junit.setHaltonfailure(true);
+		junit.setDir((File) hashMap.get("buildDir"));
+		junit.setFork(true);
+
+		// Add formatter to junitTask
+		FormatterElement formatter = new FormatterElement();
+		TypeAttribute type = new TypeAttribute();
+		type.setValue("xml");
+		formatter.setType(type);
+		junit.addFormatter(formatter);
+
+		// Add test to junitTask
+		JUnitTest test = new JUnitTest((String) hashMap.get("testClass"));
+		test.setTodir((File) hashMap.get("reportDir"));
+		junit.addTest(test);
+
+		junit.setShowOutput(true);
+
+		// Add classpath to junitTask
+		junit.createClasspath().add(classpath);
+		System.out.println(classpath);
+		// Finally execute junitTask
+		junit.execute();
+	}
+
+	public static List<Node> getLineCounts(Node dom, String className,
+			String methodName) {
+		return getLineCounts(dom, className, methodName, null);
+	}
+
+	public static void waitForLiveServer(String webContainerHostname,
+			int webContainerPort, int timeoutMin) {
+		InetSocketAddress address = new InetSocketAddress(webContainerHostname,
+				webContainerPort);
+
+		System.out.println("Waiting " + timeoutMin + " min for web server...");
+
+		long beginTime = System.currentTimeMillis();
+		long endTime = System.currentTimeMillis() + (timeoutMin * 60 * 1000);
+
+		boolean portOpened = false;
+		while ((!portOpened) && (System.currentTimeMillis() < endTime)) {
+			portOpened = trySocket(address);
+
+			if (portOpened) {
+				System.out.println("Web server has opened the port in "
+						+ (System.currentTimeMillis() - beginTime) / 1000.0
+						/ 60.0 + " min.");
+			} else {
+				try {
+					Thread.sleep(2000); // 2 seconds
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		if (!portOpened) {
+			throw new RuntimeException(
+					"Timed out waiting for webapp server to initialize");
+		}
+	}
+
+	private static boolean trySocket(InetSocketAddress address) {
+		boolean success = false;
+
+		Socket socket = null;
+		try {
+			socket = new Socket();
+			socket.connect(address);
+			success = true;
+		} catch (ConnectException e) {
+			// this is expected
+		} catch (Throwable e) {
+			e.printStackTrace();
+		} finally {
+			if (socket != null && !socket.isClosed()) {
+				try {
+					socket.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return success;
+	}
+
+	public static boolean isMethodHit(Node dom, String className,
+			String methodName) {
+		List<Node> methods = TestUtils
+				.getLineCounts(dom, className, methodName);
+		assertNotNull(methods);
+		assertTrue(!methods.isEmpty());
+
+		return Integer.valueOf((String) methods.get(0).attribute("hits")) >= 1;
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/util/WebappServer.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/util/WebappServer.java
new file mode 100644
index 0000000..dff82e2
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/util/WebappServer.java
@@ -0,0 +1,544 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2009 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.test.util;
+
+import static org.junit.Assert.*;
+
+import groovy.lang.Closure;
+import net.sourceforge.cobertura.ant.InstrumentTask;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.types.Environment.Variable;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.ZipFileSet;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.ServerSocket;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+public class WebappServer {
+	public static final String SIMPLE_SERVLET_CLASSNAME = "com.acme.servlet.SimpleServlet";
+
+	private static final String JETTY_DIR = "src/test/resources/jetty";
+
+	public static final String SIMPLE_SERVLET_TEXT = "\n package com.acme.servlet;"
+			+ "\n "
+			+ "\n import javax.servlet.http.HttpServlet;"
+			+ "\n import javax.servlet.http.HttpServletRequest;"
+			+ "\n import javax.servlet.http.HttpServletResponse;"
+			+ "\n "
+			+ "\n import java.io.PrintWriter;"
+			+ "\n import java.io.IOException;"
+			+ "\n "
+			+ "\n public class SimpleServlet extends HttpServlet"
+			+ "\n {"
+			+ "\n  protected void doGet(HttpServletRequest req, HttpServletResponse response) throws IOException"
+			+ "\n  {"
+			+ "\n   response.setContentType(\"text/html;charset=UTF-8\");"
+			+ "\n   PrintWriter out = response.getWriter();"
+			+ "\n   try"
+			+ "\n   {"
+			+ "\n    out.println(\"Hi\");"
+			+ "\n   }"
+			+ "\n   finally"
+			+ "\n   {"
+			+ "\n    if (out != null)"
+			+ "\n    {"
+			+ "\n     out.close();" + "\n    }" + "\n   }" + "\n  }" + "\n }";
+
+	public static final String SIMPLE_SERVLET_WEB_XML_TEXT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+			+ "\n <web-app version=\"2.4\" xmlns=\"http://java.sun.com/xml/ns/j2ee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd\">"
+			+ "\n  <servlet>"
+			+ "\n   <servlet-name>SimpleServlet</servlet-name>"
+			+ "\n   <servlet-class>com.acme.servlet.SimpleServlet</servlet-class>"
+			+ "\n  </servlet>"
+			+ "\n  <servlet-mapping>"
+			+ "\n   <servlet-name>SimpleServlet</servlet-name>"
+			+ "\n   <url-pattern>/SimpleServlet</url-pattern>"
+			+ "\n  </servlet-mapping>" + "\n </web-app>";
+
+	private static final String LOCALHOST = "127.0.0.1";
+	private static final String WEB_XML = "src/main/resources/net/sourceforge/cobertura/webapp/web.xml";
+	private static final String SRC_DIR = "src/main/java";
+	private static final String appName = "simple";
+	private int webappPort;
+	private int stopPort;
+
+	File dir = new File(TestUtils.getTempDir(), "webserver");
+	boolean modifyMainCoberturaDataFile;
+	boolean tomcat;
+
+	public WebappServer(File webappServerDir, boolean tomcat) {
+		this.tomcat = tomcat;
+		ServerSocket s;
+		try {
+			s = new ServerSocket(0);
+			webappPort = s.getLocalPort();
+			s.close();
+
+			s = new ServerSocket(0);
+			stopPort = s.getLocalPort();
+			s.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void deployApp(File srcDir, boolean instrumentCobertura,
+			boolean deployCoberturaFlush, boolean modifyMainCoberturaDataFile,
+			String instrumentRegEx) throws Exception {
+		this.modifyMainCoberturaDataFile = modifyMainCoberturaDataFile;
+
+		File extractedDir = new File(dir, "extracted");
+		File webInfDir = new File(extractedDir, "WEB-INF");
+		File classesDir = new File(webInfDir, "classes");
+
+		File webInfFile = writeWebInfFile(webInfDir,
+				SIMPLE_SERVLET_WEB_XML_TEXT);
+
+		compileSourceFiles(srcDir, classesDir);
+
+		copyJettyFiles(dir);
+
+		File war = makeWarFile(appName, webInfFile, classesDir);
+
+		FileUtils.deleteDirectory(extractedDir);
+
+		File coberturaJar = createCoberturaJar();
+
+		if (instrumentRegEx != null) {
+			instrumentWar(war, instrumentRegEx);
+		}
+
+		if (instrumentCobertura != false) {
+			instrumentCoberturaJar(coberturaJar);
+		}
+
+		if (deployCoberturaFlush != false) {
+			deployCoberturaFlush(deployCoberturaFlush);
+		}
+	}
+
+	public void deployApp(File srcDir, boolean instrumentCobertura,
+			boolean deployCoberturaFlush, boolean modifyMainCoberturaDataFile)
+			throws Exception {
+		deployApp(srcDir, instrumentCobertura, deployCoberturaFlush,
+				modifyMainCoberturaDataFile, "");
+	}
+
+	public void deployApp(File srcDir, boolean deployCoberturaFlush,
+			String instrumentRegEx) throws Exception {
+		deployApp(srcDir, false, deployCoberturaFlush, false, instrumentRegEx);
+	}
+
+	public void deployApp(File srcDir, String instrumentRegEx) throws Exception {
+		deployApp(srcDir, false, instrumentRegEx);
+	}
+
+	public void deployApp(File srcDir) throws Exception {
+		deployApp(srcDir, "");
+	}
+
+	private File writeWebInfFile(File webInfDir, String text)
+			throws IOException {
+		assertTrue(webInfDir.mkdirs());
+		File webInfFile = new File(webInfDir, "web.xml");
+
+		FileUtils.writeStringToFile(webInfFile, text);
+		return webInfFile;
+	}
+
+	private void compileSourceFiles(File srcDir, File classesDir) {
+		Mkdir mkdir = new Mkdir();
+		mkdir.setProject(TestUtils.project);
+		mkdir.setDir(classesDir);
+		mkdir.execute();
+
+		Javac javac = new Javac();
+		javac.setProject(TestUtils.project);
+		javac.setSrcdir(new Path(TestUtils.project, srcDir.getAbsolutePath()));
+		javac.setDestdir(classesDir);
+		javac.setDebug(true);
+		javac.setTarget("1.7");
+
+		Path classpath = new Path(TestUtils.project);
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(new File(JETTY_DIR));
+		fileSet.setIncludes("**/*.jar");
+		classpath.addFileset(fileSet);
+
+		javac.setClasspath(classpath);
+		javac.execute();
+	}
+
+	private void copyJettyFiles(File todir) {
+		Copy copy = new Copy();
+		copy.setProject(TestUtils.project);
+		copy.setTodir(todir);
+		FileSet fileSet = new FileSet();
+		fileSet.setProject(TestUtils.project);
+		fileSet.setDir(new File(JETTY_DIR));
+		copy.addFileset(fileSet);
+		copy.execute();
+	}
+
+	private File makeWarFile(String appName, File webInfFile, File classesDir) {
+		File webappsDir = new File(dir, "webapps");
+		File war = new File(webappsDir, appName + ".war");
+
+		War antWar = new War();
+		antWar.setProject(TestUtils.project);
+		antWar.setDestFile(war);
+		antWar.setWebxml(webInfFile);
+		ZipFileSet zipFileSet = new ZipFileSet();
+		zipFileSet.setDir(classesDir);
+		antWar.addClasses(zipFileSet);
+		antWar.execute();
+
+		return war;
+	}
+
+	private void deployCoberturaFlush(boolean instrumentCobertura)
+			throws Exception {
+		File webappsDir = new File(dir, "webapps");
+		File war = new File(webappsDir, "coberturaFlush.war");
+
+		File classesDir = new File("target/build/warClasses");
+		if (!classesDir.exists())
+			classesDir.mkdirs();
+		Javac javac = new Javac();
+		javac.setProject(TestUtils.project);
+		javac.setSrcdir(new Path(TestUtils.project, SRC_DIR));
+		javac.setDestdir(classesDir);
+		javac.setDebug(true);
+
+		Path classpath = new Path(TestUtils.project);
+		FileSet jettyFileSet = new FileSet();
+		jettyFileSet.setDir(new File(JETTY_DIR));
+		jettyFileSet.setIncludes("**/*.jar");
+		classpath.addFileset(jettyFileSet);
+
+		javac.setIncludes("**/FlushCoberturaServlet.java");
+
+		javac.setClasspath(classpath);
+		javac.execute();
+
+		War antWar = new War();
+		antWar.setProject(TestUtils.project);
+		antWar.setDestFile(war);
+		antWar.setWebxml(new File(WEB_XML));
+
+		ZipFileSet classesFileSet = new ZipFileSet();
+		classesFileSet.setDir(classesDir);
+
+		antWar.addClasses(classesFileSet);
+		antWar.execute();
+
+		if (instrumentCobertura) {
+			instrumentWar(war, "net.sourceforge.cobertura.*");
+		}
+	}
+
+	private void instrumentWar(File war, String instrumentRegEx) {
+		InstrumentTask instrumentTask = new InstrumentTask();
+		instrumentTask.setProject(TestUtils.project);
+		instrumentTask.setDataFile(dir.getAbsolutePath() + "/cobertura.ser");
+		instrumentTask.createIncludeClasses().setRegex(instrumentRegEx);
+		instrumentTask.createExcludeClasses().setRegex(".*Test.*");
+		System.out.println(war.getAbsolutePath());
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(war.getParentFile());
+		fileSet.setIncludes("**/*.war");
+
+		instrumentTask.addFileset(fileSet);
+		instrumentTask.execute();
+	}
+
+	private void instrumentCoberturaJar(File coberturaJar) {
+		InstrumentTask instrumentTask = new InstrumentTask();
+		instrumentTask.setProject(TestUtils.project);
+		instrumentTask.setDataFile(dir.getAbsolutePath() + "/cobertura.ser");
+		instrumentTask.createIncludeClasses().setRegex(
+				"net.sourceforge.cobertura.*");
+		instrumentTask.createExcludeClasses().setRegex(".*Test.*");
+
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(new File(coberturaJar.getParent()));
+		fileSet.setIncludes(coberturaJar.getName());
+
+		instrumentTask.addFileset(fileSet);
+		instrumentTask.execute();
+	}
+
+	/**
+	 * Starts the web server and calls the closure.   The web server will be stopped 
+	 * when the closure exits (successfully or not).
+	 * @throws Exception 
+	 * 
+	 */
+	public void withRunningServer() throws Exception {
+		startWebServer();
+		Map<String, Object> data = new HashMap<String, Object>();
+		try {
+			data.put("xmlReport", new File(dir.getAbsolutePath()
+					+ "/coverage.xml"));
+			data.put("hostname", LOCALHOST);
+			data.put("webappPort", webappPort);
+			data.put("coberturaAnt", TestUtils.getCoberturaAntBuilder(TestUtils
+					.getTempDir()));
+
+			data.put("datafile", getDatafileToUse());
+
+			/*
+			 * add a closure that can be called to flush the cobertura data
+			 */
+			Closure closure = new Closure(null) {
+				private static final long serialVersionUID = 1L;
+
+				@SuppressWarnings("unused")
+				public void doCall(HashMap<String, Object> values) {
+				}
+			};
+
+			System.err.println(closure.call(data));
+		} finally {
+		}
+	}
+
+	public void killServer() {
+		stopWebServer();
+	}
+
+	private File getDatafileToUse() {
+		File datafile = new File(dir.getAbsolutePath() + "/cobertura.ser");
+
+		if (modifyMainCoberturaDataFile) {
+			/*
+			 * modify the cobertura.ser file created by the instrumentation target
+			 * of the main build.xml file.   That way, the counts
+			 * will end up in the overall coverage report
+			 */
+			File tempfile = new File("target/build/cobertura.ser");
+			if (tempfile.exists()) {
+				datafile = tempfile;
+			} else {
+				/*
+				 * It looks like the main build.xml's instrument target has not been run.
+				 * So, a coverage report is not being generated.
+				 */
+			}
+		}
+		return datafile;
+	}
+
+	private void startWebServer() {
+		System.out.println("Starting Jetty webapp server on " + webappPort);
+
+		Thread t = new Thread() {
+			@Override
+			public void run() {
+				Java java = new Java();
+				java.setProject(TestUtils.project);
+				java.setDir(dir);
+				java.setJar(new File(dir, "start.jar"));
+				java.setFork(true);
+
+				Variable jettyPort = new Variable();
+				jettyPort.setKey("jetty.port");
+				jettyPort.setValue(String.valueOf(webappPort));
+				java.addSysproperty(jettyPort);
+
+				Variable stopPortVariable = new Variable();
+				stopPortVariable.setKey("STOP.PORT");
+				stopPortVariable.setValue(String.valueOf(stopPort));
+				java.addSysproperty(stopPortVariable);
+
+				Variable stopKey = new Variable();
+				stopKey.setKey("STOP.KEY");
+				stopKey.setValue("cobertura");
+				java.addSysproperty(stopKey);
+
+				if (tomcat) {
+					Variable catalinaHome = new Variable();
+					catalinaHome.setKey("catalina.home");
+					catalinaHome.setValue(dir.getAbsolutePath());
+					java.addSysproperty(catalinaHome);
+				}
+
+				if (modifyMainCoberturaDataFile) {
+					Variable dataFile = new Variable();
+					dataFile.setKey("net.sourceforge.cobertura.datafile");
+					dataFile.setValue(getDatafileToUse().getAbsolutePath());
+					java.addSysproperty(dataFile);
+				}
+
+				java.execute();
+			}
+		};
+		t.start();
+
+		try {
+			Thread.sleep(10 * 1000); // Sleep for 10 seconds. The servlet needs a few seconds to boot up.
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private void stopWebServer() {
+		Thread t = new Thread() {
+			@Override
+			public void run() {
+				Java java = new Java();
+				java.setProject(TestUtils.project);
+				java.setJar(new File(TestUtils.getTempDir(),
+						"webserver/start.jar"));
+				java.setDir(dir);
+				java.setFork(true);
+				java.setArgs("--stop");
+				Variable stopPortVariable = new Variable();
+				Variable stopKeyVariable = new Variable();
+
+				stopPortVariable.setKey("STOP.PORT");
+				stopPortVariable.setValue(String.valueOf(stopPort));
+
+				stopKeyVariable.setKey("STOP.KEY");
+				stopKeyVariable.setValue("cobertura");
+
+				java.addSysproperty(stopPortVariable);
+				java.addSysproperty(stopKeyVariable);
+
+				java.execute();
+
+				java.execute();
+			}
+		};
+		t.start();
+	}
+
+	private File createCoberturaJar() {
+		File coberturaJar = new File(dir, "lib/cobertura.jar");
+		File coberturaClassDir = TestUtils.getCoberturaClassDir();
+
+		Zip zip = new Zip();
+		zip.setProject(TestUtils.project);
+		zip.setDestFile(coberturaJar);
+
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(coberturaClassDir);
+
+		zip.addFileset(fileSet);
+		zip.execute();
+
+		return coberturaJar;
+	}
+
+	public static void writeSimpleServletSource(File srcDir) throws IOException {
+		File servletSourceFile = new File(srcDir,
+				"com/acme/servlet/SimpleServlet.java");
+		assertTrue(servletSourceFile.getParentFile().mkdirs());
+
+		FileUtils.write(servletSourceFile, SIMPLE_SERVLET_TEXT);
+	}
+
+	public void pingServer() {
+		String webappResponse = null;
+		try {
+			webappResponse = IOUtils.toString(new URL("http://localhost:"
+					+ webappPort + "/" + appName + "/SimpleServlet")
+					.openConnection().getInputStream());
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		} catch (IOException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}
+
+		assertNotNull(webappResponse);
+		assertEquals("Webapp response was incorrect", "Hi", webappResponse
+				.trim());
+	}
+
+	public void pingCoberturaServer() {
+		//flush the cobertura data by doing an HTTP get
+		String flushing = null;
+		try {
+			flushing = IOUtils.toString(new java.net.URL("http://localhost:"
+					+ webappPort + "/coberturaFlush/flushCobertura")
+					.openConnection().getInputStream());
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		} catch (IOException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}
+
+		assertNotNull(flushing);
+		assertEquals("", flushing.trim());
+
+	}
+
+	public File getXmlReport() {
+		return new File(dir.getAbsolutePath(), "coverage.xml");
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.java
new file mode 100644
index 0000000..f388f7d
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.java
@@ -0,0 +1,265 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2009 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package net.sourceforge.cobertura.thread.test;
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.tools.ant.taskdefs.Echo;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.DirSet;
+import org.apache.tools.ant.types.Path;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class MultipleClassloaderFunctionalTest {
+
+	/*
+	 * This tests the case where there are multiple classloaders that each
+	 * load the Cobertura classes.   Cobertura uses static fields to
+	 * hold the data.   When there are multiple classloaders, each classloader
+	 * will keep track of the line counts for the classes that it loads.  
+	 * 
+	 * The static initializers for the Cobertura classes are also called for
+	 * each classloader.   So, there is one shutdown hook for each classloader.
+	 * So, when the JVM exits, each shutdown hook will try to write the
+	 * data it has kept to the datafile.   They will do this at the same
+	 * time.   Before Java 6, this seemed to work fine, but with Java 6, there
+	 * seems to have been a change with how file locks are implemented.   So,
+	 * care has to be taken to make sure only one thread locks a file at a time.
+	 * 
+	 */
+
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+	TestUtils testUtil = new TestUtils();
+
+	private static String CALLED_CODE = "\n package mypackage;" + "\n "
+			+ "\n public class Called {" + "\n	 public static void callThis()"
+			+ "\n  {" + "\n 	}" + "\n }";
+
+	@Before
+	public void setUp() throws IOException {
+		FileUtils.deleteDirectory(new File("/tmp/src"));
+	}
+
+	@After
+	public void tearDown() throws IOException {
+		FileUtils.deleteDirectory(new File("/tmp/src"));
+	}
+
+	@Test
+	public void multipleClassloadersTest() throws Exception {
+		Echo echo = new Echo();
+		echo.setMessage("Running multiple classloader test.");
+		echo.execute();
+		runTest();
+	}
+
+	/*
+	 * This code creates a Java class that has a main method that will create two
+	 * classloaders.   Each classloader will then load the mypackage.Called class
+	 * defined above.  Then, the mypackage.Called.callThis() method is called once.
+	 */
+	private String getMainCode(File instrumentDir) {
+		return "\n package mypackage;"
+				+ "\n "
+				+ "\n import java.net.URLClassLoader;"
+				+ "\n import java.net.URL;"
+				+ "\n import java.io.File;"
+				+ "\n import java.lang.reflect.Method;"
+				+ "\n "
+				+ "\n public class Main {"
+				+ "\n 	public static void main(String[] args) throws Throwable"
+				+ "\n 	{"
+				+ "\n 		createClassloaderAndCallMethod();"
+				+ "\n  		createClassloaderAndCallMethod();"
+				+ "\n 	}"
+				+ "\n "
+				+ "\n 	/*"
+				+ "\n 	 * Create a classloader that loads the instrumented code and the cobertura classes."
+				+ "\n 	 * Then, call the mypackage.Called.callThis() static method."
+				+ "\n 	 */"
+				+ "\n 	public static void createClassloaderAndCallMethod() throws Throwable"
+				+ "\n 	{"
+				+ "\n 		File instrumentDir = new File(\""
+				+ instrumentDir.getAbsolutePath().replace('\\', '/')
+				+ "\");"
+				+ "\n 		File coberturaClassDir = new File(\""
+				+ TestUtils.getCoberturaClassDir().getAbsolutePath()
+						.replace('\\', '/')
+				+ "\");"
+				+ "\n 		File dependencySlf4j = new File(\""
+				+ TestUtils.createDependencyPath("org.slf4j", "slf4j-api", "1.7.5").toString()
+						.replace('\\', '/')
+				+ "\");"
+				+ "\n "
+				+ "\n 		/*"
+				+ "\n 		 * Create a classloader with a null parent classloader to ensure that this"
+				+ "\n 		 * classloader loads the Cobertura classes itself."
+				+ "\n 		 */"
+				+ "\n          URLClassLoader loader = new URLClassLoader("
+				+ "\n         		new URL[] {instrumentDir.toURL(), coberturaClassDir.toURL(), dependencySlf4j.toURL()}, null);"
+				+ "\n "
+				+ "\n 		// use reflection to call mypackage.Called.callThis() once."
+				+ "\n         Class calledClass = loader.loadClass(\"mypackage.Called\");"
+				+ "\n         Method method = calledClass.getMethod(\"callThis\", null);"
+				+ "\n " + "\n         method.invoke(null, null);" + "\n 	}"
+				+ "\n }";
+	}
+
+	private void runTest() throws Exception {
+		/*
+		 * Use a temporary directory and create a Main.java source file
+		 * that creates multiple classloaders.   Also, create a Called.java
+		 * file that defines the mypackage.Called.callThis() method that
+		 * will be called by mypackage.Main.main().
+		 */
+		File tempDir = TestUtils.getTempDir();
+		File srcDir = new File(tempDir, "src");
+		File instrumentDir = new File(tempDir, "instrument");
+
+		File mainSourceFile = new File(srcDir, "mypackage/Main.java");
+		File datafile = new File(srcDir, "cobertura.ser");
+		mainSourceFile.getParentFile().mkdirs();
+
+		BufferedWriter bw = null;
+		try {
+			bw = new BufferedWriter(new FileWriter(mainSourceFile));
+			bw.write(getMainCode(instrumentDir));
+		} catch (IOException e) {
+			e.printStackTrace();
+			fail();
+		} finally {
+			IOUtils.closeQuietly(bw);
+		}
+
+		File calledSourceFile = new File(srcDir, "mypackage/Called.java");
+
+		try {
+			bw = new BufferedWriter(new FileWriter(calledSourceFile));
+			bw.write(CALLED_CODE);
+		} catch (IOException e) {
+			e.printStackTrace();
+			fail();
+		} finally {
+			IOUtils.closeQuietly(bw);
+		}
+
+		TestUtils.compileSource(ant, srcDir);
+
+		TestUtils.instrumentClasses(ant, srcDir, datafile, instrumentDir);
+
+		/*
+		 * Kick off the Main class.   I'll use the non-instrumented classes, but
+		 * I think you could use the instrumented ones as well.
+		 */
+		DirSet dirSet = new DirSet();
+		dirSet.setDir(srcDir);
+		dirSet.setProject(TestUtils.project);
+		Path classpath = new Path(TestUtils.project);
+		classpath.addDirset(dirSet);
+		classpath.addDirset(TestUtils.getCoberturaClassDirSet());
+		// This is needed to fix issue #213
+		classpath.add(TestUtils.createDependencyPath("org.slf4j", "slf4j-api", "1.7.5"));
+
+		Java java = new Java();
+		java.setProject(TestUtils.project);
+		java.setClassname("mypackage.Main");
+		java.setDir(srcDir);
+		java.setFork(true);
+		java.setFailonerror(true);
+		java.setClasspath(classpath);
+		java.execute();
+
+		/*
+		 * Now create a cobertura xml file and make sure the correct counts are in it.
+		 */
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+
+		Node dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		List<Node> lines = TestUtils.getLineCounts(dom, "mypackage.Called",
+				"callThis", null);
+
+		// the callThis() method is empty, so the only line is the ending brace.
+		assertEquals(1, lines.size());
+
+		for (int i = 0; i < lines.size(); i++) {
+			assertEquals("hit count incorrect", "2", lines.get(i).attribute(
+					"hits"));
+		}
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/thread/test/ThreadedFunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/thread/test/ThreadedFunctionalTest.java
new file mode 100644
index 0000000..a24d2c1
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/thread/test/ThreadedFunctionalTest.java
@@ -0,0 +1,368 @@
+package net.sourceforge.cobertura.thread.test;
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2009 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+import groovy.util.AntBuilder;
+import groovy.util.Node;
+import net.sourceforge.cobertura.ant.InstrumentTask;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.tools.ant.taskdefs.Echo;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.taskdefs.Javac;
+import org.apache.tools.ant.types.DirSet;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+import org.codehaus.groovy.ant.Groovyc;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * This tests the thread safety of Cobertura.
+ *
+ * Multiple threads are kicked off that will execute the same switch or
+ * if statement.   The switch statement would like like this:
+ *
+ * switch(counter)
+ * {
+ *    case 0: counter++; break;
+ *    case 1: counter++; break;
+ *    etc.
+ *    default: counter = 0;
+ * }
+ * The if statement looks like this:
+ * if (counter==0||counter==1||counter==2 ... )
+ * {
+ *    counter++;
+ * }
+ *
+ * Notice that the counter is incremented so the cases or conditionals are
+ * hit in order with each call.
+ *
+ * Multiple threads will process the switch or if statement at the same time.
+ * Since the case and conditional information is handled with arrays that grow
+ * dynamically larger as each case or conditional is hit, you will get index
+ * out of bounds exceptions if Cobertura is not thread safe.   One thread
+ * will increase the array while another is trying to do the same.  Only one
+ * thread's change is saved, and the other thread is likely to throw an
+ * out of bounds exception.
+ */
+public class ThreadedFunctionalTest {
+	AntBuilder ant = TestUtils.getCoberturaAntBuilder(TestUtils
+			.getCoberturaClassDir());
+
+	private static int numberOfCalls = 300; //this number can't be too high or you will get a stack overflow (due to the inject below)
+	private static int numberOfThreads = 2;
+	private static int numberOfRetries = 10;
+
+	boolean branchOrSwitchCode;
+
+	/*
+	 * A big switch statement with number of cases equal to numberOfCalls:
+	 *
+	 * switch(counter)
+	 * {
+	 *    case 0: counter++; break;
+	 *    case 1: counter++; break;
+	 *    etc.
+	 *    default: counter = 0;
+	 * }
+	 */
+	private static String SWITCH_CODE;
+
+	/*
+	 * A big if statement with number of conditionals equal to numberOfCalls:
+	 *
+	 * if (counter==0||counter==1||counter==2 ... )
+	 * {
+	 *    counter++;
+	 * }
+	 */
+	private static String IF_STATEMENT_CODE;
+
+	static {
+		StringBuilder tempBuilder = new StringBuilder();
+		tempBuilder.append("\nswitch(counter)");
+		tempBuilder.append("\n{");
+		for (int i = 0; i < numberOfCalls; i++) {
+			tempBuilder.append("\ncase " + i + ": counter++; break;");
+		}
+		tempBuilder.append("\ndefault: counter = 0; break;}");
+
+		SWITCH_CODE = tempBuilder.toString();
+
+		tempBuilder = new StringBuilder();
+		tempBuilder.append("if (");
+		for (int i = 0; i < numberOfCalls; i++) {
+			tempBuilder.append("counter==" + i);
+			if (i < numberOfCalls - 1) { // want to add || to everything except the last one
+				tempBuilder.append("||");
+			}
+		}
+		tempBuilder.append(") {\n counter++;\n }");
+
+		IF_STATEMENT_CODE = tempBuilder.toString();
+
+	}
+
+	private String getThreadedCode(String branchOrSwitchCode) {
+		/*
+		 * This code will kick off a number of threads equal to numberOfThreads.
+		 * Each thread will do a number of calls equal to numberOfCalls.
+		 * Each call will be a call to the method acall().   The body of this
+		 * method is passed in as branchOrSwithcCode and is either a switch
+		 * statement with a large number of cases or an if statement with
+		 * a large number of conditionals.
+		 */
+		return "\npackage mypackage;" + "\n" + "\nimport java.util.ArrayList;"
+				+ "\n" + "\nclass MyThreads extends Thread" + "\n{"
+				+ "\n		int counter = 0;" + "\n" + "\n		void acall()" + "\n		{"
+				+ "\n			"
+				+ branchOrSwitchCode
+				+ "\n		}"
+				+ "\n"
+				+ "\n		public void run()"
+				+ "\n		{"
+				+ "\n			try"
+				+ "\n			{"
+				+ "\n				for (int i=0; i< "
+				+ numberOfCalls
+				+ "; i++)"
+				+ "\n				{"
+				+ "\n					yield();"
+				+ "\n					acall();"
+				+ "\n				}"
+				+ "\n			}"
+				+ "\n			catch (Throwable t)"
+				+ "\n			{"
+				+ "\n				t.printStackTrace();"
+				+ "\n				System.exit(1);"
+				+ "\n			}"
+				+ "\n		}"
+				+ "\n"
+				+ "\n		public static void main(String[] args)"
+				+ "\n		{"
+				+ "\n			ArrayList threads = new ArrayList();"
+				+ "\n			for (int i=0; i<"
+				+ numberOfThreads
+				+ "; i++)"
+				+ "\n			{"
+				+ "\n				threads.add(new MyThreads());"
+				+ "\n			}"
+				+ "\n			for (int i=0; i<"
+				+ numberOfThreads
+				+ "; i++)"
+				+ "\n			{"
+				+ "\n				((Thread) threads.get(i)).start();"
+				+ "\n			}" + "\n		}" + "\n}";
+	}
+
+	@Test
+	public void simpleThreadTest() throws Exception {
+		Echo echo = new Echo();
+		echo.setMessage("Running threaded test with switch statement.");
+		echo.execute();
+
+		runTest(SWITCH_CODE);
+	}
+
+	@Test
+	public void simpleThreadTestWithIfStatement() throws Exception {
+		Echo echo = new Echo();
+		echo.setMessage("Running threaded test with if statement.");
+		echo.execute();
+
+		runTest(IF_STATEMENT_CODE);
+	}
+
+	@After
+	public void tearDown() throws IOException {
+		FileUtils.deleteDirectory(new File("/tmp/src"));
+	}
+
+	@Before
+	public void setUp() throws IOException {
+		FileUtils.deleteDirectory(new File("/tmp/src"));
+	}
+
+	private void runTest(String code) throws Exception {
+		/*
+		 * Use a temporary directory and create a MyThreads.java source file
+		 * that creates multiple threads which do repetitive calls into
+		 * a method.   The method contains either a switch with a large number
+		 * of cases or an if statement with a large number of conditionals depending
+		 * on the code passed into this method.
+		 */
+
+		File tempDir = TestUtils.getTempDir();
+		final File srcDir = new File(tempDir, "src");
+
+		File sourceFile = new File(srcDir, "mypackage/MyThreads.java");
+		final File datafile = new File(srcDir, "cobertura.ser");
+		sourceFile.getParentFile().mkdirs();
+
+		BufferedWriter bw = null;
+		try {
+			bw = new BufferedWriter(new FileWriter(sourceFile));
+			bw.write(getThreadedCode(code));
+		} finally {
+			bw.close();
+		}
+
+		compileSource(srcDir);
+
+		instrumentClasses(srcDir, datafile);
+
+		/*
+		 * This test does not seem to fail all the time, so we will need to try several times.
+		 */
+
+		Path p = new Path(TestUtils.project);
+		DirSet dirSet = new DirSet();
+		FileSet fileSet = new FileSet();
+
+		dirSet.setDir(srcDir);
+		fileSet.setDir(new File("src/test/resources/antLibrary/common/groovy"));
+		fileSet.setIncludes("*.jar");
+
+		p.addFileset(fileSet);
+		p.addDirset(dirSet);
+		p.setProject(TestUtils.project);
+		p.addDirset(TestUtils.getCoberturaClassDirSet());
+		// This is needed to fix issue #213
+		p.add(TestUtils.createDependencyPath("org.slf4j", "slf4j-api", "1.7.5"));
+
+		for (int i = 0; i < numberOfRetries; i++) {
+			System.out.println("Executing build: " + i);
+			Java java = new Java();
+			java.setClassname("mypackage.MyThreads");
+			java.setDir(srcDir);
+			java.setFork(true);
+			java.setProject(TestUtils.project);
+			java.setFailonerror(true);
+			java.setClasspath(p);
+			java.execute();
+		}
+
+		System.out.println("Starting reporting task.");
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile(datafile.getAbsolutePath());
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(srcDir);
+		reportTask.execute();
+		System.out.println("Finish reporting task.");
+
+		Node dom = TestUtils.getXMLReportDOM(srcDir.getAbsolutePath()
+				+ "/coverage.xml");
+
+		int hitCount = TestUtils.getHitCount(dom, "mypackage.MyThreads",
+				"acall");
+
+		assertEquals("hit count incorrect", numberOfRetries * numberOfThreads
+				* numberOfCalls, hitCount);
+	}
+
+	public void compileSource(final File srcDir) {
+
+		final String absolutePath = srcDir.getAbsolutePath().replaceAll("\\\\",
+				"/");
+		System.out.println("Invoking groovyC command on " + absolutePath);
+		Javac javac = new Javac();
+		javac.setDebug(true);
+		javac.setProject(TestUtils.project);
+
+		Groovyc groovyc = new Groovyc();
+		groovyc.setProject(TestUtils.project);
+
+        /*
+         TODO: Validate that we can use a normal Ant Path. (It does not seem to escape its \\'s, implying
+         TODO: that exceptions occur on Windows computers during build).
+
+
+         */
+		groovyc.setSrcdir(new Path(TestUtils.project, absolutePath));
+		groovyc.setDestdir(srcDir);
+		groovyc.addConfiguredJavac(javac);
+		groovyc.execute();
+
+		System.out.println("Finish invoking groovyC command.");
+	}
+
+	public void instrumentClasses(File srcDir, File datafile) {
+		System.out.println("Start instrumenting classes.");
+		FileSet fileset = new FileSet();
+		fileset.setDir(srcDir);
+		fileset.setIncludes("**/*.class");
+
+		InstrumentTask instrumentTask = new InstrumentTask();
+		instrumentTask.setProject(TestUtils.project);
+		instrumentTask.setDataFile(datafile.getAbsolutePath());
+		instrumentTask.setThreadsafeRigorous(true);
+		instrumentTask.addFileset(fileset);
+		instrumentTask.execute();
+		System.out.println("Finish instrumenting classes.");
+	}
+}
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/util/CommandLineBuilderTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/util/CommandLineBuilderTest.java
new file mode 100644
index 0000000..2ee37d7
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/util/CommandLineBuilderTest.java
@@ -0,0 +1,183 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.util;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author Grzegorz Lukasik
+ */
+public class CommandLineBuilderTest extends TestCase {
+
+	private String[] testArguments(String[] args) throws Exception {
+		CommandLineBuilder builder = new CommandLineBuilder();
+		for (int i = 0; i < args.length; i++)
+			builder.addArg(args[i]);
+		builder.saveArgs();
+
+		File cmdFile = new File(builder.getCommandLineFile());
+		assertTrue(cmdFile.isAbsolute());
+		assertTrue(cmdFile.isFile());
+
+		String[] result = CommandLineBuilder
+				.preprocessCommandLineArguments(new String[]{"--commandsfile",
+						builder.getCommandLineFile()});
+		builder.dispose();
+
+		return result;
+	}
+
+	public void testExample() throws Exception {
+		CommandLineBuilder builder = new CommandLineBuilder();
+		builder.addArg("--someoption");
+		builder.addArg("optionValue");
+		builder.saveArgs();
+
+		String[] args = CommandLineBuilder
+				.preprocessCommandLineArguments(new String[]{"--commandsfile",
+						builder.getCommandLineFile()});
+
+		assertEquals("--someoption", args[0]);
+		assertEquals("optionValue", args[1]);
+
+		builder.dispose();
+	}
+
+	public void testExample_2() throws Exception {
+		CommandLineBuilder builder = new CommandLineBuilder();
+		builder.addArg("--someoption", "optionValue");
+		builder.saveArgs();
+
+		String[] args = CommandLineBuilder
+				.preprocessCommandLineArguments(new String[]{"--commandsfile",
+						builder.getCommandLineFile()});
+
+		assertEquals("--someoption", args[0]);
+		assertEquals("optionValue", args[1]);
+
+		builder.dispose();
+	}
+
+	private void assertEquals(String[] first, String[] second) {
+		assertEquals(first.length, second.length);
+		for (int i = 0; i < first.length; i++) {
+			assertEquals(first[i], second[i]);
+		}
+	}
+
+	public void testManyOptions() throws Exception {
+		String[] options = new String[100000];
+		for (int i = 0; i < options.length; i++) {
+			options[i] = "myOption" + i;
+		}
+
+		String[] args = testArguments(options);
+		assertEquals(options, args);
+	}
+
+	public void testVariousOptions() throws Exception {
+		String[] options = {
+				"hello",
+				" one",
+				"two ",
+				"  three , ",
+				"\"'xx",
+				" ",
+				"file .java",
+				"f.java",
+				"#@()39340*(@0$#&%^@#&4098353856_*(_ at 735/896_udsknbfdvzxvkasd DSFWBXfqw']][.,=---3\\]];",
+				"null", "!@#$%^&*()_+-={}|[]\\:\";'<>?,./'"};
+		String[] args = testArguments(options);
+		assertEquals(options, args);
+	}
+
+	public void testEmptyOptions() throws Exception {
+		String[] args = testArguments(new String[0]);
+		assertEquals(new String[0], args);
+	}
+
+	public void testInvalidArguments() throws Exception {
+		CommandLineBuilder builder = new CommandLineBuilder();
+		try {
+			builder.addArg(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+		try {
+			builder.addArg("someArgument", null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+		try {
+			builder.addArg(null, "someValue");
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+		try {
+			CommandLineBuilder.preprocessCommandLineArguments(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+
+		try {
+			CommandLineBuilder.preprocessCommandLineArguments(new String[]{
+					"Hello", null});
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+
+		try {
+			CommandLineBuilder.preprocessCommandLineArguments(new String[]{
+					"--commandsfile", "hello", null});
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testCommandsFileOption() throws Exception {
+		String[] args = {"Hello", "world"};
+		String[] result = CommandLineBuilder
+				.preprocessCommandLineArguments(args);
+		assertSame(args, result);
+
+		try {
+			args = new String[]{"Hello", "--commandsfile"};
+			CommandLineBuilder.preprocessCommandLineArguments(args);
+			fail("IllegalArgumentException expected");
+		} catch (IllegalArgumentException ex) {
+		}
+
+		try {
+			args = new String[]{"Hello", "--commandsfile", "hello.cmd"};
+			CommandLineBuilder.preprocessCommandLineArguments(args);
+			fail("IO Exception expected");
+		} catch (IOException ex) {
+		}
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/util/FileFinder2Test.groovy b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFinder2Test.java
similarity index 61%
rename from test/net/sourceforge/cobertura/util/FileFinder2Test.groovy
rename to cobertura/src/test/java/net/sourceforge/cobertura/util/FileFinder2Test.java
index 5e9bd5c..e3a39b6 100644
--- a/test/net/sourceforge/cobertura/util/FileFinder2Test.groovy
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFinder2Test.java
@@ -1,109 +1,116 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2008 Charlie Squires
- * Copyright (C) 2008 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package net.sourceforge.cobertura.util
-
-import junit.framework.TestCase
-import net.sourceforge.cobertura.test.util.TestUtil
-import net.sourceforge.cobertura.util.FileFinder
-
-public class FileFinder2Test extends TestCase {
-	
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	void setUp() throws Exception {
-	}
-	
-	public void testSearchJarsForSourceInJar() {
-		TestUtil.withTempDir { tempDir ->
-		
-			def zipFile = TestUtil.createSourceArchive(tempDir)
-			
-			//now test the FileFinder
-    		def fileFinder = new FileFinder();
-    		fileFinder.addSourceDirectory(zipFile.parentFile.absolutePath);
-    	
-    		def source = fileFinder.getSource(TestUtil.SIMPLE_SOURCE_PATHNAME)
-    		verifySource(source)
-    		
-    		/*
-    		 * Now make sure jar files are used.   Rename the zip file to be a jar file
-    		 */
-    		def jarFile = new File(zipFile.parentFile, "source.jar")
-    		assertTrue(zipFile.renameTo(jarFile))
-    		
-    		fileFinder = new FileFinder()
-    		fileFinder.addSourceDirectory(zipFile.parentFile.absolutePath)
-    		
-    		source = fileFinder.getSource(TestUtil.SIMPLE_SOURCE_PATHNAME)
-    		verifySource(source)
-		}
-    }
-	
-	def verifySource(source) {
-		assertNotNull(source)
-		assertNotNull(source.inputStream)
-		def sourceText = source.inputStream.text
-		assertEquals(TestUtil.SOURCE_TEXT, sourceText)
-		source.close()
-	}
-    
-    public void testSearchJarsForSourceNotFound() {
-        def fileFinder = new FileFinder();
-    	assertNull(fileFinder.searchJarsForSource("doesnotexist"))
-   }
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2008 Charlie Squires
+ * Copyright (C) 2008 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package net.sourceforge.cobertura.util;
+
+import net.sourceforge.cobertura.test.util.TestUtils;
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+
+import static org.junit.Assert.*;
+
+public class FileFinder2Test {
+	@Before
+	public void setUp() {
+	}
+
+	@Test
+	public void testSearchJarsForSourceInJar() throws IOException {
+		File tempDir = TestUtils.getTempDir();
+
+		File zipFile = TestUtils.createSourceArchive(tempDir);
+
+		//now test the FileFinder
+		FileFinder fileFinder = new FileFinder();
+		fileFinder
+				.addSourceDirectory(zipFile.getParentFile().getAbsolutePath());
+
+		Source source = fileFinder.getSource(TestUtils.SIMPLE_SOURCE_PATHNAME);
+		verifySource(source);
+
+		/*
+		 * Now make sure jar files are used.   Rename the zip file to be a jar file
+		 */
+		File jarFile = new File(zipFile.getParentFile(), "source.jar");
+		assertTrue(zipFile.renameTo(jarFile));
+
+		fileFinder = new FileFinder();
+		fileFinder
+				.addSourceDirectory(zipFile.getParentFile().getAbsolutePath());
+
+		source = fileFinder.getSource(TestUtils.SIMPLE_SOURCE_PATHNAME);
+		verifySource(source);
+	}
+
+	public void verifySource(Source source) throws IOException {
+		assertNotNull(source);
+		assertNotNull(source.getInputStream());
+		StringWriter writer = new StringWriter();
+		IOUtils.copy(source.getInputStream(), writer);
+		assertEquals(TestUtils.SOURCE_TEXT, writer.toString());
+		source.close();
+	}
+
+	@Test
+	public void testSearchJarsForSourceNotFound() {
+		FileFinder fileFinder = new FileFinder();
+		assertNull(fileFinder.getSource("doesnotexist"));
+	}
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFinderTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFinderTest.java
new file mode 100644
index 0000000..4fadb6a
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFinderTest.java
@@ -0,0 +1,165 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 James Seigel
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * 
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.IOException;
+
+public class FileFinderTest extends TestCase {
+	private FileFinder fileFinder;
+	private FileFixture fileFixture;
+
+	public void testGetSourceDirectoryList() {
+		assertEquals(4, fileFinder.getSourceDirectoryList().size());
+		assertTrue(new FileFinder().getSourceDirectoryList().isEmpty());
+
+		FileFinder ff = new FileFinder();
+		ff.addSourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0]);
+		assertEquals(1, ff.getSourceDirectoryList().size());
+		ff.addSourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]);
+		assertEquals(2, ff.getSourceDirectoryList().size());
+
+		ff = new FileFinder();
+		ff.addSourceFile(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0],
+				"com/example/Sample1.java");
+		ff.addSourceFile(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0],
+				"com/example/Sample2.java");
+		assertEquals(1, ff.getSourceDirectoryList().size());
+		ff.addSourceFile(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[1],
+				"com/example/Sample3.java");
+		assertEquals(2, ff.getSourceDirectoryList().size());
+		ff.addSourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]);
+		assertEquals(3, ff.getSourceDirectoryList().size());
+	}
+
+	private void checkFile(String fileName, String baseName, int sourceNum)
+			throws IOException {
+		File file = fileFinder.getFileForSource(fileName);
+		assertTrue(file.getAbsolutePath(), file.getAbsolutePath().indexOf(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[sourceNum]) != -1);
+		assertTrue(baseName.equals(file.getName()));
+		assertTrue(file.exists());
+		assertTrue(file.isFile());
+	}
+
+	public void testFindFile() throws IOException {
+		checkFile("com/example/Sample1.java", "Sample1.java", 0);
+		checkFile("com\\example\\Sample2.java", "Sample2.java", 0);
+		checkFile("com/example\\Sample3.java", "Sample3.java", 1);
+		checkFile("com/example/Sample4.java", "Sample4.java", 1);
+		checkFile("com/example/Sample5.java", "Sample5.java", 2);
+		checkFile("com/example/Sample6.java", "Sample6.java", 2);
+		checkFile("com\\example/Sample7.java", "Sample7.java", 3);
+	}
+
+	public void testFindFile_NotFound() {
+		try {
+			fileFinder.getFileForSource("com/example/Sample19.java");
+			fail("IOException expected");
+		} catch (IOException ex) {
+		}
+		try {
+			fileFinder.getFileForSource("com/example/Sample1.jav");
+			fail("IOException expected");
+		} catch (IOException ex) {
+		}
+		try {
+			fileFinder.getFileForSource("com/example/Sample7.java2");
+			fail("IOException expected");
+		} catch (IOException ex) {
+		}
+		try {
+			fileFinder.getFileForSource("Sample3.java");
+			fail("IOException expected");
+		} catch (IOException ex) {
+		}
+		try {
+			// This file exist, but is not added to fileFinder
+			fileFinder.getFileForSource("com/example/Sample8.java");
+			fail("IOException expected");
+		} catch (IOException ex) {
+		}
+	}
+
+	public void testFindFile_null() throws IOException {
+		try {
+			fileFinder.getFileForSource(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testAddSourceDirectory_null() {
+		try {
+			fileFinder.addSourceDirectory(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testAddSourceFile_null() {
+		try {
+			fileFinder.addSourceFile(null, "com/example/Sample1.java");
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+		try {
+			fileFinder.addSourceFile(
+					FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0], null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		fileFixture = new FileFixture();
+		fileFixture.setUp();
+
+		fileFinder = new FileFinder();
+		fileFinder.addSourceDirectory(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0]).toString());
+		fileFinder.addSourceDirectory(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[1]).toString());
+		fileFinder.addSourceFile(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(),
+				"com/example\\Sample5.java");
+		fileFinder.addSourceFile(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(),
+				"com/example/Sample6.java");
+		fileFinder.addSourceFile(fileFixture.sourceDirectory(
+				FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(),
+				"com/example/Sample7.java");
+
+		// Do not add com/example/Sample8.java
+		// fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(), "com/example/Sample8.java");
+	}
+
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		fileFixture.tearDown();
+	}
+
+}
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFixture.java b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFixture.java
new file mode 100644
index 0000000..958d136
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFixture.java
@@ -0,0 +1,130 @@
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 James Seigel
+ * Copyright (C) 2005 Grzegorz Lukasik
+ * Copyright (C) 2008 John Lewis
+ * 
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashMap;
+
+// Creates structre:
+//  src0/
+//    com/
+//      example/
+//        Sample1.java (contains a @Deprecated annotation to make sure the complexity works with annotations)
+//        Sample2.java
+//  src1/
+//    com/
+//      example/
+//        Sample3.java
+//        Sample4.java
+//  src2/
+//    com/
+//      example/
+//        Sample5.java
+//        Sample6.java
+//  src3/
+//    com/
+//      example/
+//        Sample7.java
+//        Sample8.java
+public class FileFixture {
+	public static final String[] SOURCE_DIRECTORY_IDENTIFIER = {"src0", "src1",
+			"src2", "src3"};
+	public HashMap sourceDirectories;
+
+	public void setUp() throws IOException {
+		File tempFile = File.createTempFile("temp", ".tmp");
+		tempFile.deleteOnExit();
+		sourceDirectories = new HashMap();
+
+		for (int i = 0; i < SOURCE_DIRECTORY_IDENTIFIER.length; i++) {
+			File directory = new File(tempFile.getParent(),
+					SOURCE_DIRECTORY_IDENTIFIER[i]);
+			directory.mkdir();
+			filesUnderSourceDir(directory, 1 + i * 2);
+			sourceDirectories.put(SOURCE_DIRECTORY_IDENTIFIER[i], directory);
+		}
+	}
+
+	private void filesUnderSourceDir(File srcDirectory, int number)
+			throws IOException, FileNotFoundException {
+		File sub = new File(srcDirectory, "com");
+		sub.mkdir();
+		File temp = new File(sub, "example");
+		temp.mkdir();
+		File sample1 = new File(temp, "Sample" + number + ".java");
+		sample1.createNewFile();
+		FileWriter writer1 = new FileWriter(sample1);
+		writer1.write("package com.example;\n");
+		writer1.write("public class Sample" + number + " {\n");
+		/*
+		 * Add an annotation to make sure the complexity works with them
+		 */
+		if (number == 1) {
+			writer1.write("@Deprecated\n");
+		}
+		writer1.write("    public void someMethod(int v) {\n");
+		writer1.write("        if(v<0) System.out.println();\n");
+		writer1.write("        else System.out.println('x');\n");
+		writer1.write("    }\n");
+		writer1.write("}\n");
+		writer1.close();
+
+		File sample2 = new File(temp, "Sample" + (number + 1) + ".java");
+		sample2.createNewFile();
+		FileWriter writer2 = new FileWriter(sample2);
+		writer2.write("package com.example;\n");
+		writer2.write("class Sample" + (number + 1) + " {\n");
+		writer2.write("    private String otherMethod() {\n");
+		writer2.write("        return \"OtherValue\";\n");
+		writer2.write("    }\n");
+		writer2.write("}\n");
+		writer2.close();
+	}
+
+	protected void deleteTree(File fileRoot) {
+		if (fileRoot.isFile()) {
+			fileRoot.delete();
+			return;
+		}
+
+		File[] files = fileRoot.listFiles();
+		for (int i = 0; i < files.length; i++) {
+			deleteTree(files[i]);
+		}
+		fileRoot.delete();
+	}
+
+	public void tearDown() {
+		for (int i = 0; i < SOURCE_DIRECTORY_IDENTIFIER.length; i++) {
+			deleteTree(sourceDirectory(SOURCE_DIRECTORY_IDENTIFIER[i]));
+		}
+	}
+
+	public File sourceDirectory(String directoryIdentifier) {
+		return (File) sourceDirectories.get(directoryIdentifier);
+	}
+}
diff --git a/test/net/sourceforge/cobertura/util/FileFlooder.java b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFlooder.java
similarity index 68%
rename from test/net/sourceforge/cobertura/util/FileFlooder.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/util/FileFlooder.java
index 918f9ca..918705d 100644
--- a/test/net/sourceforge/cobertura/util/FileFlooder.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/util/FileFlooder.java
@@ -1,87 +1,77 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Jeremy Thomerson
- * 
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-
-import org.apache.log4j.Logger;
-
-/**
- * I used this class to flood aa directory with files to test a fix for a guy
- * that had a ton of files mixed with his code.  You could use it to do similar
- * for fixes / testing / misc.
- * 
- * @author Jeremy Thomerson
- */
-public class FileFlooder
-{
-
-	private static final Logger LOGGER = Logger.getLogger(FileFlooder.class);
-
-	public static void flood(String directory, String fileName, String fileExt, int numOfFiles,
-			int linesPerFile)
-	{
-		File dir = new File(directory);
-		if (dir.exists() && dir.isDirectory())
-		{
-			for (int i = 1; i <= numOfFiles; i++)
-			{
-				FileWriter writer = null;
-				try
-				{
-					File file = new File(directory + "/" + fileName + i + "." + fileExt);
-					LOGGER.info("Writing file: " + file.getAbsolutePath());
-					writer = new FileWriter(file);
-					for (int l = 1; l <= linesPerFile; l++)
-					{
-						writer.write("This is a test file. blah.... blah.... blah....\n");
-					}
-				}
-				catch (IOException ioe)
-				{
-					LOGGER.error("Error while writing file.", ioe);
-				}
-				finally
-				{
-					if (writer != null)
-						try
-						{
-							writer.close();
-						}
-						catch (IOException e)
-						{
-							//Nothing we can do here
-						}
-				}
-			}
-		}
-	}
-
-	public static void main(String[] args)
-	{
-		FileFlooder.flood(".", "file", "txt", 100, 1000);
-		System.out.println("done");
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Jeremy Thomerson
+ * 
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * I used this class to flood aa directory with files to test a fix for a guy
+ * that had a ton of files mixed with his code.  You could use it to do similar
+ * for fixes / testing / misc.
+ *
+ * @author Jeremy Thomerson
+ */
+public class FileFlooder {
+
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(FileFlooder.class);
+
+	public static void flood(String directory, String fileName, String fileExt,
+			int numOfFiles, int linesPerFile) {
+		File dir = new File(directory);
+		if (dir.exists() && dir.isDirectory()) {
+			for (int i = 1; i <= numOfFiles; i++) {
+				FileWriter writer = null;
+				try {
+					File file = new File(directory + "/" + fileName + i + "."
+							+ fileExt);
+					LOGGER.info("Writing file: " + file.getAbsolutePath());
+					writer = new FileWriter(file);
+					for (int l = 1; l <= linesPerFile; l++) {
+						writer
+								.write("This is a test file. blah.... blah.... blah....\n");
+					}
+				} catch (IOException ioe) {
+					LOGGER.error("Error while writing file.", ioe);
+				} finally {
+					if (writer != null)
+						try {
+							writer.close();
+						} catch (IOException e) {
+							//Nothing we can do here
+						}
+				}
+			}
+		}
+	}
+
+	public static void main(String[] args) {
+		FileFlooder.flood(".", "file", "txt", 100, 1000);
+		System.out.println("done");
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/util/IOUtilTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/util/IOUtilTest.java
similarity index 74%
rename from test/net/sourceforge/cobertura/util/IOUtilTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/util/IOUtilTest.java
index 5afd43f..78ea8ae 100644
--- a/test/net/sourceforge/cobertura/util/IOUtilTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/util/IOUtilTest.java
@@ -1,196 +1,164 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.util;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import junit.framework.TestCase;
-
-/**
- * @author Grzegorz Lukasik
- */
-public class IOUtilTest extends TestCase
-{
-
-	private static final byte[] emptyByteArray = new byte[] {};
-
-	private static final byte[] singletonByteArray = new byte[] { 7 };
-
-	private static final byte[] smallByteArray = new byte[] { 1, 0, 2, -128,
-			127 };
-
-	private File createFileWithData(byte[] data) throws IOException
-	{
-		File file = File.createTempFile("IOUtilTest", ".txt");
-		file.deleteOnExit();
-		OutputStream src = new FileOutputStream(file);
-		src.write(data);
-		src.close();
-		return file;
-	}
-
-	public void testMoveFile() throws IOException
-	{
-		// Move file if destination does not exist
-		File srcFile = createFileWithData(smallByteArray);
-		File destFile = createFileWithData(emptyByteArray);
-		destFile.delete();
-		assertTrue(!destFile.isFile());
-		IOUtil.moveFile(srcFile, destFile);
-		assertTrue(destFile.isFile());
-		InputStream in = new FileInputStream(destFile);
-		for (int i = 0; i < smallByteArray.length; i++)
-			assertEquals(smallByteArray[i], (byte)in.read());
-		assertEquals(-1, in.read());
-		in.close();
-
-		// Move file if destination exists
-		srcFile = createFileWithData(singletonByteArray);
-		destFile = createFileWithData(smallByteArray);
-		IOUtil.moveFile(srcFile, destFile);
-		assertTrue(destFile.isFile());
-		in = new FileInputStream(destFile);
-		for (int i = 0; i < singletonByteArray.length; i++)
-			assertEquals(singletonByteArray[i], (byte)in.read());
-		assertEquals(-1, in.read());
-		in.close();
-
-		// Pass null values
-		srcFile = createFileWithData(smallByteArray);
-		try
-		{
-			IOUtil.moveFile(srcFile, null);
-			fail("Expected NullPointerException");
-		}
-		catch (NullPointerException ex)
-		{
-		}
-
-		destFile = createFileWithData(smallByteArray);
-		try
-		{
-			IOUtil.moveFile(null, destFile);
-			fail("Expected NullPointerException");
-		}
-		catch (NullPointerException ex)
-		{
-		}
-	}
-
-	public void testCopyStream() throws IOException
-	{
-		ByteArrayInputStream in = new ByteArrayInputStream(smallByteArray);
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		IOUtil.copyStream(in, out);
-		assertEquals(smallByteArray, out.toByteArray());
-
-		in = new ByteArrayInputStream(singletonByteArray);
-		out = new ByteArrayOutputStream();
-		IOUtil.copyStream(in, out);
-		assertEquals(singletonByteArray, out.toByteArray());
-
-		in = new ByteArrayInputStream(emptyByteArray);
-		out = new ByteArrayOutputStream();
-		IOUtil.copyStream(in, out);
-		assertEquals(emptyByteArray, out.toByteArray());
-
-		byte[] bigArray = generateBigByteArray();
-		in = new ByteArrayInputStream(bigArray);
-		out = new ByteArrayOutputStream();
-		IOUtil.copyStream(in, out);
-		assertEquals(bigArray, out.toByteArray());
-
-		try
-		{
-			IOUtil.copyStream(null, new ByteArrayOutputStream());
-			fail("NullPointerException expected");
-		}
-		catch (NullPointerException ex)
-		{
-		}
-
-		try
-		{
-			IOUtil.copyStream(new ByteArrayInputStream(bigArray), null);
-			fail("NullPointerException expected");
-		}
-		catch (NullPointerException ex)
-		{
-		}
-	}
-
-	public void testFillByteArrayFromInputStream() throws IOException
-	{
-		byte[] out = IOUtil
-				.createByteArrayFromInputStream(new ByteArrayInputStream(
-						smallByteArray));
-		assertEquals(smallByteArray, out);
-
-		out = IOUtil.createByteArrayFromInputStream(new ByteArrayInputStream(
-				emptyByteArray));
-		assertEquals(emptyByteArray, out);
-
-		out = IOUtil.createByteArrayFromInputStream(new ByteArrayInputStream(
-				singletonByteArray));
-		assertEquals(singletonByteArray, out);
-
-		byte[] bigArray = generateBigByteArray();
-		out = IOUtil.createByteArrayFromInputStream(new ByteArrayInputStream(
-				bigArray));
-		assertEquals(bigArray, out);
-
-		try
-		{
-			IOUtil.createByteArrayFromInputStream(null);
-			fail("NullPointerException expected");
-		}
-		catch (NullPointerException ex)
-		{
-		}
-	}
-
-	private void assertEquals(byte[] first, byte[] second)
-	{
-		assertEquals(first.length, second.length);
-		for (int i = 0; i < first.length; i++)
-		{
-			assertEquals(first[i], second[i]);
-		}
-	}
-
-	private byte[] generateBigByteArray()
-	{
-		byte[] bigArray = new byte[1000000];
-		for (int i = 0; i < bigArray.length; i++)
-		{
-			bigArray[i] = (byte)i;
-		}
-		return bigArray;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Grzegorz Lukasik
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+package net.sourceforge.cobertura.util;
+
+import junit.framework.TestCase;
+
+import java.io.*;
+
+/**
+ * @author Grzegorz Lukasik
+ */
+public class IOUtilTest extends TestCase {
+
+	private static final byte[] emptyByteArray = new byte[]{};
+
+	private static final byte[] singletonByteArray = new byte[]{7};
+
+	private static final byte[] smallByteArray = new byte[]{1, 0, 2, -128, 127};
+
+	private File createFileWithData(byte[] data) throws IOException {
+		File file = File.createTempFile("IOUtilTest", ".txt");
+		file.deleteOnExit();
+		OutputStream src = new FileOutputStream(file);
+		src.write(data);
+		src.close();
+		return file;
+	}
+
+	public void testMoveFile() throws IOException {
+		// Move file if destination does not exist
+		File srcFile = createFileWithData(smallByteArray);
+		File destFile = createFileWithData(emptyByteArray);
+		destFile.delete();
+		assertTrue(!destFile.isFile());
+		IOUtil.moveFile(srcFile, destFile);
+		assertTrue(destFile.isFile());
+		InputStream in = new FileInputStream(destFile);
+		for (int i = 0; i < smallByteArray.length; i++)
+			assertEquals(smallByteArray[i], (byte) in.read());
+		assertEquals(-1, in.read());
+		in.close();
+
+		// Move file if destination exists
+		srcFile = createFileWithData(singletonByteArray);
+		destFile = createFileWithData(smallByteArray);
+		IOUtil.moveFile(srcFile, destFile);
+		assertTrue(destFile.isFile());
+		in = new FileInputStream(destFile);
+		for (int i = 0; i < singletonByteArray.length; i++)
+			assertEquals(singletonByteArray[i], (byte) in.read());
+		assertEquals(-1, in.read());
+		in.close();
+
+		// Pass null values
+		srcFile = createFileWithData(smallByteArray);
+		try {
+			IOUtil.moveFile(srcFile, null);
+			fail("Expected NullPointerException");
+		} catch (NullPointerException ex) {
+		}
+
+		destFile = createFileWithData(smallByteArray);
+		try {
+			IOUtil.moveFile(null, destFile);
+			fail("Expected NullPointerException");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testCopyStream() throws IOException {
+		ByteArrayInputStream in = new ByteArrayInputStream(smallByteArray);
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		IOUtil.copyStream(in, out);
+		assertEquals(smallByteArray, out.toByteArray());
+
+		in = new ByteArrayInputStream(singletonByteArray);
+		out = new ByteArrayOutputStream();
+		IOUtil.copyStream(in, out);
+		assertEquals(singletonByteArray, out.toByteArray());
+
+		in = new ByteArrayInputStream(emptyByteArray);
+		out = new ByteArrayOutputStream();
+		IOUtil.copyStream(in, out);
+		assertEquals(emptyByteArray, out.toByteArray());
+
+		byte[] bigArray = generateBigByteArray();
+		in = new ByteArrayInputStream(bigArray);
+		out = new ByteArrayOutputStream();
+		IOUtil.copyStream(in, out);
+		assertEquals(bigArray, out.toByteArray());
+
+		try {
+			IOUtil.copyStream(null, new ByteArrayOutputStream());
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+
+		try {
+			IOUtil.copyStream(new ByteArrayInputStream(bigArray), null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	public void testFillByteArrayFromInputStream() throws IOException {
+		byte[] out = IOUtil
+				.createByteArrayFromInputStream(new ByteArrayInputStream(
+						smallByteArray));
+		assertEquals(smallByteArray, out);
+
+		out = IOUtil.createByteArrayFromInputStream(new ByteArrayInputStream(
+				emptyByteArray));
+		assertEquals(emptyByteArray, out);
+
+		out = IOUtil.createByteArrayFromInputStream(new ByteArrayInputStream(
+				singletonByteArray));
+		assertEquals(singletonByteArray, out);
+
+		byte[] bigArray = generateBigByteArray();
+		out = IOUtil.createByteArrayFromInputStream(new ByteArrayInputStream(
+				bigArray));
+		assertEquals(bigArray, out);
+
+		try {
+			IOUtil.createByteArrayFromInputStream(null);
+			fail("NullPointerException expected");
+		} catch (NullPointerException ex) {
+		}
+	}
+
+	private void assertEquals(byte[] first, byte[] second) {
+		assertEquals(first.length, second.length);
+		for (int i = 0; i < first.length; i++) {
+			assertEquals(first[i], second[i]);
+		}
+	}
+
+	private byte[] generateBigByteArray() {
+		byte[] bigArray = new byte[1000000];
+		for (int i = 0; i < bigArray.length; i++) {
+			bigArray[i] = (byte) i;
+		}
+		return bigArray;
+	}
+
+}
diff --git a/test/net/sourceforge/cobertura/util/StringUtilTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/util/StringUtilTest.java
similarity index 82%
rename from test/net/sourceforge/cobertura/util/StringUtilTest.java
rename to cobertura/src/test/java/net/sourceforge/cobertura/util/StringUtilTest.java
index 9961f5b..52605f6 100644
--- a/test/net/sourceforge/cobertura/util/StringUtilTest.java
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/util/StringUtilTest.java
@@ -1,60 +1,56 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Jeremy Thomerson
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import junit.framework.TestCase;
-
-/**
- * @author Jeremy Thomerson
- */
-public class StringUtilTest extends TestCase
-{
-
-	public void testReplace()
-	{
-		String result;
-		result = StringUtil.replaceAll(
-				"cobertura is a very, very cool coverage tool", "very",
-				"really");
-		assertEquals("cobertura is a really, really cool coverage tool",
-				result);
-
-		result = StringUtil.replaceAll("<init>V", "<", "<");
-		result = StringUtil.replaceAll(result, ">", ">");
-		assertEquals(result, "<init>V");
-
-		result = StringUtil.replaceAll("<init>V", "<", "<");
-		result = StringUtil.replaceAll(result, ">", ">");
-		assertEquals(result, "<init>V");
-		
-		assertEquals(null, StringUtil.replaceAll(null, "something", "anything"));
-	}
-
-   public void testGetPercentValue() {
-      assertEquals("99%", StringUtil.getPercentValue((double) 199/200));
-   }
-   
-	public static void main(String[] args)
-	{
-		new StringUtilTest().testReplace();
-	}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2005 Jeremy Thomerson
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package net.sourceforge.cobertura.util;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Jeremy Thomerson
+ */
+public class StringUtilTest extends TestCase {
+
+	public void testReplace() {
+		String result;
+		result = StringUtil.replaceAll(
+				"cobertura is a very, very cool coverage tool", "very",
+				"really");
+		assertEquals("cobertura is a really, really cool coverage tool", result);
+
+		result = StringUtil.replaceAll("<init>V", "<", "<");
+		result = StringUtil.replaceAll(result, ">", ">");
+		assertEquals(result, "<init>V");
+
+		result = StringUtil.replaceAll("<init>V", "<", "<");
+		result = StringUtil.replaceAll(result, ">", ">");
+		assertEquals(result, "<init>V");
+
+		assertEquals(null, StringUtil.replaceAll(null, "something", "anything"));
+	}
+
+	public void testGetPercentValue() {
+		assertEquals("99%", StringUtil.getPercentValue((double) 199 / 200));
+	}
+
+	public static void main(String[] args) {
+		new StringUtilTest().testReplace();
+	}
 }
\ No newline at end of file
diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/webapp/test/WebAppFunctionalTest.java b/cobertura/src/test/java/net/sourceforge/cobertura/webapp/test/WebAppFunctionalTest.java
new file mode 100644
index 0000000..5a9baa5
--- /dev/null
+++ b/cobertura/src/test/java/net/sourceforge/cobertura/webapp/test/WebAppFunctionalTest.java
@@ -0,0 +1,383 @@
+package net.sourceforge.cobertura.webapp.test;
+
+import static org.junit.Assert.*;
+
+import groovy.util.Node;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Arrays;
+
+import net.sourceforge.cobertura.ant.InstrumentTask;
+import net.sourceforge.cobertura.ant.ReportTask;
+import net.sourceforge.cobertura.test.util.TestUtils;
+import net.sourceforge.cobertura.webapp.FlushCoberturaServlet;
+
+import org.apache.commons.io.FileUtils;
+
+import org.apache.tools.ant.taskdefs.Javac;
+import org.apache.tools.ant.taskdefs.War;
+import org.apache.tools.ant.taskdefs.Zip;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.ZipFileSet;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mortbay.jetty.testing.HttpTester;
+import org.mortbay.jetty.testing.ServletTester;
+
+/**
+ * 
+ * This test tests the functional FlushCoberturaServlet used for jetty sevlets.
+ * 
+ * We use the ServletTester API to remove the sensitive tests that were in
+ * the previous versions of cobertura.
+ * 
+ * @author schristou88
+ *
+ */
+public class WebAppFunctionalTest {
+	ServletTester tester;
+	HttpTester request;
+	HttpTester response;
+	File tempDir = TestUtils.getTempDir();
+	public static final String SIMPLE_SERVLET_CLASSNAME = "com.acme.servlet.SimpleServlet";
+	private static final String SAVE_DATA_METHOD_NAME = "doGet";
+
+	@Before
+	public void setUp() throws Exception {
+		FileUtils.deleteDirectory(tempDir);
+		FileUtils.deleteQuietly(new File("cobertura.ser"));
+		FileUtils.deleteQuietly(new File(tempDir.getAbsolutePath(),
+				"coverage.xml"));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		if (tester != null)
+			tester.stop();
+	}
+
+	@Test
+	public void testServletCreation() throws Exception {
+		startUpServlet();
+		pingServer();
+	}
+
+	@Test
+	public void testCoberturaServlet() throws Exception {
+		startUpServlet();
+		pingCoberturaServer();
+	}
+
+	@Test
+	public void testFlushCoberturaData() throws Exception {
+		createSimpleWar();
+
+		createCoberturaServlet();
+
+		createCoberturaJar();
+
+		instrumentWar();
+
+		startUpServlet();
+
+		pingServer();
+
+		generateReportFile();
+
+		Node dom = TestUtils.getXMLReportDOM(new File(
+				tempDir.getAbsolutePath(), "coverage.xml"));
+
+		int hitCountBefore = TestUtils.getHitCount(dom,
+				SIMPLE_SERVLET_CLASSNAME, SAVE_DATA_METHOD_NAME);
+
+		assertEquals(0, hitCountBefore);
+
+		pingCoberturaServer();
+
+		generateReportFile();
+
+		dom = TestUtils.getXMLReportDOM(new File(tempDir.getAbsolutePath(),
+				"coverage.xml"));
+
+		int hitCountAfter = TestUtils.getHitCount(dom,
+				SIMPLE_SERVLET_CLASSNAME, SAVE_DATA_METHOD_NAME);
+
+		tester.stop();
+
+		assertEquals("Hit count should have increased by one",
+				hitCountBefore + 1, hitCountAfter);
+	}
+
+	@Test
+	public void testFlushCoberturaData2() throws Exception {
+		createSimpleWar();
+
+		createCoberturaServlet();
+
+		createCoberturaJar();
+
+		instrumentWar();
+
+		startUpServlet();
+
+		pingServer();
+
+		generateReportFile();
+
+		Node dom = TestUtils.getXMLReportDOM(new File(
+				tempDir.getAbsolutePath(), "coverage.xml"));
+
+		int hitCountBefore = TestUtils.getHitCount(dom,
+				SIMPLE_SERVLET_CLASSNAME, SAVE_DATA_METHOD_NAME);
+
+		assertEquals(0, hitCountBefore);
+
+		pingCoberturaServer();
+
+		generateReportFile();
+
+		dom = TestUtils.getXMLReportDOM(new File(tempDir.getAbsolutePath(),
+				"coverage.xml"));
+
+		int hitCountAfter = TestUtils.getHitCount(dom,
+				SIMPLE_SERVLET_CLASSNAME, SAVE_DATA_METHOD_NAME);
+
+		assertEquals(2, hitCountAfter);
+
+		tester.stop();
+
+		generateReportFile();
+
+		dom = TestUtils.getXMLReportDOM(new File(tempDir.getAbsolutePath(),
+				"coverage.xml"));
+
+		int hitCountFinal = TestUtils.getHitCount(dom,
+				SIMPLE_SERVLET_CLASSNAME, SAVE_DATA_METHOD_NAME);
+
+		assertEquals(hitCountAfter, hitCountFinal);
+	}
+
+	@Test
+	public void testFlushCoberturaDataOnly() throws Exception {
+		createSimpleWar();
+
+		createCoberturaServlet();
+
+		createCoberturaJar();
+
+		instrumentWar();
+
+		startUpServlet();
+
+		generateReportFile();
+
+		Node dom = TestUtils.getXMLReportDOM(new File(
+				tempDir.getAbsolutePath(), "coverage.xml"));
+
+		int hitCountBefore = TestUtils.getHitCount(dom,
+				SIMPLE_SERVLET_CLASSNAME, SAVE_DATA_METHOD_NAME);
+
+		assertEquals(0, hitCountBefore);
+
+		generateReportFile();
+
+		dom = TestUtils.getXMLReportDOM(new File(tempDir.getAbsolutePath(),
+				"coverage.xml"));
+
+		int hitCountAfter = TestUtils.getHitCount(dom,
+				SIMPLE_SERVLET_CLASSNAME, SAVE_DATA_METHOD_NAME);
+
+		assertEquals(0, hitCountAfter);
+
+		tester.stop();
+
+		generateReportFile();
+
+		dom = TestUtils.getXMLReportDOM(new File(tempDir.getAbsolutePath(),
+				"coverage.xml"));
+
+		int finalCount = TestUtils.getHitCount(dom, SIMPLE_SERVLET_CLASSNAME,
+				SAVE_DATA_METHOD_NAME);
+
+		assertEquals(0, finalCount);
+
+	}
+
+	public void startUpServlet() throws Exception {
+		tester = new ServletTester();
+		request = new HttpTester();
+		response = new HttpTester();
+
+		ClassLoader loader = createClassLoader();
+		tester.setClassLoader(loader);
+
+		tester.addServlet("com.acme.servlet.SimpleServlet",
+				"/simple/SimpleServlet");
+		tester.addServlet(FlushCoberturaServlet.class,
+				"/coberturaFlush/flushCobertura");
+		tester.start();
+
+		request.setMethod("GET");
+		request.setHeader("host", "tester");
+		request.setVersion("HTTP/1.0");
+	}
+
+	public void pingServer() throws Exception {
+		request.setURI("/simple/SimpleServlet");
+		response.parse(tester.getResponses(request.generate()));
+		assertNull(response.getMethod());
+		assertEquals(200, response.getStatus());
+		assertEquals("Hi", response.getContent().trim());
+	}
+
+	public void pingCoberturaServer() throws Exception {
+		request.setURI("/coberturaFlush/flushCobertura");
+		response.parse(tester.getResponses(request.generate()));
+		assertNull(response.getMethod());
+		assertEquals(200, response.getStatus());
+		assertNull(response.getContent());
+	}
+
+	private void createSimpleWar() throws IOException {
+		File webappsDir = new File(tempDir, "webapps");
+		File war = new File(webappsDir, "simple.war");
+
+		File classesDir = new File("target/build/simpleWarClasses/");
+		if (!classesDir.exists())
+			classesDir.mkdirs();
+
+		FileUtils.copyDirectory(new File("target/test-classes/com"), new File(
+				classesDir, "com"));
+
+		War antWar = new War();
+		antWar.setProject(TestUtils.project);
+		antWar.setDestFile(war);
+		antWar.setWebxml(new File("src/test/resources/testJetty/web.xml"));
+
+		ZipFileSet classesFileSet = new ZipFileSet();
+		classesFileSet.setDir(classesDir);
+
+		antWar.addClasses(classesFileSet);
+		antWar.execute();
+	}
+
+	private void createCoberturaServlet() {
+		File webappsDir = new File(TestUtils.getTempDir(), "webapps");
+		File war = new File(webappsDir, "coberturaFlush.war");
+
+		File classesDir = new File("target/build/warClasses");
+		if (!classesDir.exists())
+			classesDir.mkdirs();
+		Javac javac = new Javac();
+		javac.setProject(TestUtils.project);
+		javac.setSrcdir(new Path(TestUtils.project, "src/main/java"));
+		javac.setDestdir(classesDir);
+		javac.setDebug(true);
+
+		Path classpath = new Path(TestUtils.project);
+		FileSet jettyFileSet = new FileSet();
+		jettyFileSet.setDir(new File("src/test/resources/jetty"));
+		jettyFileSet.setIncludes("**/*.jar");
+		classpath.addFileset(jettyFileSet);
+
+		javac.setIncludes("**/FlushCoberturaServlet.java");
+
+		javac.setClasspath(classpath);
+		javac.execute();
+
+		War antWar = new War();
+		antWar.setProject(TestUtils.project);
+		antWar.setDestFile(war);
+		antWar.setWebxml(new File(
+				"src/main/resources/net/sourceforge/cobertura/webapp/web.xml"));
+
+		ZipFileSet classesFileSet = new ZipFileSet();
+		classesFileSet.setDir(classesDir);
+
+		antWar.addClasses(classesFileSet);
+		antWar.execute();
+	}
+
+	private ClassLoader createClassLoader() throws Exception {
+		File simplewar = new File(tempDir, "webapps/simple.war");
+		File coberturawar = new File(tempDir, "webapps/coberturaFlush.war");
+		File coberturaJar = new File(tempDir, "lib/cobertura.jar");
+
+		@SuppressWarnings("deprecation")
+		URL[] urls = new URL[]{simplewar.toURL(), coberturawar.toURL(),
+				coberturaJar.toURL()};
+
+		System.out.println(Arrays.toString(urls));
+
+		// Create a new class loader with the directory
+
+		return new URLClassLoader(urls);
+	}
+
+	private void createCoberturaJar() {
+		File coberturaJar = new File(tempDir, "lib/cobertura.jar");
+		File coberturaClassDir = TestUtils.getCoberturaClassDir();
+
+		Zip zip = new Zip();
+		zip.setProject(TestUtils.project);
+		zip.setDestFile(coberturaJar);
+
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(coberturaClassDir);
+
+		zip.addFileset(fileSet);
+		zip.execute();
+	}
+
+	private void instrumentWar() {
+		instrumentWar(new File(tempDir, "webapps/simple.war"));
+		// Future: There is an issue with ServetTester api and adding a custom classloader.
+		// When specify the instrumented .war file it still prefers to use the
+		// target/test-classes/**/*.class files instead. In this situation we instrument the
+		// classes directly but a better solution should be provided for this.
+		instrumentClasses(new File(
+				"target/test-classes/com/acme/servlet/SimpleServlet.class"));
+	}
+
+	private void instrumentClasses(File classesDir) {
+		InstrumentTask instrumentTask = new InstrumentTask();
+		instrumentTask.setProject(TestUtils.project);
+		instrumentTask.setDataFile("cobertura.ser");
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(classesDir.getParentFile());
+		fileSet.setIncludes("**/*.class");
+
+		instrumentTask.addFileset(fileSet);
+		instrumentTask.execute();
+	}
+
+	private void instrumentWar(File warFile) {
+		InstrumentTask instrumentTask = new InstrumentTask();
+		instrumentTask.setProject(TestUtils.project);
+		instrumentTask.setDataFile("cobertura.ser");
+		FileSet fileSet = new FileSet();
+		fileSet.setDir(warFile.getParentFile());
+		fileSet.setIncludes("**/*.war");
+
+		instrumentTask.addFileset(fileSet);
+		instrumentTask.execute();
+	}
+
+	public void generateReportFile() {
+		File xmlReport = new File(tempDir.getAbsolutePath(), "coverage.xml");
+
+		ReportTask reportTask = new ReportTask();
+		reportTask.setProject(TestUtils.project);
+		reportTask.setDataFile("cobertura.ser");
+		reportTask.setFormat("xml");
+		reportTask.setDestDir(new File(xmlReport.getParent()));
+		reportTask.execute();
+	}
+}
diff --git a/cobertura/src/test/java/test/condition/ConditionCalls.java b/cobertura/src/test/java/test/condition/ConditionCalls.java
new file mode 100644
index 0000000..a82d082
--- /dev/null
+++ b/cobertura/src/test/java/test/condition/ConditionCalls.java
@@ -0,0 +1,107 @@
+package test.condition;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConditionCalls {
+
+	/*
+	 * See the note at FirstPassMethodInstrumenter.visitJumpInsn()
+	 * regarding initialization of static variables.  This next static
+	 * is intended to cover that condition.
+	 */
+	public static String whatEver = null;
+	private static final Logger logger = LoggerFactory
+			.getLogger(ConditionCalls.class);
+
+	public void call(int i) {
+		if (i >= 5) //set CALL_CONDITION_LINE_NUMBER to this line number
+		{
+			try {
+				logger.error("whatEver"); //set CALL_IGNORE_LINE_NUMBER to this line number
+				throw new RuntimeException();
+			} catch (Throwable t) {
+				//eat it
+			} finally {
+				System.out.println("true");
+			}
+		} else {
+			System.out.println("false");
+		}
+	}
+
+	public void callLookupSwitch(int branch) {
+		switch (branch) //set LOOKUP_SWITCH_LINE_NUMBER to this line number
+		{
+			case 1 :
+				System.out.println("1");
+				break;
+			case 5 :
+				System.out.println("5");
+				break;
+			default :
+				System.out.println("default");
+				break;
+		}
+	}
+
+	public String callTableSwitch(int branch) {
+		int[][] multiArray;
+		switch (branch) //set TABLE_SWITCH_LINE_NUMBER to this line number
+		{
+			case 0 :
+				return ("0");
+			case 1 :
+				return ("1");
+			case 2 :
+				return ("2");
+			case 3 :
+				return ("3");
+			case 4 :
+				return ("4");
+			case 5 :
+				return ("5");
+			case 6 :
+				return ("6");
+			case 7 :
+				return ("7");
+			case 8 :
+				return ("8");
+			default :
+				multiArray = new int[3][3];
+				return ("" + multiArray[1][1]);
+		}
+	}
+
+	public void callMultiCondition(int a, int b, int c) {
+		//The c++ is to get SecondPassMethodInstrumenter.visitIincInsn called.
+		if ((a == b) && (b >= 3) || (c++ < a)) //set MULTI_CONDITION_LINE_NUMBER to this line number
+		{
+			System.out.println("true");
+		}
+	}
+
+	public void callMultiCondition2(int a, int b, int c) {
+		if ((a == b) && (b >= utilEcho(3)) || (c < a)) //set MULTI_CONDITION2_LINE_NUMBER to this line number
+		{
+			System.out.println("true");
+		}
+	}
+
+	int utilEcho(int number) {
+		return number;
+	}
+
+	static {
+		whatEver = "whatEver";
+	}
+
+	;
+
+	public static final int CALL_CONDITION_LINE_NUMBER = 17;
+	public static final int CALL_IGNORE_LINE_NUMBER = 21;
+	public static final int LOOKUP_SWITCH_LINE_NUMBER = 39;
+	public static final int TABLE_SWITCH_LINE_NUMBER = 56;
+	public static final int MULTI_CONDITION_LINE_NUMBER = 74;
+	public static final int MULTI_CONDITION2_LINE_NUMBER = 82;
+}
diff --git a/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/.gitignore b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/.gitignore
new file mode 100644
index 0000000..18a60f9
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/.gitignore
@@ -0,0 +1,3 @@
+/classes/
+/instrumented/
+/reports/
diff --git a/examples/functionalconditiontest/README b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/README
similarity index 100%
copy from examples/functionalconditiontest/README
copy to cobertura/src/test/resources/ant/IgnoreMethodAnnotation/README
diff --git a/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/build.properties b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/build.properties
new file mode 100644
index 0000000..6257ed6
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/build.properties
@@ -0,0 +1,12 @@
+
+# The path to cobertura.jar
+cobertura.dir=../..
+
+root.dir=src/test/resources/ant/IgnoreMethodAnnotation
+
+src.dir=${root.dir}/src
+classes.dir=${root.dir}/classes
+instrumented.dir=${root.dir}/instrumented
+reports.dir=${root.dir}/reports
+coverage.xml.dir=${reports.dir}/cobertura-xml
+coverage.html.dir=${reports.dir}/cobertura-html
diff --git a/examples/functionalconditiontest/build.xml b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/build.xml
similarity index 87%
copy from examples/functionalconditiontest/build.xml
copy to cobertura/src/test/resources/ant/IgnoreMethodAnnotation/build.xml
index 3dafe1c..67cac61 100644
--- a/examples/functionalconditiontest/build.xml
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/build.xml
@@ -1,98 +1,96 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura.examples.functionalconditiontest" basedir="." default="help">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2005 Mark Doliner
-	Copyright (C) 2006 John Lewis
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<property file="build.properties" />
-
-	<path id="project.classpath">
-		<path path="${java.class.path}" />
-		<!-- 
-		The next two should only come into play when running this script directly as
-		opposed to being called by a functional test.
-		-->
-		<pathelement location="../../etc" />
-		<pathelement location="../../build/classes" />
-		<fileset dir="../../lib">
-			<include name="*.jar" />
-		</fileset>
-	</path>
-
-	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
-
-	<target name="help">
-		<echo>This example is only used for testing, and is not meant</echo>
-		<echo>to be run from the command line.  It requires certain </echo>
-		<echo>classes to be on the class path to work correctly.</echo>
-	</target>
-
-	<target name="compile">
-		<mkdir dir="${classes.dir}" />
-		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" />
-	</target>
-
-	<target name="instrument-condition-coverage" depends="compile">
-		<mkdir dir="${instrumented.dir}" />
-		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}">
-			<ignore regex="org.apache.log4j.*" />
-			<fileset dir="${classes.dir}">
-				<include name="**/*.class" />
-				<exclude name="**/*Test*" />
-			</fileset>
-		</cobertura-instrument>
-
-		<path id="test.classpath">
-			<path location="${instrumented.dir}" />
-		</path>
-	</target>
-
-	<target name="test" depends="compile">
-		<junit fork="true" dir="${basedir}" haltonfailure="true">
-			<classpath refid="test.classpath" />
-			<classpath location="${classes.dir}" />
-			<classpath path="${java.class.path}" />
-			<classpath refid="project.classpath" />
-
-			<formatter type="plain" usefile="false" />
-			<test name="test.condition.Test" />
-		</junit>
-	</target>
-
-	<target name="coverage-reports">
-		<mkdir dir="${coverage.xml.dir}" />
-		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
-
-		<mkdir dir="${coverage.html.dir}" />
-		<!-- maxmemory is only specified to test the attribute -->
-		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>
-		</cobertura-report>
-	</target>
-
-	<target name="coverage-check">
-		<cobertura-check branchrate="34" totallinerate="100" />
-	</target>
-
-	<target name="clean">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" failonerror="false"/>
-		<delete file="cobertura.log" />
-		<delete file="cobertura.ser" />
-		<delete file="cobertura.ser.lock" />
-	</target>
-
-	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
-	<target name="all" depends="test-condition-coverage" />
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="test.ant.IgnoreMethodAnnotation" basedir="." default="help">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2005 Mark Doliner
+	Copyright (C) 2006 John Lewis
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<loadproperties srcFile="src/test/resources/ant/IgnoreMethodAnnotation/build.properties" />
+
+	<path id="project.classpath">
+		<path path="${java.class.path}" />
+		<!-- 
+		The next two should only come into play when running this script directly as
+		opposed to being called by a functional test.
+		-->
+		<pathelement location="../../etc" />
+		<pathelement location="../../../../../target/classes" />
+	</path>
+
+	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
+
+	<target name="help">
+		<echo>This example is only used for testing, and is not meant</echo>
+		<echo>to be run from the command line.  It requires certain </echo>
+		<echo>classes to be on the class path to work correctly.</echo>
+	</target>
+
+	<target name="compile">
+		<mkdir dir="${classes.dir}" />
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true"/>
+	</target>
+
+	<target name="instrument-condition-coverage" depends="compile">
+		<mkdir dir="${instrumented.dir}" />
+		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}">
+			<ignore regex="org.slf4j.*" />
+			<fileset dir="${classes.dir}">
+				<include name="**/*.class" />
+				<exclude name="**/*Test*" />
+			</fileset>
+                        <ignoreMethodAnnotation annotationName="test.condition.CoverageIgnore"/>
+		</cobertura-instrument>
+
+		<path id="test.classpath">
+			<path location="${instrumented.dir}" />
+		</path>
+	</target>
+
+	<target name="test" depends="compile">
+		<junit fork="true" dir="${basedir}" haltonfailure="true">
+			<classpath refid="test.classpath" />
+			<classpath location="${classes.dir}" />
+			<classpath path="${java.class.path}" />
+			<classpath refid="project.classpath" />
+
+			<formatter type="plain" usefile="false" />
+			<test name="test.condition.TestUnit" />
+		</junit>
+	</target>
+
+	<target name="coverage-reports">
+		<mkdir dir="${coverage.xml.dir}" />
+		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
+
+		<mkdir dir="${coverage.html.dir}" />
+		<!-- maxmemory is only specified to test the attribute -->
+		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
+			<fileset dir="${src.dir}">
+				<include name="**/*.java" />
+			</fileset>
+		</cobertura-report>
+	</target>
+
+	<target name="coverage-check">
+		<cobertura-check branchrate="34" totallinerate="100" />
+	</target>
+
+	<target name="clean">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" failonerror="false"/>
+		<delete file="cobertura.log" />
+		<delete file="cobertura.ser" />
+		<delete file="cobertura.ser.lock" />
+	</target>
+
+	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
+	<target name="all" depends="test-condition-coverage" />
+
+</project>
diff --git a/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/CoverageIgnore.java b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/CoverageIgnore.java
new file mode 100644
index 0000000..5d085cf
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/CoverageIgnore.java
@@ -0,0 +1,5 @@
+package test.condition;
+
+public @interface CoverageIgnore {
+}
+
diff --git a/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMe.java b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMe.java
new file mode 100644
index 0000000..dc82e27
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMe.java
@@ -0,0 +1,8 @@
+package test.condition;
+
+public class IgnoreMe {
+  @CoverageIgnore
+  public static void foo() {
+    System.out.println("Ignore Me");
+  }
+}
diff --git a/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMeAlso.java b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMeAlso.java
new file mode 100644
index 0000000..6875c30
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMeAlso.java
@@ -0,0 +1,8 @@
+package test.condition;
+
+public class IgnoreMeAlso {
+  @CoverageIgnore
+  public static void foo() {
+    System.out.println("Ignore Me Too!");
+  }
+}
diff --git a/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMeNot.java b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMeNot.java
new file mode 100644
index 0000000..036655c
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/IgnoreMeNot.java
@@ -0,0 +1,8 @@
+package test.condition;
+
+
+public class IgnoreMeNot {
+  public static void foo() {
+    System.out.println("Don't Ignore Me");
+  }
+}
diff --git a/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/TestUnit.java b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/TestUnit.java
new file mode 100644
index 0000000..0f990ed
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreMethodAnnotation/src/test/condition/TestUnit.java
@@ -0,0 +1,12 @@
+package test.condition;
+
+import org.junit.Test;
+
+public class TestUnit {
+	@Test
+	public void testMethod() {
+		IgnoreMeAlso.foo();
+		IgnoreMeNot.foo();
+		IgnoreMe.foo();
+	}
+}
diff --git a/cobertura/src/test/resources/ant/IgnoreTrivial/.gitignore b/cobertura/src/test/resources/ant/IgnoreTrivial/.gitignore
new file mode 100644
index 0000000..18a60f9
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreTrivial/.gitignore
@@ -0,0 +1,3 @@
+/classes/
+/instrumented/
+/reports/
diff --git a/examples/functionaltest1/README b/cobertura/src/test/resources/ant/IgnoreTrivial/README
similarity index 100%
rename from examples/functionaltest1/README
rename to cobertura/src/test/resources/ant/IgnoreTrivial/README
diff --git a/cobertura/src/test/resources/ant/IgnoreTrivial/build.properties b/cobertura/src/test/resources/ant/IgnoreTrivial/build.properties
new file mode 100644
index 0000000..dfdc0f0
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreTrivial/build.properties
@@ -0,0 +1,12 @@
+
+# The path to cobertura.jar
+cobertura.dir=../..
+
+root.dir=src/test/resources/ant/IgnoreTrivial
+
+src.dir=${root.dir}/src
+classes.dir=${root.dir}/classes
+instrumented.dir=${root.dir}/instrumented
+reports.dir=${root.dir}/reports
+coverage.xml.dir=${reports.dir}/cobertura-xml
+coverage.html.dir=${reports.dir}/cobertura-html
diff --git a/examples/functionalconditiontest/build.xml b/cobertura/src/test/resources/ant/IgnoreTrivial/build.xml
similarity index 74%
copy from examples/functionalconditiontest/build.xml
copy to cobertura/src/test/resources/ant/IgnoreTrivial/build.xml
index 3dafe1c..0edf045 100644
--- a/examples/functionalconditiontest/build.xml
+++ b/cobertura/src/test/resources/ant/IgnoreTrivial/build.xml
@@ -1,98 +1,89 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura.examples.functionalconditiontest" basedir="." default="help">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2005 Mark Doliner
-	Copyright (C) 2006 John Lewis
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<property file="build.properties" />
-
-	<path id="project.classpath">
-		<path path="${java.class.path}" />
-		<!-- 
-		The next two should only come into play when running this script directly as
-		opposed to being called by a functional test.
-		-->
-		<pathelement location="../../etc" />
-		<pathelement location="../../build/classes" />
-		<fileset dir="../../lib">
-			<include name="*.jar" />
-		</fileset>
-	</path>
-
-	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
-
-	<target name="help">
-		<echo>This example is only used for testing, and is not meant</echo>
-		<echo>to be run from the command line.  It requires certain </echo>
-		<echo>classes to be on the class path to work correctly.</echo>
-	</target>
-
-	<target name="compile">
-		<mkdir dir="${classes.dir}" />
-		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" />
-	</target>
-
-	<target name="instrument-condition-coverage" depends="compile">
-		<mkdir dir="${instrumented.dir}" />
-		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}">
-			<ignore regex="org.apache.log4j.*" />
-			<fileset dir="${classes.dir}">
-				<include name="**/*.class" />
-				<exclude name="**/*Test*" />
-			</fileset>
-		</cobertura-instrument>
-
-		<path id="test.classpath">
-			<path location="${instrumented.dir}" />
-		</path>
-	</target>
-
-	<target name="test" depends="compile">
-		<junit fork="true" dir="${basedir}" haltonfailure="true">
-			<classpath refid="test.classpath" />
-			<classpath location="${classes.dir}" />
-			<classpath path="${java.class.path}" />
-			<classpath refid="project.classpath" />
-
-			<formatter type="plain" usefile="false" />
-			<test name="test.condition.Test" />
-		</junit>
-	</target>
-
-	<target name="coverage-reports">
-		<mkdir dir="${coverage.xml.dir}" />
-		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
-
-		<mkdir dir="${coverage.html.dir}" />
-		<!-- maxmemory is only specified to test the attribute -->
-		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>
-		</cobertura-report>
-	</target>
-
-	<target name="coverage-check">
-		<cobertura-check branchrate="34" totallinerate="100" />
-	</target>
-
-	<target name="clean">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" failonerror="false"/>
-		<delete file="cobertura.log" />
-		<delete file="cobertura.ser" />
-		<delete file="cobertura.ser.lock" />
-	</target>
-
-	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
-	<target name="all" depends="test-condition-coverage" />
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="test.ant.IgnoreTrivial" basedir="." default="help">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2005 Mark Doliner
+	Copyright (C) 2006 John Lewis
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<loadproperties srcFile="src/test/resources/ant/IgnoreTrivial/build.properties" />
+
+	<path id="project.classpath">
+		<path path="${java.class.path}" />
+		<!-- 
+		The next two should only come into play when running this script directly as
+		opposed to being called by a functional test.
+		-->
+		<pathelement location="../../etc" />
+		<pathelement location="../../target/classes" />
+	</path>
+
+	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
+
+	<target name="help">
+		<echo>This example is only used for testing, and is not meant</echo>
+		<echo>to be run from the command line.  It requires certain </echo>
+		<echo>classes to be on the class path to work correctly.</echo>
+	</target>
+
+	<target name="compile">
+		<mkdir dir="${classes.dir}" />
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" />
+	</target>
+
+	<target name="instrument-condition-coverage" depends="compile">
+		<mkdir dir="${instrumented.dir}" />
+		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}" ignoreTrivial="true">
+			<ignore regex="org.slf4j.*" />
+			<fileset dir="${classes.dir}">
+				<include name="**/*.class" />
+				<exclude name="**/*Test*" />
+			</fileset>
+		</cobertura-instrument>
+
+		<path id="test.classpath">
+			<path location="${instrumented.dir}" />
+		</path>
+	</target>
+
+	<target name="test" depends="compile">
+		<java classname="mypackage.Main" fork="true">
+			 <classpath>
+			   <pathelement location="${instrumented.dir}"/>
+			   <pathelement location="${classes.dir}"/>
+			   <path refid="project.classpath"/>
+			 </classpath>
+		</java>
+	</target>
+
+	<target name="coverage-reports">
+		<mkdir dir="${coverage.xml.dir}" />
+		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
+
+		<mkdir dir="${coverage.html.dir}" />
+		<!-- maxmemory is only specified to test the attribute -->
+		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
+			<fileset dir="${src.dir}">
+				<include name="**/*.java" />
+			</fileset>
+		</cobertura-report>
+	</target>
+
+	<target name="clean">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" failonerror="false"/>
+		<delete file="cobertura.log" />
+		<delete file="cobertura.ser" />
+		<delete file="cobertura.ser.lock" />
+	</target>
+
+	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
+	<target name="all" depends="test-condition-coverage" />
+
+</project>
diff --git a/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/Main.java b/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/Main.java
new file mode 100644
index 0000000..3074770
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/Main.java
@@ -0,0 +1,249 @@
+package mypackage;
+
+public class Main extends Thread {
+	public static class MyObject implements MyInterface
+	{
+		public void myInterfaceMethod()	{
+		}
+	}
+
+	public static void main(String[] args) {
+		Main main = new Main();
+		/*
+		* Call all methods so they will be considered "covered" unless
+		* they are ignored as trivial.
+		*
+		* These are in no particular order.
+		*/
+		main.getterTrivial();
+		main.empty();
+		main.getVoid();
+		main.getIntWithIntParm(0);
+		main.isBool();
+		main.hasBool();
+		main.set();
+		main.setInt(1);
+		main.setIntWithTwoParms(1, 2);
+		main.getMultiDimArray();
+		main.setIncrement(1);
+		main.setConst("");
+		main.getArray();
+		main.getObject();
+		main.getStatic();
+		main.setStatic(1);
+		main.setISTORE(1);
+		main.setLSTORE(1);
+		main.setFSTORE((float)1.0);
+		main.setDSTORE(1.0);
+		main.setASTORE(null);
+		main.getINVOKEVIRTUAL();
+		main.getINVOKESPECIAL();
+		main.getINVOKESTATIC();
+		main.setINVOKEINTERFACE(new MyObject());
+
+		// call constructors in no particular order
+		new Main(1);
+		new Main(true);
+		new Main("str");
+		new Main("", "");
+		new Main("", 0);
+		new Main("", true);
+		new Main((Thread) null, "string");
+		new Main((Thread) null, 0);
+	}
+
+	// Be careful when initializing members.  If you instantiate an
+	// object, then trivial constructors will become non-trivial.
+	// Ex. Integer myInteger = new Integer(1); will cause Main() to be non-trivial.
+	int myint;
+	boolean mybool;
+	private static int mystatic;
+
+	// trivial constructor"
+	public Main() {
+	}
+
+	// constructors that just call super() are trivial
+	public Main(Thread t, String str) {
+		super(str);
+	}
+
+	// constructors that just call super() are usually trivial, but
+	// this constructor uses a constant, so it is considered non-trivial.
+	public Main(Thread t, int i) {
+		super("string");
+	}
+
+	public Main(boolean bool) {
+		// non-trivial conditional
+		myint = bool ? 0 : 1;
+	}
+
+	public Main(int num) {
+		// non-trivial switch
+		switch(num) {
+			default:
+		}
+	}
+
+	public Main(String str) {
+		// setting of statics is non-trivial
+		mystatic = 2;
+	}
+
+	public Main(String str1, String str2) {
+		// non-trivial method call
+		privateMethod();
+	}
+
+	public Main(String str1, int i) {
+		// non-trivial object construction
+		new StringBuffer();
+	}
+
+	public Main(String str1, boolean bool) {
+		// non-trivial this() call
+		this(str1, 0);
+	}
+
+
+	// trivial getter
+	public int getterTrivial() {
+		return myint;
+	}
+
+	// trivial getter
+	public boolean isBool() {
+		return mybool;
+	}
+
+	// trivial getter
+	public boolean hasBool() {
+		return mybool;
+	}
+
+	// trivial setter
+	public void setInt(int i) {
+		myint = i;
+	}
+
+	// this would be trivial, but it is a getter that with no return value
+	public void getVoid() {
+	}
+
+	// "empty" does not start with "get", "is", "has", or "set", so
+	// it is considered non-trivial.
+	private int empty() {
+		return 0;
+	}
+
+	// this is a getter that takes a parameter, so it is non-trivial.
+	public int getIntWithIntParm(int i) {
+		return 0;
+	}
+
+	// this would be a trivial setter, but it does not have a parameter.
+	public void set() {
+	}
+
+	// this would be a trivial setter, but it has more than one parameter.
+	public void setIntWithTwoParms(int i, int j) {
+		myint = i;
+	}
+
+	public int[][] getMultiDimArray() {
+		// non-trivial construction of a multi-dimensional array
+		return new int[1][1];
+	}
+
+	public void setIncrement(int i) {
+		// non-trivial increment of local variable
+		i++;
+	}
+
+	public void setConst(String str) {
+		/*
+		 * cause visitLdcInsn to be called because "str" is in the
+		 * runtime constant pool.  An LDC operation is performed
+		 * which is considered non-trivial.
+		 */
+		System.out.println("str");
+	}
+
+	public int[] getArray() {
+		// causes visitIntInsn to be called.  Creating an array is a "single int operand".
+		// non-trivial.
+		return new int[1];
+	}
+
+	public Object getObject() {
+		// causes visitTypeInsn to be called.  Creating an object is a type instruction.
+		// non-trivial.
+		return new Object();
+	}
+
+	public int getStatic() {
+		// getting a static is non-trivial.
+		return mystatic;
+	}
+
+	public void setStatic(int i) {
+		// setting a static is non-trivial.
+		mystatic = i;
+	}
+
+	// non-trivial local variable instruction (causes visitVarInsn(ISTORE)) (int store to local var)
+	public void setISTORE(int i) {
+		i = 0;
+	}
+
+	// non-trivial local variable instruction (causes visitVarInsn(LSTORE)) (long store to local var)
+	public void setLSTORE(long l) {
+		l = 0;
+	}
+
+	// non-trivial local variable instruction (causes visitVarInsn(FSTORE)) (floating store to local var)
+	public void setFSTORE(float f) {
+		f = 0;
+	}
+
+	// non-trivial local variable instruction (causes visitVarInsn(DSTORE)) (double store to local var)
+	public void setDSTORE(double d) {
+		d = 0;
+	}
+
+	// non-trivial local variable instruction (causes visitVarInsn(ASTORE)) (object store to local var)
+	public void setASTORE(Object obj) {
+		obj = null;
+	}
+
+	public void publicMethod() {
+	}
+	private void privateMethod() {
+	}
+	public static void staticMethod() {
+	}
+
+	// non-trivial public method call (causes visitMethodInsn(INVOKEVIRTUAL))
+	public int getINVOKEVIRTUAL() {
+		publicMethod();
+		return 0;
+	}
+
+	// non-trivial private method call (causes visitMethodInsn(INVOKESPECIAL)) 
+	public int getINVOKESPECIAL() {
+		privateMethod();
+		return 0;
+	}
+
+	// non-trivial static method call (causes visitMethodInsn(INVOKESTATIC)) 
+	public int getINVOKESTATIC() {
+		staticMethod();
+		return 0;
+	}
+
+	// non-trivial interface method call (causes visitMethodInsn(INVOKEINTERFACE))
+	public void setINVOKEINTERFACE(MyInterface obj) {
+		obj.myInterfaceMethod();
+	}
+}
diff --git a/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/MyInterface.java b/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/MyInterface.java
new file mode 100644
index 0000000..a9a906c
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/MyInterface.java
@@ -0,0 +1,5 @@
+package mypackage;
+
+public interface MyInterface {
+	public void myInterfaceMethod();
+}
diff --git a/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/Test.java b/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/Test.java
new file mode 100644
index 0000000..a3b3cb1
--- /dev/null
+++ b/cobertura/src/test/resources/ant/IgnoreTrivial/src/mypackage/Test.java
@@ -0,0 +1,6 @@
+package test.condition;
+
+import junit.framework.TestCase;
+
+public class Test extends TestCase {
+}
diff --git a/examples/functionalconditiontest/README b/cobertura/src/test/resources/ant/basic/README
similarity index 100%
copy from examples/functionalconditiontest/README
copy to cobertura/src/test/resources/ant/basic/README
diff --git a/examples/functionaltest1/build.properties b/cobertura/src/test/resources/ant/basic/build.properties
similarity index 95%
copy from examples/functionaltest1/build.properties
copy to cobertura/src/test/resources/ant/basic/build.properties
index 2bdc84c..4a26ef5 100644
--- a/examples/functionaltest1/build.properties
+++ b/cobertura/src/test/resources/ant/basic/build.properties
@@ -1,10 +1,10 @@
-
-# The path to cobertura.jar
-cobertura.dir=../..
-
-src.dir=src
-classes.dir=classes
-instrumented.dir=instrumented
-reports.dir=reports
-coverage.xml.dir=${reports.dir}/cobertura-xml
-coverage.html.dir=${reports.dir}/cobertura-html
+
+# The path to cobertura.jar
+cobertura.dir=../..
+
+src.dir=src
+classes.dir=classes
+instrumented.dir=instrumented
+reports.dir=reports
+coverage.xml.dir=${reports.dir}/cobertura-xml
+coverage.html.dir=${reports.dir}/cobertura-html
diff --git a/examples/functionalconditiontest/build.xml b/cobertura/src/test/resources/ant/basic/build.xml
similarity index 92%
copy from examples/functionalconditiontest/build.xml
copy to cobertura/src/test/resources/ant/basic/build.xml
index 3dafe1c..aca6679 100644
--- a/examples/functionalconditiontest/build.xml
+++ b/cobertura/src/test/resources/ant/basic/build.xml
@@ -1,98 +1,95 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura.examples.functionalconditiontest" basedir="." default="help">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2005 Mark Doliner
-	Copyright (C) 2006 John Lewis
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<property file="build.properties" />
-
-	<path id="project.classpath">
-		<path path="${java.class.path}" />
-		<!-- 
-		The next two should only come into play when running this script directly as
-		opposed to being called by a functional test.
-		-->
-		<pathelement location="../../etc" />
-		<pathelement location="../../build/classes" />
-		<fileset dir="../../lib">
-			<include name="*.jar" />
-		</fileset>
-	</path>
-
-	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
-
-	<target name="help">
-		<echo>This example is only used for testing, and is not meant</echo>
-		<echo>to be run from the command line.  It requires certain </echo>
-		<echo>classes to be on the class path to work correctly.</echo>
-	</target>
-
-	<target name="compile">
-		<mkdir dir="${classes.dir}" />
-		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" />
-	</target>
-
-	<target name="instrument-condition-coverage" depends="compile">
-		<mkdir dir="${instrumented.dir}" />
-		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}">
-			<ignore regex="org.apache.log4j.*" />
-			<fileset dir="${classes.dir}">
-				<include name="**/*.class" />
-				<exclude name="**/*Test*" />
-			</fileset>
-		</cobertura-instrument>
-
-		<path id="test.classpath">
-			<path location="${instrumented.dir}" />
-		</path>
-	</target>
-
-	<target name="test" depends="compile">
-		<junit fork="true" dir="${basedir}" haltonfailure="true">
-			<classpath refid="test.classpath" />
-			<classpath location="${classes.dir}" />
-			<classpath path="${java.class.path}" />
-			<classpath refid="project.classpath" />
-
-			<formatter type="plain" usefile="false" />
-			<test name="test.condition.Test" />
-		</junit>
-	</target>
-
-	<target name="coverage-reports">
-		<mkdir dir="${coverage.xml.dir}" />
-		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
-
-		<mkdir dir="${coverage.html.dir}" />
-		<!-- maxmemory is only specified to test the attribute -->
-		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>
-		</cobertura-report>
-	</target>
-
-	<target name="coverage-check">
-		<cobertura-check branchrate="34" totallinerate="100" />
-	</target>
-
-	<target name="clean">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" failonerror="false"/>
-		<delete file="cobertura.log" />
-		<delete file="cobertura.ser" />
-		<delete file="cobertura.ser.lock" />
-	</target>
-
-	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
-	<target name="all" depends="test-condition-coverage" />
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="cobertura.examples.functionalconditiontest" basedir="." default="help">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2005 Mark Doliner
+	Copyright (C) 2006 John Lewis
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<property file="build.properties" />
+
+	<path id="project.classpath">
+		<path path="${java.class.path}" />
+		<!-- 
+		The next two should only come into play when running this script directly as
+		opposed to being called by a functional test.
+		-->
+		<pathelement location="../../etc" />
+		<pathelement location="../../target/classes" />
+	</path>
+
+	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
+
+	<target name="help">
+		<echo>This example is only used for testing, and is not meant</echo>
+		<echo>to be run from the command line.  It requires certain </echo>
+		<echo>classes to be on the class path to work correctly.</echo>
+	</target>
+
+	<target name="compile">
+		<mkdir dir="${classes.dir}" />
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" />
+	</target>
+
+	<target name="instrument-condition-coverage" depends="compile">
+		<mkdir dir="${instrumented.dir}" />
+		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}">
+			<ignore regex="org.slf4j.*" />
+			<fileset dir="${classes.dir}">
+				<include name="**/*.class" />
+				<exclude name="**/*Test*" />
+			</fileset>
+		</cobertura-instrument>
+
+		<path id="test.classpath">
+			<path location="${instrumented.dir}" />
+		</path>
+	</target>
+
+	<target name="test" depends="compile">
+		<junit fork="true" dir="${basedir}" haltonfailure="true">
+			<classpath refid="test.classpath" />
+			<classpath location="${classes.dir}" />
+			<classpath path="${java.class.path}" />
+			<classpath refid="project.classpath" />
+
+			<formatter type="plain" usefile="false" />
+			<test name="test.condition.Test" />
+		</junit>
+	</target>
+
+	<target name="coverage-reports">
+		<mkdir dir="${coverage.xml.dir}" />
+		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
+
+		<mkdir dir="${coverage.html.dir}" />
+		<!-- maxmemory is only specified to test the attribute -->
+		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
+			<fileset dir="${src.dir}">
+				<include name="**/*.java" />
+			</fileset>
+		</cobertura-report>
+	</target>
+
+	<target name="coverage-check">
+		<cobertura-check branchrate="34" totallinerate="100" />
+	</target>
+
+	<target name="clean">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" failonerror="false"/>
+		<delete file="cobertura.log" />
+		<delete file="cobertura.ser" />
+		<delete file="cobertura.ser.lock" />
+	</target>
+
+	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
+	<target name="all" depends="test-condition-coverage" />
+
+</project>
diff --git a/examples/functionalconditiontest/src/test/condition/ConditionCalls.java b/cobertura/src/test/resources/ant/basic/src/test/condition/ConditionCalls.java
similarity index 95%
copy from examples/functionalconditiontest/src/test/condition/ConditionCalls.java
copy to cobertura/src/test/resources/ant/basic/src/test/condition/ConditionCalls.java
index d3bcf7c..a3db970 100644
--- a/examples/functionalconditiontest/src/test/condition/ConditionCalls.java
+++ b/cobertura/src/test/resources/ant/basic/src/test/condition/ConditionCalls.java
@@ -1,104 +1,104 @@
-package test.condition;
-
-import org.apache.log4j.Logger;
-
-public class ConditionCalls {
-	
-	/*
-	 * See the note at FirstPassMethodInstrumenter.visitJumpInsn()
-	 * regarding initialization of static variables.  This next static
-	 * is intended to cover that condition. 
-	 */ 
-	public static String whatEver = null;
-	private static final Logger logger = Logger.getLogger(ConditionCalls.class);
-
-	public void call(int i)
-	{
-		if (i>=5) //set CALL_CONDITION_LINE_NUMBER to this line number
-		{
-			try
-			{
-				logger.error("whatEver");  //set CALL_IGNORE_LINE_NUMBER to this line number
-				throw new RuntimeException();
-			}
-			catch (Throwable t)
-			{
-				//eat it
-			}
-			finally
-			{
-				System.out.println("true");
-			}
-		} else {
-			System.out.println("false");
-		}
-	}
-	
-	public void callLookupSwitch(int branch)
-	{
-		switch (branch)  //set LOOKUP_SWITCH_LINE_NUMBER to this line number
-		{
-		case 1:
-			System.out.println("1");
-			break;
-		case 5:
-			System.out.println("5");
-			break;
-		default:
-			System.out.println("default");
-			break;
-		}
-	}
-	
-	public String callTableSwitch(int branch)
-	{
-		int[][] multiArray;
-		switch (branch)  //set TABLE_SWITCH_LINE_NUMBER to this line number
-		{
-		case 0: return("0");
-		case 1: return("1");
-		case 2: return("2");
-		case 3: return("3");
-		case 4: return("4");
-		case 5: return("5");
-		case 6: return("6");
-		case 7: return("7");
-		case 8: return("8");
-		default: multiArray = new int[3][3]; return("" + multiArray[1][1]);
-		}
-	}
-	
-	public void callMultiCondition(int a, int b, int c)
-	{
-		//The c++ is to get SecondPassMethodInstrumenter.visitIincInsn called.
-		if ((a == b) && (b >= 3) || (c++ < a))  //set MULTI_CONDITION_LINE_NUMBER to this line number
-		{
-			System.out.println("true");
-		}
-	}
-
-	public void callMultiCondition2(int a, int b, int c)
-	{
-		if ((a == b) && (b >= utilEcho(3)) || (c < a))  //set MULTI_CONDITION2_LINE_NUMBER to this line number
-		{
-			System.out.println("true");
-		}
-	}
-	
-	int utilEcho(int number)
-	{
-		return number;
-	}
-	
-	static
-	{
-		whatEver = "whatEver";
-	};
-	
-	public static final int CALL_CONDITION_LINE_NUMBER = 17;
-	public static final int CALL_IGNORE_LINE_NUMBER = 21;
-	public static final int LOOKUP_SWITCH_LINE_NUMBER = 39;
-	public static final int TABLE_SWITCH_LINE_NUMBER = 56;
-	public static final int MULTI_CONDITION_LINE_NUMBER = 74;
-	public static final int MULTI_CONDITION2_LINE_NUMBER = 82;
-}
+package test.condition;
+
+import org.apache.log4j.Logger;
+
+public class ConditionCalls {
+	
+	/*
+	 * See the note at FirstPassMethodInstrumenter.visitJumpInsn()
+	 * regarding initialization of static variables.  This next static
+	 * is intended to cover that condition. 
+	 */ 
+	public static String whatEver = null;
+	private static final Logger logger = Logger.getLogger(ConditionCalls.class);
+
+	public void call(int i)
+	{
+		if (i>=5) //set CALL_CONDITION_LINE_NUMBER to this line number
+		{
+			try
+			{
+				logger.error("whatEver");  //set CALL_IGNORE_LINE_NUMBER to this line number
+				throw new RuntimeException();
+			}
+			catch (Throwable t)
+			{
+				//eat it
+			}
+			finally
+			{
+				System.out.println("true");
+			}
+		} else {
+			System.out.println("false");
+		}
+	}
+	
+	public void callLookupSwitch(int branch)
+	{
+		switch (branch)  //set LOOKUP_SWITCH_LINE_NUMBER to this line number
+		{
+		case 1:
+			System.out.println("1");
+			break;
+		case 5:
+			System.out.println("5");
+			break;
+		default:
+			System.out.println("default");
+			break;
+		}
+	}
+	
+	public String callTableSwitch(int branch)
+	{
+		int[][] multiArray;
+		switch (branch)  //set TABLE_SWITCH_LINE_NUMBER to this line number
+		{
+		case 0: return("0");
+		case 1: return("1");
+		case 2: return("2");
+		case 3: return("3");
+		case 4: return("4");
+		case 5: return("5");
+		case 6: return("6");
+		case 7: return("7");
+		case 8: return("8");
+		default: multiArray = new int[3][3]; return("" + multiArray[1][1]);
+		}
+	}
+	
+	public void callMultiCondition(int a, int b, int c)
+	{
+		//The c++ is to get SecondPassMethodInstrumenter.visitIincInsn called.
+		if ((a == b) && (b >= 3) || (c++ < a))  //set MULTI_CONDITION_LINE_NUMBER to this line number
+		{
+			System.out.println("true");
+		}
+	}
+
+	public void callMultiCondition2(int a, int b, int c)
+	{
+		if ((a == b) && (b >= utilEcho(3)) || (c < a))  //set MULTI_CONDITION2_LINE_NUMBER to this line number
+		{
+			System.out.println("true");
+		}
+	}
+	
+	int utilEcho(int number)
+	{
+		return number;
+	}
+	
+	static
+	{
+		whatEver = "whatEver";
+	};
+	
+	public static final int CALL_CONDITION_LINE_NUMBER = 17;
+	public static final int CALL_IGNORE_LINE_NUMBER = 21;
+	public static final int LOOKUP_SWITCH_LINE_NUMBER = 39;
+	public static final int TABLE_SWITCH_LINE_NUMBER = 56;
+	public static final int MULTI_CONDITION_LINE_NUMBER = 74;
+	public static final int MULTI_CONDITION2_LINE_NUMBER = 82;
+}
diff --git a/examples/functionalconditiontest/src/test/condition/Test.java b/cobertura/src/test/resources/ant/basic/src/test/condition/Test.java
similarity index 96%
copy from examples/functionalconditiontest/src/test/condition/Test.java
copy to cobertura/src/test/resources/ant/basic/src/test/condition/Test.java
index 77d57f4..3705567 100644
--- a/examples/functionalconditiontest/src/test/condition/Test.java
+++ b/cobertura/src/test/resources/ant/basic/src/test/condition/Test.java
@@ -1,56 +1,56 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2007 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.condition;
-
-import junit.framework.TestCase;
-
-/**
- * Simple class used in functional testing of branch coverage.
- * 
- * @author John Lewis
- */
-public class Test extends TestCase
-{
-
-	public Test(String name)
-	{
-		super(name);
-	}
-
-	/**
-	 * Call the methods called "call"
-	 */
-	public void testMethod()
-	{
-		ConditionCalls branch = new ConditionCalls();
-		branch.call(7);
-		branch.callLookupSwitch(1);
-		branch.callTableSwitch(100);
-		branch.callMultiCondition(3, 7, 1);
-		branch.callMultiCondition2(7, 7, 100);
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2007 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package test.condition;
+
+import junit.framework.TestCase;
+
+/**
+ * Simple class used in functional testing of branch coverage.
+ * 
+ * @author John Lewis
+ */
+public class Test extends TestCase
+{
+
+	public Test(String name)
+	{
+		super(name);
+	}
+
+	/**
+	 * Call the methods called "call"
+	 */
+	public void testMethod()
+	{
+		ConditionCalls branch = new ConditionCalls();
+		branch.call(7);
+		branch.callLookupSwitch(1);
+		branch.callTableSwitch(100);
+		branch.callMultiCondition(3, 7, 1);
+		branch.callMultiCondition2(7, 7, 100);
+	}
+
+}
diff --git a/antLibrary/library.xml b/cobertura/src/test/resources/antLibrary/library.xml
similarity index 94%
rename from antLibrary/library.xml
rename to cobertura/src/test/resources/antLibrary/library.xml
index 28c9a1a..4662c7d 100644
--- a/antLibrary/library.xml
+++ b/cobertura/src/test/resources/antLibrary/library.xml
@@ -1,97 +1,97 @@
-<!--
- *
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2008 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
--->
-<project name="cobertura-library" xmlns:cobertura="antlib:net.sourceforge.cobertura.ant">
-
-	<macrodef name="cobertura-groovy-init">
-		<sequential>
-			<path id="cobertura.common.local.library">
-				<fileset dir="${cobertura.local.library}">
-					<include name="**/*.jar" />
-				</fileset>
-			</path>
-				
-			<!-- 
-			Load the Groovy ant task.
-			-->
-			<taskdef 
-				uri="antlib:net.sourceforge.cobertura.ant" 
-				name="groovy"
-				classname="org.codehaus.groovy.ant.Groovy"
-				classpathref="cobertura.common.local.library"
-				loaderref="cobertura.lib.path.loader">
-			</taskdef>
-
-			<!-- 
-			Load the Groovyc ant task.
-			-->
-			<taskdef 
-				uri="antlib:net.sourceforge.cobertura.ant" 
-				name="groovyc"
-				classname="org.codehaus.groovy.ant.Groovyc"
-				classpathref="cobertura.common.local.library"
-				loaderref="cobertura.lib.path.loader">
-			</taskdef>
-			
-		</sequential>
-	</macrodef>
-	
-	<target name="cobertura-groovy-init">
-			
-		<cobertura-groovy-init />
-	</target>
-
-</project>
+<!--
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2008 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+-->
+<project name="cobertura-library">
+
+	<macrodef name="cobertura-groovy-init">
+		<sequential>
+			<path id="cobertura.common.local.library">
+				<fileset dir="${cobertura.local.library}">
+					<include name="**/*.jar" />
+				</fileset>
+			</path>
+				
+			<!-- 
+			Load the Groovy ant task.
+			-->
+			<taskdef 
+				uri="antlib:net.sourceforge.cobertura.ant" 
+				name="groovy"
+				classname="org.codehaus.groovy.ant.Groovy"
+				classpathref="cobertura.common.local.library"
+				loaderref="cobertura.lib.path.loader">
+			</taskdef>
+
+			<!-- 
+			Load the Groovyc ant task.
+			-->
+			<taskdef 
+				uri="antlib:net.sourceforge.cobertura.ant" 
+				name="groovyc"
+				classname="org.codehaus.groovy.ant.Groovyc"
+				classpathref="cobertura.common.local.library"
+				loaderref="cobertura.lib.path.loader">
+			</taskdef>
+			
+		</sequential>
+	</macrodef>
+	
+	<target name="cobertura-groovy-init">
+			
+		<cobertura-groovy-init />
+	</target>
+
+</project>
diff --git a/cobertura/src/test/resources/dtds/coverage-01.dtd b/cobertura/src/test/resources/dtds/coverage-01.dtd
new file mode 100644
index 0000000..9008c18
--- /dev/null
+++ b/cobertura/src/test/resources/dtds/coverage-01.dtd
@@ -0,0 +1,40 @@
+<!-- Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+
+  <!ELEMENT coverage (packages)>
+  <!ATTLIST coverage src CDATA "">
+
+  <!ELEMENT packages (package*)>
+
+  <!ELEMENT package (classes)>
+  <!ATTLIST package name        CDATA #REQUIRED>
+  <!ATTLIST package line-rate   CDATA #REQUIRED>
+  <!ATTLIST package branch-rate CDATA #REQUIRED>
+  <!ATTLIST package complexity  CDATA #REQUIRED>
+
+  <!ELEMENT classes (class*)>
+
+  <!ELEMENT class (methods,lines)>
+  <!ATTLIST class name        CDATA #REQUIRED>
+  <!ATTLIST class filename    CDATA #REQUIRED>
+  <!ATTLIST class line-rate   CDATA #REQUIRED>
+  <!ATTLIST class branch-rate CDATA #REQUIRED>
+  <!ATTLIST class complexity  CDATA #REQUIRED>
+
+  <!ELEMENT methods (method*)>
+
+  <!ELEMENT method (lines)>
+  <!ATTLIST method name        CDATA #REQUIRED>
+  <!ATTLIST method signature   CDATA #REQUIRED>
+  <!ATTLIST method line-rate   CDATA #REQUIRED>
+  <!ATTLIST method branch-rate CDATA #REQUIRED>
+
+  <!ELEMENT lines (line*)>
+
+  <!ELEMENT line EMPTY>
+  <!ATTLIST line number CDATA #REQUIRED>
+  <!ATTLIST line hits   CDATA #REQUIRED>
+  <!ATTLIST line branch CDATA "false">
diff --git a/cobertura/src/test/resources/dtds/coverage-02.dtd b/cobertura/src/test/resources/dtds/coverage-02.dtd
new file mode 100644
index 0000000..ce77517
--- /dev/null
+++ b/cobertura/src/test/resources/dtds/coverage-02.dtd
@@ -0,0 +1,47 @@
+<!-- Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+
+  <!ELEMENT coverage (sources?,packages)>
+  <!ATTLIST coverage line-rate   CDATA #REQUIRED>
+  <!ATTLIST coverage branch-rate CDATA #REQUIRED>
+  <!ATTLIST coverage version     CDATA #REQUIRED>
+  <!ATTLIST coverage timestamp   CDATA #REQUIRED>
+
+  <!ELEMENT sources (source*)>
+
+  <!ELEMENT source (#PCDATA)>
+
+  <!ELEMENT packages (package*)>
+
+  <!ELEMENT package (classes)>
+  <!ATTLIST package name        CDATA #REQUIRED>
+  <!ATTLIST package line-rate   CDATA #REQUIRED>
+  <!ATTLIST package branch-rate CDATA #REQUIRED>
+  <!ATTLIST package complexity  CDATA #REQUIRED>
+
+  <!ELEMENT classes (class*)>
+
+  <!ELEMENT class (methods,lines)>
+  <!ATTLIST class name        CDATA #REQUIRED>
+  <!ATTLIST class filename    CDATA #REQUIRED>
+  <!ATTLIST class line-rate   CDATA #REQUIRED>
+  <!ATTLIST class branch-rate CDATA #REQUIRED>
+  <!ATTLIST class complexity  CDATA #REQUIRED>
+
+  <!ELEMENT methods (method*)>
+
+  <!ELEMENT method (lines)>
+  <!ATTLIST method name        CDATA #REQUIRED>
+  <!ATTLIST method signature   CDATA #REQUIRED>
+  <!ATTLIST method line-rate   CDATA #REQUIRED>
+  <!ATTLIST method branch-rate CDATA #REQUIRED>
+
+  <!ELEMENT lines (line*)>
+
+  <!ELEMENT line EMPTY>
+  <!ATTLIST line number CDATA #REQUIRED>
+  <!ATTLIST line hits   CDATA #REQUIRED>
+  <!ATTLIST line branch CDATA "false">
diff --git a/cobertura/src/test/resources/dtds/coverage-03.dtd b/cobertura/src/test/resources/dtds/coverage-03.dtd
new file mode 100644
index 0000000..eba2c83
--- /dev/null
+++ b/cobertura/src/test/resources/dtds/coverage-03.dtd
@@ -0,0 +1,55 @@
+<!-- Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+
+  <!ELEMENT coverage (sources?,packages)>
+  <!ATTLIST coverage line-rate   CDATA #REQUIRED>
+  <!ATTLIST coverage branch-rate CDATA #REQUIRED>
+  <!ATTLIST coverage version     CDATA #REQUIRED>
+  <!ATTLIST coverage timestamp   CDATA #REQUIRED>
+
+  <!ELEMENT sources (source*)>
+
+  <!ELEMENT source (#PCDATA)>
+
+  <!ELEMENT packages (package*)>
+
+  <!ELEMENT package (classes)>
+  <!ATTLIST package name        CDATA #REQUIRED>
+  <!ATTLIST package line-rate   CDATA #REQUIRED>
+  <!ATTLIST package branch-rate CDATA #REQUIRED>
+  <!ATTLIST package complexity  CDATA #REQUIRED>
+
+  <!ELEMENT classes (class*)>
+
+  <!ELEMENT class (methods,lines)>
+  <!ATTLIST class name        CDATA #REQUIRED>
+  <!ATTLIST class filename    CDATA #REQUIRED>
+  <!ATTLIST class line-rate   CDATA #REQUIRED>
+  <!ATTLIST class branch-rate CDATA #REQUIRED>
+  <!ATTLIST class complexity  CDATA #REQUIRED>
+
+  <!ELEMENT methods (method*)>
+
+  <!ELEMENT method (lines)>
+  <!ATTLIST method name        CDATA #REQUIRED>
+  <!ATTLIST method signature   CDATA #REQUIRED>
+  <!ATTLIST method line-rate   CDATA #REQUIRED>
+  <!ATTLIST method branch-rate CDATA #REQUIRED>
+
+  <!ELEMENT lines (line*)>
+
+  <!ELEMENT line (conditions*)>
+  <!ATTLIST line number CDATA #REQUIRED>
+  <!ATTLIST line hits   CDATA #REQUIRED>
+  <!ATTLIST line branch CDATA "false">
+  <!ATTLIST line condition-coverage CDATA "100%">
+
+  <!ELEMENT conditions (condition*)>
+
+  <!ELEMENT condition EMPTY>
+  <!ATTLIST condition number CDATA #REQUIRED>
+  <!ATTLIST condition type CDATA #REQUIRED>
+  <!ATTLIST condition coverage CDATA #REQUIRED>
diff --git a/cobertura/src/test/resources/dtds/coverage-04.dtd b/cobertura/src/test/resources/dtds/coverage-04.dtd
new file mode 100644
index 0000000..412b9f8
--- /dev/null
+++ b/cobertura/src/test/resources/dtds/coverage-04.dtd
@@ -0,0 +1,61 @@
+<!-- Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with
+     conforming SGML systems and applications as defined in
+     ISO 8879, provided this notice is included in all copies.
+-->
+
+  <!ELEMENT coverage (sources?,packages)>
+  <!ATTLIST coverage line-rate        CDATA #REQUIRED>
+  <!ATTLIST coverage branch-rate      CDATA #REQUIRED>
+  <!ATTLIST coverage lines-covered    CDATA #REQUIRED>
+  <!ATTLIST coverage lines-valid      CDATA #REQUIRED>
+  <!ATTLIST coverage branches-covered CDATA #REQUIRED>
+  <!ATTLIST coverage branches-valid   CDATA #REQUIRED>
+  <!ATTLIST coverage complexity       CDATA #REQUIRED>
+  <!ATTLIST coverage version          CDATA #REQUIRED>
+  <!ATTLIST coverage timestamp        CDATA #REQUIRED>
+
+  <!ELEMENT sources (source*)>
+
+  <!ELEMENT source (#PCDATA)>
+
+  <!ELEMENT packages (package*)>
+
+  <!ELEMENT package (classes)>
+  <!ATTLIST package name        CDATA #REQUIRED>
+  <!ATTLIST package line-rate   CDATA #REQUIRED>
+  <!ATTLIST package branch-rate CDATA #REQUIRED>
+  <!ATTLIST package complexity  CDATA #REQUIRED>
+
+  <!ELEMENT classes (class*)>
+
+  <!ELEMENT class (methods,lines)>
+  <!ATTLIST class name        CDATA #REQUIRED>
+  <!ATTLIST class filename    CDATA #REQUIRED>
+  <!ATTLIST class line-rate   CDATA #REQUIRED>
+  <!ATTLIST class branch-rate CDATA #REQUIRED>
+  <!ATTLIST class complexity  CDATA #REQUIRED>
+
+  <!ELEMENT methods (method*)>
+
+  <!ELEMENT method (lines)>
+  <!ATTLIST method name        CDATA #REQUIRED>
+  <!ATTLIST method signature   CDATA #REQUIRED>
+  <!ATTLIST method line-rate   CDATA #REQUIRED>
+  <!ATTLIST method branch-rate CDATA #REQUIRED>
+  <!ATTLIST method complexity  CDATA #REQUIRED>
+
+  <!ELEMENT lines (line*)>
+
+  <!ELEMENT line (conditions*)>
+  <!ATTLIST line number CDATA #REQUIRED>
+  <!ATTLIST line hits   CDATA #REQUIRED>
+  <!ATTLIST line branch CDATA "false">
+  <!ATTLIST line condition-coverage CDATA "100%">
+
+  <!ELEMENT conditions (condition*)>
+
+  <!ELEMENT condition EMPTY>
+  <!ATTLIST condition number CDATA #REQUIRED>
+  <!ATTLIST condition type CDATA #REQUIRED>
+  <!ATTLIST condition coverage CDATA #REQUIRED>
diff --git a/etc/jalopy.xml b/cobertura/src/test/resources/etc/jalopy.xml
similarity index 97%
rename from etc/jalopy.xml
rename to cobertura/src/test/resources/etc/jalopy.xml
index 548a3d8..58c6517 100644
--- a/etc/jalopy.xml
+++ b/cobertura/src/test/resources/etc/jalopy.xml
@@ -1,376 +1,376 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<jalopy>
-    <general>
-        <compliance>
-            <version>13</version>
-        </compliance>
-        <style>
-            <description>Cobertura source code conventions</description>
-            <name>Cobertura</name>
-        </style>
-    </general>
-    <inspector>
-        <enable>false</enable>
-        <naming>
-            <classes>
-                <abstract>[A-Z][a-zA-Z0-9]+</abstract>
-                <general>[A-Z][a-zA-Z0-9]+</general>
-            </classes>
-            <fields>
-                <default>[a-z][\w]+</default>
-                <defaultStatic>[a-z][\w]+</defaultStatic>
-                <defaultStaticFinal>[a-zA-Z][\w]+</defaultStaticFinal>
-                <private>[a-z][\w]+</private>
-                <privateStatic>[a-z][\w]+</privateStatic>
-                <privateStaticFinal>[a-zA-Z][\w]+</privateStaticFinal>
-                <protected>[a-z][\w]+</protected>
-                <protectedStatic>[a-z][\w]+</protectedStatic>
-                <protectedStaticFinal>[a-zA-Z][\w]+</protectedStaticFinal>
-                <public>[a-z][\w]+</public>
-                <publicStatic>[a-z][\w]+</publicStatic>
-                <publicStaticFinal>[a-zA-Z][\w]+</publicStaticFinal>
-            </fields>
-            <interfaces>[A-Z][a-zA-Z0-9]+</interfaces>
-            <labels>\w+</labels>
-            <methods>
-                <default>[a-z][\w]+</default>
-                <defaultStatic>[a-z][\w]+</defaultStatic>
-                <defaultStaticFinal>[a-z][\w]+</defaultStaticFinal>
-                <private>[a-z][\w]+</private>
-                <privateStatic>[a-z][\w]+</privateStatic>
-                <privateStaticFinal>[a-z][\w]+</privateStaticFinal>
-                <protected>[a-z][\w]+</protected>
-                <protectedStatic>[a-z][\w]+</protectedStatic>
-                <protectedStaticFinal>[a-z][\w]+</protectedStaticFinal>
-                <public>[a-z][\w]+</public>
-                <publicStatic>[a-z][\w]+</publicStatic>
-                <publicStaticFinal>[a-z][\w]+</publicStaticFinal>
-            </methods>
-            <packages>[a-z]+(?:\.[a-z]+)*</packages>
-            <parameters>
-                <default>[a-z][\w]+</default>
-                <final>[a-z][\w]+</final>
-            </parameters>
-            <variables>[a-z][\w]*</variables>
-        </naming>
-        <tips>
-            <adhereToNamingConvention>false</adhereToNamingConvention>
-            <alwaysOverrideHashCode>false</alwaysOverrideHashCode>
-            <avoidThreadGroups>false</avoidThreadGroups>
-            <declareCollectionComment>false</declareCollectionComment>
-            <dontIgnoreExceptions>false</dontIgnoreExceptions>
-            <dontSubstituteObjectEquals>false</dontSubstituteObjectEquals>
-            <neverDeclareException>false</neverDeclareException>
-            <neverDeclareThrowable>false</neverDeclareThrowable>
-            <neverInvokeWaitOutsideLoop>false</neverInvokeWaitOutsideLoop>
-            <neverReturnZeroArrays>false</neverReturnZeroArrays>
-            <neverUseEmptyFinally>false</neverUseEmptyFinally>
-            <obeyContractEquals>false</obeyContractEquals>
-            <overrideToString>false</overrideToString>
-            <referToObjectsByInterface>false</referToObjectsByInterface>
-            <replaceStructureWithClass>false</replaceStructureWithClass>
-            <stringLiterallI18n>false</stringLiterallI18n>
-            <useInterfaceOnlyForTypes>false</useInterfaceOnlyForTypes>
-            <wrongCollectionComment>false</wrongCollectionComment>
-        </tips>
-    </inspector>
-    <internal>
-        <version>6</version>
-    </internal>
-    <messages>
-        <priority>
-            <general>30000</general>
-            <parser>30000</parser>
-            <parserJavadoc>30000</parserJavadoc>
-            <printer>30000</printer>
-            <printerJavadoc>30000</printerJavadoc>
-            <transform>30000</transform>
-        </priority>
-        <showErrorStackTrace>true</showErrorStackTrace>
-    </messages>
-    <misc>
-        <threadCount>1</threadCount>
-    </misc>
-    <printer>
-        <alignment>
-            <methodCallChain>false</methodCallChain>
-            <parameterMethodDeclaration>false</parameterMethodDeclaration>
-            <ternaryOperator>false</ternaryOperator>
-            <variableAssignment>false</variableAssignment>
-            <variableIdentifier>false</variableIdentifier>
-        </alignment>
-        <backup>
-            <directory>bak</directory>
-            <level>0</level>
-        </backup>
-        <blanklines>
-            <after>
-                <block>1</block>
-                <braceLeft>0</braceLeft>
-                <class>1</class>
-                <declaration>0</declaration>
-                <footer>1</footer>
-                <header>0</header>
-                <interface>1</interface>
-                <lastImport>1</lastImport>
-                <method>1</method>
-                <package>1</package>
-            </after>
-            <before>
-                <block>1</block>
-                <braceRight>0</braceRight>
-                <caseBlock>1</caseBlock>
-                <comment>
-                    <javadoc>1</javadoc>
-                    <multiline>1</multiline>
-                    <singleline>1</singleline>
-                </comment>
-                <controlStatement>1</controlStatement>
-                <declaration>1</declaration>
-                <footer>0</footer>
-                <header>0</header>
-            </before>
-            <keepUpTo>3</keepUpTo>
-        </blanklines>
-        <braces>
-            <empty>
-                <cuddle>false</cuddle>
-                <insertStatement>false</insertStatement>
-            </empty>
-            <insert>
-                <dowhile>true</dowhile>
-                <for>true</for>
-                <ifelse>false</ifelse>
-                <while>true</while>
-            </insert>
-            <remove>
-                <block>true</block>
-                <dowhile>false</dowhile>
-                <for>false</for>
-                <ifelse>false</ifelse>
-                <while>false</while>
-            </remove>
-            <treatDifferent>
-                <methodClass>false</methodClass>
-                <methodClassIfWrapped>false</methodClassIfWrapped>
-            </treatDifferent>
-        </braces>
-        <chunks>
-            <blanklines>true</blanklines>
-            <comments>true</comments>
-        </chunks>
-        <comments>
-            <format>
-                <multiline>false</multiline>
-            </format>
-            <javadoc>
-                <check>
-                    <innerclass>false</innerclass>
-                    <tags>true</tags>
-                    <throwsTags>true</throwsTags>
-                </check>
-                <fieldsShort>false</fieldsShort>
-                <generate>
-                    <class>0</class>
-                    <constructor>0</constructor>
-                    <field>0</field>
-                    <method>0</method>
-                </generate>
-                <parseComments>false</parseComments>
-                <tags>
-                    <in-line />
-                    <standard />
-                </tags>
-                <templates>
-                    <method>
-                        <bottom> */</bottom>
-                        <exception> * @throws $exceptionType$ DOCUMENT ME!</exception>
-                        <param> * @param $paramType$ DOCUMENT ME!</param>
-                        <return> * @return DOCUMENT ME!</return>
-                        <top>/**| * DOCUMENT ME!</top>
-                    </method>
-                </templates>
-            </javadoc>
-            <remove>
-                <javadoc>false</javadoc>
-                <multiline>false</multiline>
-                <singleline>false</singleline>
-            </remove>
-            <separator>
-                <fillCharacter>-</fillCharacter>
-                <insert>false</insert>
-                <insertRecursive>false</insertRecursive>
-                <text>
-                    <class>Inner Classes</class>
-                    <constructor>Constructors</constructor>
-                    <field>Instance fields</field>
-                    <initializer>Instance initializers</initializer>
-                    <interface>Inner Interfaces</interface>
-                    <method>Methods</method>
-                    <static>Static fields/initializers</static>
-                </text>
-            </separator>
-        </comments>
-        <environment />
-        <footer>
-            <keys />
-            <smartMode>0</smartMode>
-            <use>false</use>
-        </footer>
-        <header>
-            <keys />
-            <smartMode>0</smartMode>
-            <use>false</use>
-        </header>
-        <history>
-            <policy>disabled</policy>
-        </history>
-        <imports>
-            <grouping>
-                <defaultDepth>2</defaultDepth>
-                <packages>*:0|gnu:2|java:2|javax:2</packages>
-            </grouping>
-            <policy>disabled</policy>
-            <sort>true</sort>
-        </imports>
-        <indentation>
-            <caseFromSwitch>true</caseFromSwitch>
-            <continuation>
-                <block>true</block>
-                <operator>true</operator>
-            </continuation>
-            <firstColumnComments>false</firstColumnComments>
-            <label>false</label>
-            <policy>
-                <deep>false</deep>
-            </policy>
-            <sizes>
-                <braceCuddled>1</braceCuddled>
-                <braceLeft>0</braceLeft>
-                <braceRight>0</braceRight>
-                <braceRightAfter>0</braceRightAfter>
-                <continuation>4</continuation>
-                <deep>55</deep>
-                <extends>-1</extends>
-                <general>4</general>
-                <implements>-1</implements>
-                <leading>0</leading>
-                <tabs>8</tabs>
-                <throws>-1</throws>
-                <trailingComment>1</trailingComment>
-            </sizes>
-            <tabs>
-                <enable>true</enable>
-                <onlyLeading>true</onlyLeading>
-            </tabs>
-        </indentation>
-        <misc>
-            <arrayBracketsAfterIdent>false</arrayBracketsAfterIdent>
-            <forceFormatting>false</forceFormatting>
-            <insertExpressionParentheses>true</insertExpressionParentheses>
-            <insertLoggingConditional>false</insertLoggingConditional>
-            <insertTrailingNewline>true</insertTrailingNewline>
-            <insertUID>false</insertUID>
-        </misc>
-        <sorting>
-            <declaration>
-                <class>true</class>
-                <constructor>true</constructor>
-                <enable>false</enable>
-                <interface>true</interface>
-                <method>true</method>
-                <order>static|field|initializer|constructor|method|interface|class</order>
-                <variable>true</variable>
-            </declaration>
-            <modifier>
-                <enable>false</enable>
-                <order>public|protected|private|abstract|static|final|synchronized|transient|volatile|native|strictfp</order>
-            </modifier>
-        </sorting>
-        <whitespace>
-            <after>
-                <comma>true</comma>
-                <semicolon>true</semicolon>
-                <typeCast>false</typeCast>
-            </after>
-            <before>
-                <braces>true</braces>
-                <brackets>false</brackets>
-                <bracketsTypes>false</bracketsTypes>
-                <caseColon>false</caseColon>
-                <operator>
-                    <not>false</not>
-                </operator>
-                <parentheses>
-                    <methodCall>false</methodCall>
-                    <methodDeclaration>false</methodDeclaration>
-                    <statement>true</statement>
-                </parentheses>
-            </before>
-            <padding>
-                <braces>true</braces>
-                <brackets>false</brackets>
-                <operator>
-                    <assignment>true</assignment>
-                    <bitwise>true</bitwise>
-                    <logical>true</logical>
-                    <mathematical>true</mathematical>
-                    <relational>true</relational>
-                    <shift>true</shift>
-                </operator>
-                <parenthesis>false</parenthesis>
-                <typeCast>false</typeCast>
-            </padding>
-        </whitespace>
-        <wrapping>
-            <always>
-                <after>
-                    <arrayElement>2147483647</arrayElement>
-                    <braceRight>true</braceRight>
-                    <extendsTypes>false</extendsTypes>
-                    <implementsTypes>false</implementsTypes>
-                    <label>true</label>
-                    <methodCallChained>false</methodCallChained>
-                    <ternaryOperator>
-                        <first>false</first>
-                        <second>false</second>
-                    </ternaryOperator>
-                    <throwsTypes>false</throwsTypes>
-                </after>
-                <before>
-                    <braceLeft>true</braceLeft>
-                    <extends>false</extends>
-                    <implements>false</implements>
-                    <throws>false</throws>
-                </before>
-                <parameter>
-                    <methodCall>false</methodCall>
-                    <methodCallNested>false</methodCallNested>
-                    <methodDeclaration>false</methodDeclaration>
-                </parameter>
-            </always>
-            <general>
-                <beforeOperator>false</beforeOperator>
-                <enable>true</enable>
-                <lineLength>78</lineLength>
-            </general>
-            <ondemand>
-                <after>
-                    <assignment>true</assignment>
-                    <leftParenthesis>false</leftParenthesis>
-                    <parameter>false</parameter>
-                    <types>
-                        <extends>false</extends>
-                        <implements>false</implements>
-                        <throws>false</throws>
-                    </types>
-                </after>
-                <before>
-                    <rightParenthesis>false</rightParenthesis>
-                </before>
-                <groupingParentheses>false</groupingParentheses>
-            </ondemand>
-        </wrapping>
-    </printer>
-</jalopy>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<jalopy>
+    <general>
+        <compliance>
+            <version>13</version>
+        </compliance>
+        <style>
+            <description>Cobertura source code conventions</description>
+            <name>Cobertura</name>
+        </style>
+    </general>
+    <inspector>
+        <enable>false</enable>
+        <naming>
+            <classes>
+                <abstract>[A-Z][a-zA-Z0-9]+</abstract>
+                <general>[A-Z][a-zA-Z0-9]+</general>
+            </classes>
+            <fields>
+                <default>[a-z][\w]+</default>
+                <defaultStatic>[a-z][\w]+</defaultStatic>
+                <defaultStaticFinal>[a-zA-Z][\w]+</defaultStaticFinal>
+                <private>[a-z][\w]+</private>
+                <privateStatic>[a-z][\w]+</privateStatic>
+                <privateStaticFinal>[a-zA-Z][\w]+</privateStaticFinal>
+                <protected>[a-z][\w]+</protected>
+                <protectedStatic>[a-z][\w]+</protectedStatic>
+                <protectedStaticFinal>[a-zA-Z][\w]+</protectedStaticFinal>
+                <public>[a-z][\w]+</public>
+                <publicStatic>[a-z][\w]+</publicStatic>
+                <publicStaticFinal>[a-zA-Z][\w]+</publicStaticFinal>
+            </fields>
+            <interfaces>[A-Z][a-zA-Z0-9]+</interfaces>
+            <labels>\w+</labels>
+            <methods>
+                <default>[a-z][\w]+</default>
+                <defaultStatic>[a-z][\w]+</defaultStatic>
+                <defaultStaticFinal>[a-z][\w]+</defaultStaticFinal>
+                <private>[a-z][\w]+</private>
+                <privateStatic>[a-z][\w]+</privateStatic>
+                <privateStaticFinal>[a-z][\w]+</privateStaticFinal>
+                <protected>[a-z][\w]+</protected>
+                <protectedStatic>[a-z][\w]+</protectedStatic>
+                <protectedStaticFinal>[a-z][\w]+</protectedStaticFinal>
+                <public>[a-z][\w]+</public>
+                <publicStatic>[a-z][\w]+</publicStatic>
+                <publicStaticFinal>[a-z][\w]+</publicStaticFinal>
+            </methods>
+            <packages>[a-z]+(?:\.[a-z]+)*</packages>
+            <parameters>
+                <default>[a-z][\w]+</default>
+                <final>[a-z][\w]+</final>
+            </parameters>
+            <variables>[a-z][\w]*</variables>
+        </naming>
+        <tips>
+            <adhereToNamingConvention>false</adhereToNamingConvention>
+            <alwaysOverrideHashCode>false</alwaysOverrideHashCode>
+            <avoidThreadGroups>false</avoidThreadGroups>
+            <declareCollectionComment>false</declareCollectionComment>
+            <dontIgnoreExceptions>false</dontIgnoreExceptions>
+            <dontSubstituteObjectEquals>false</dontSubstituteObjectEquals>
+            <neverDeclareException>false</neverDeclareException>
+            <neverDeclareThrowable>false</neverDeclareThrowable>
+            <neverInvokeWaitOutsideLoop>false</neverInvokeWaitOutsideLoop>
+            <neverReturnZeroArrays>false</neverReturnZeroArrays>
+            <neverUseEmptyFinally>false</neverUseEmptyFinally>
+            <obeyContractEquals>false</obeyContractEquals>
+            <overrideToString>false</overrideToString>
+            <referToObjectsByInterface>false</referToObjectsByInterface>
+            <replaceStructureWithClass>false</replaceStructureWithClass>
+            <stringLiterallI18n>false</stringLiterallI18n>
+            <useInterfaceOnlyForTypes>false</useInterfaceOnlyForTypes>
+            <wrongCollectionComment>false</wrongCollectionComment>
+        </tips>
+    </inspector>
+    <internal>
+        <version>6</version>
+    </internal>
+    <messages>
+        <priority>
+            <general>30000</general>
+            <parser>30000</parser>
+            <parserJavadoc>30000</parserJavadoc>
+            <printer>30000</printer>
+            <printerJavadoc>30000</printerJavadoc>
+            <transform>30000</transform>
+        </priority>
+        <showErrorStackTrace>true</showErrorStackTrace>
+    </messages>
+    <misc>
+        <threadCount>1</threadCount>
+    </misc>
+    <printer>
+        <alignment>
+            <methodCallChain>false</methodCallChain>
+            <parameterMethodDeclaration>false</parameterMethodDeclaration>
+            <ternaryOperator>false</ternaryOperator>
+            <variableAssignment>false</variableAssignment>
+            <variableIdentifier>false</variableIdentifier>
+        </alignment>
+        <backup>
+            <directory>bak</directory>
+            <level>0</level>
+        </backup>
+        <blanklines>
+            <after>
+                <block>1</block>
+                <braceLeft>0</braceLeft>
+                <class>1</class>
+                <declaration>0</declaration>
+                <footer>1</footer>
+                <header>0</header>
+                <interface>1</interface>
+                <lastImport>1</lastImport>
+                <method>1</method>
+                <package>1</package>
+            </after>
+            <before>
+                <block>1</block>
+                <braceRight>0</braceRight>
+                <caseBlock>1</caseBlock>
+                <comment>
+                    <javadoc>1</javadoc>
+                    <multiline>1</multiline>
+                    <singleline>1</singleline>
+                </comment>
+                <controlStatement>1</controlStatement>
+                <declaration>1</declaration>
+                <footer>0</footer>
+                <header>0</header>
+            </before>
+            <keepUpTo>3</keepUpTo>
+        </blanklines>
+        <braces>
+            <empty>
+                <cuddle>false</cuddle>
+                <insertStatement>false</insertStatement>
+            </empty>
+            <insert>
+                <dowhile>true</dowhile>
+                <for>true</for>
+                <ifelse>false</ifelse>
+                <while>true</while>
+            </insert>
+            <remove>
+                <block>true</block>
+                <dowhile>false</dowhile>
+                <for>false</for>
+                <ifelse>false</ifelse>
+                <while>false</while>
+            </remove>
+            <treatDifferent>
+                <methodClass>false</methodClass>
+                <methodClassIfWrapped>false</methodClassIfWrapped>
+            </treatDifferent>
+        </braces>
+        <chunks>
+            <blanklines>true</blanklines>
+            <comments>true</comments>
+        </chunks>
+        <comments>
+            <format>
+                <multiline>false</multiline>
+            </format>
+            <javadoc>
+                <check>
+                    <innerclass>false</innerclass>
+                    <tags>true</tags>
+                    <throwsTags>true</throwsTags>
+                </check>
+                <fieldsShort>false</fieldsShort>
+                <generate>
+                    <class>0</class>
+                    <constructor>0</constructor>
+                    <field>0</field>
+                    <method>0</method>
+                </generate>
+                <parseComments>false</parseComments>
+                <tags>
+                    <in-line />
+                    <standard />
+                </tags>
+                <templates>
+                    <method>
+                        <bottom> */</bottom>
+                        <exception> * @throws $exceptionType$ DOCUMENT ME!</exception>
+                        <param> * @param $paramType$ DOCUMENT ME!</param>
+                        <return> * @return DOCUMENT ME!</return>
+                        <top>/**| * DOCUMENT ME!</top>
+                    </method>
+                </templates>
+            </javadoc>
+            <remove>
+                <javadoc>false</javadoc>
+                <multiline>false</multiline>
+                <singleline>false</singleline>
+            </remove>
+            <separator>
+                <fillCharacter>-</fillCharacter>
+                <insert>false</insert>
+                <insertRecursive>false</insertRecursive>
+                <text>
+                    <class>Inner Classes</class>
+                    <constructor>Constructors</constructor>
+                    <field>Instance fields</field>
+                    <initializer>Instance initializers</initializer>
+                    <interface>Inner Interfaces</interface>
+                    <method>Methods</method>
+                    <static>Static fields/initializers</static>
+                </text>
+            </separator>
+        </comments>
+        <environment />
+        <footer>
+            <keys />
+            <smartMode>0</smartMode>
+            <use>false</use>
+        </footer>
+        <header>
+            <keys />
+            <smartMode>0</smartMode>
+            <use>false</use>
+        </header>
+        <history>
+            <policy>disabled</policy>
+        </history>
+        <imports>
+            <grouping>
+                <defaultDepth>2</defaultDepth>
+                <packages>*:0|gnu:2|java:2|javax:2</packages>
+            </grouping>
+            <policy>disabled</policy>
+            <sort>true</sort>
+        </imports>
+        <indentation>
+            <caseFromSwitch>true</caseFromSwitch>
+            <continuation>
+                <block>true</block>
+                <operator>true</operator>
+            </continuation>
+            <firstColumnComments>false</firstColumnComments>
+            <label>false</label>
+            <policy>
+                <deep>false</deep>
+            </policy>
+            <sizes>
+                <braceCuddled>1</braceCuddled>
+                <braceLeft>0</braceLeft>
+                <braceRight>0</braceRight>
+                <braceRightAfter>0</braceRightAfter>
+                <continuation>4</continuation>
+                <deep>55</deep>
+                <extends>-1</extends>
+                <general>4</general>
+                <implements>-1</implements>
+                <leading>0</leading>
+                <tabs>8</tabs>
+                <throws>-1</throws>
+                <trailingComment>1</trailingComment>
+            </sizes>
+            <tabs>
+                <enable>true</enable>
+                <onlyLeading>true</onlyLeading>
+            </tabs>
+        </indentation>
+        <misc>
+            <arrayBracketsAfterIdent>false</arrayBracketsAfterIdent>
+            <forceFormatting>false</forceFormatting>
+            <insertExpressionParentheses>true</insertExpressionParentheses>
+            <insertLoggingConditional>false</insertLoggingConditional>
+            <insertTrailingNewline>true</insertTrailingNewline>
+            <insertUID>false</insertUID>
+        </misc>
+        <sorting>
+            <declaration>
+                <class>true</class>
+                <constructor>true</constructor>
+                <enable>false</enable>
+                <interface>true</interface>
+                <method>true</method>
+                <order>static|field|initializer|constructor|method|interface|class</order>
+                <variable>true</variable>
+            </declaration>
+            <modifier>
+                <enable>false</enable>
+                <order>public|protected|private|abstract|static|final|synchronized|transient|volatile|native|strictfp</order>
+            </modifier>
+        </sorting>
+        <whitespace>
+            <after>
+                <comma>true</comma>
+                <semicolon>true</semicolon>
+                <typeCast>false</typeCast>
+            </after>
+            <before>
+                <braces>true</braces>
+                <brackets>false</brackets>
+                <bracketsTypes>false</bracketsTypes>
+                <caseColon>false</caseColon>
+                <operator>
+                    <not>false</not>
+                </operator>
+                <parentheses>
+                    <methodCall>false</methodCall>
+                    <methodDeclaration>false</methodDeclaration>
+                    <statement>true</statement>
+                </parentheses>
+            </before>
+            <padding>
+                <braces>true</braces>
+                <brackets>false</brackets>
+                <operator>
+                    <assignment>true</assignment>
+                    <bitwise>true</bitwise>
+                    <logical>true</logical>
+                    <mathematical>true</mathematical>
+                    <relational>true</relational>
+                    <shift>true</shift>
+                </operator>
+                <parenthesis>false</parenthesis>
+                <typeCast>false</typeCast>
+            </padding>
+        </whitespace>
+        <wrapping>
+            <always>
+                <after>
+                    <arrayElement>2147483647</arrayElement>
+                    <braceRight>true</braceRight>
+                    <extendsTypes>false</extendsTypes>
+                    <implementsTypes>false</implementsTypes>
+                    <label>true</label>
+                    <methodCallChained>false</methodCallChained>
+                    <ternaryOperator>
+                        <first>false</first>
+                        <second>false</second>
+                    </ternaryOperator>
+                    <throwsTypes>false</throwsTypes>
+                </after>
+                <before>
+                    <braceLeft>true</braceLeft>
+                    <extends>false</extends>
+                    <implements>false</implements>
+                    <throws>false</throws>
+                </before>
+                <parameter>
+                    <methodCall>false</methodCall>
+                    <methodCallNested>false</methodCallNested>
+                    <methodDeclaration>false</methodDeclaration>
+                </parameter>
+            </always>
+            <general>
+                <beforeOperator>false</beforeOperator>
+                <enable>true</enable>
+                <lineLength>78</lineLength>
+            </general>
+            <ondemand>
+                <after>
+                    <assignment>true</assignment>
+                    <leftParenthesis>false</leftParenthesis>
+                    <parameter>false</parameter>
+                    <types>
+                        <extends>false</extends>
+                        <implements>false</implements>
+                        <throws>false</throws>
+                    </types>
+                </after>
+                <before>
+                    <rightParenthesis>false</rightParenthesis>
+                </before>
+                <groupingParentheses>false</groupingParentheses>
+            </ondemand>
+        </wrapping>
+    </printer>
+</jalopy>
+
diff --git a/etc/plugin.properties b/cobertura/src/test/resources/etc/plugin.properties
similarity index 96%
rename from etc/plugin.properties
rename to cobertura/src/test/resources/etc/plugin.properties
index a0caa09..d1a53a7 100644
--- a/etc/plugin.properties
+++ b/cobertura/src/test/resources/etc/plugin.properties
@@ -1,2 +1,2 @@
-pluginName=cobertura
-providerName=cobertura.sourceforge.net
+pluginName=cobertura
+providerName=cobertura.sourceforge.net
diff --git a/etc/plugin.xml b/cobertura/src/test/resources/etc/plugin.xml
similarity index 97%
rename from etc/plugin.xml
rename to cobertura/src/test/resources/etc/plugin.xml
index f7b37d9..4395de8 100644
--- a/etc/plugin.xml
+++ b/cobertura/src/test/resources/etc/plugin.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-  name="%pluginName"
-  id="net.sourceforge.cobertura"
-  version="@product.version@"
-  provider-name="%providerName">
-
-  <runtime>
-    <!--
-      the runtime library must not contain the actual ant task
-      definitions otherwise eclipse gets rather upset.
-    -->
-    <library name="cobertura-main.jar"/>
-  </runtime>
-
-  <extension point="org.eclipse.ant.core.antTasks">
-    <antTask name="instrument" class="net.sourceforge.cobertura.ant.InstrumentTask" library="cobertura.jar"/>
-    <antTask name="merge" class="net.sourceforge.cobertura.ant.MergeTask" library="cobertura.jar"/>
-    <antTask name="report" class="net.sourceforge.cobertura.ant.ReportTask" library="cobertura.jar"/>
-    <antTask name="check" class="net.sourceforge.cobertura.ant.CheckTask" library="cobertura.jar"/>
-  </extension>
-</plugin>
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin
+  name="%pluginName"
+  id="net.sourceforge.cobertura"
+  version="@product.version@"
+  provider-name="%providerName">
+
+  <runtime>
+    <!--
+      the runtime library must not contain the actual ant task
+      definitions otherwise eclipse gets rather upset.
+    -->
+    <library name="cobertura-main.jar"/>
+  </runtime>
+
+  <extension point="org.eclipse.ant.core.antTasks">
+    <antTask name="instrument" class="net.sourceforge.cobertura.ant.InstrumentTask" library="cobertura.jar"/>
+    <antTask name="merge" class="net.sourceforge.cobertura.ant.MergeTask" library="cobertura.jar"/>
+    <antTask name="report" class="net.sourceforge.cobertura.ant.ReportTask" library="cobertura.jar"/>
+    <antTask name="check" class="net.sourceforge.cobertura.ant.CheckTask" library="cobertura.jar"/>
+  </extension>
+</plugin>
diff --git a/cobertura/src/test/resources/examples/add_cobertura_to_aspectj_examples.diff b/cobertura/src/test/resources/examples/add_cobertura_to_aspectj_examples.diff
new file mode 100644
index 0000000..a946e82
--- /dev/null
+++ b/cobertura/src/test/resources/examples/add_cobertura_to_aspectj_examples.diff
@@ -0,0 +1,50 @@
+diff -ruN aspectj1.5-orig/doc/examples/build.xml aspectj1.5/doc/examples/build.xml
+--- aspectj1.5-orig/doc/examples/build.xml	2005-12-20 12:06:58.000000000 -0500
++++ aspectj1.5/doc/examples/build.xml	2006-03-28 09:37:56.000000000 -0500
+@@ -14,6 +14,15 @@
+ 
+ <project name="aspectj-examples" default="spacewar" basedir=".">
+ 
++	<property name="cobertura.dir" value="C:/eclipse-workspace/cobertura" />
++	<path id="cobertura.classpath">
++		<fileset dir="${cobertura.dir}">
++			<include name="cobertura.jar" />
++			<include name="lib/**/*.jar" />
++		</fileset>
++	</path>
++	<taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
++
+     <target name="info" >
+       <echo>
+   This script builds the AspectJ examples.  
+@@ -135,10 +144,22 @@
+        		forkclasspath="${aspectjtools.jar}"
+           classpath="${aspectjrt.jar}"/>
+ 
++       <delete quiet="on" file="${example.dir}/cobertura.ser" />
++       <cobertura-instrument>
++         <fileset dir="${classes.dir}" />
++       </cobertura-instrument>
++
+        <antcall target="Ajx-run" >
+          <param name="class" value="${class}"/>
+        </antcall>
+ 
++       <delete quiet="on" dir="${example.dir}/cobertura-html" />
++       <cobertura-report destdir="${example.dir}/cobertura-html">
++         <fileset dir="${example.dir}">
++           <include name="**/*.java" />
++         </fileset>
++       </cobertura-report>
++
+     </target>
+ 
+     <target name="Ajx-run" 
+@@ -150,6 +171,7 @@
+            <pathelement path="${classes.dir}"/>
+            <pathelement path="${aspectjrt.jar}"/>
+           </classpath>
++          <classpath refid="cobertura.classpath" />
+        </java>
+     </target>
+ 
diff --git a/examples/basic/README b/cobertura/src/test/resources/examples/basic/README
similarity index 100%
rename from examples/basic/README
rename to cobertura/src/test/resources/examples/basic/README
diff --git a/examples/basic/build.properties b/cobertura/src/test/resources/examples/basic/build.properties
similarity index 96%
rename from examples/basic/build.properties
rename to cobertura/src/test/resources/examples/basic/build.properties
index 2b7d0b7..f37330b 100644
--- a/examples/basic/build.properties
+++ b/cobertura/src/test/resources/examples/basic/build.properties
@@ -1,23 +1,23 @@
-# The source code for the examples can be found in this directory
-src.dir=src
-
-# The path to cobertura.jar
-cobertura.dir=../..
-
-# Classes generated by the javac compiler are deposited in this directory
-classes.dir=classes
-
-# Instrumented classes are deposited into this directory
-instrumented.dir=instrumented
-
-# All reports go into this directory
-reports.dir=reports
-
-# Unit test reports from JUnit are deposited into this directory
-reports.xml.dir=${reports.dir}/junit-xml
-reports.html.dir=${reports.dir}/junit-html
-
-# Coverage reports are deposited into these directories
-coverage.xml.dir=${reports.dir}/cobertura-xml
-coverage.summaryxml.dir=${reports.dir}/cobertura-summary-xml
-coverage.html.dir=${reports.dir}/cobertura-html
+# The source code for the examples can be found in this directory
+src.dir=src
+
+# The path to cobertura.jar
+cobertura.dir=../..
+
+# Classes generated by the javac compiler are deposited in this directory
+classes.dir=classes
+
+# Instrumented classes are deposited into this directory
+instrumented.dir=instrumented
+
+# All reports go into this directory
+reports.dir=reports
+
+# Unit test reports from JUnit are deposited into this directory
+reports.xml.dir=${reports.dir}/junit-xml
+reports.html.dir=${reports.dir}/junit-html
+
+# Coverage reports are deposited into these directories
+coverage.xml.dir=${reports.dir}/cobertura-xml
+coverage.summaryxml.dir=${reports.dir}/cobertura-summary-xml
+coverage.html.dir=${reports.dir}/cobertura-html
diff --git a/examples/basic/build.xml b/cobertura/src/test/resources/examples/basic/build.xml
similarity index 94%
rename from examples/basic/build.xml
rename to cobertura/src/test/resources/examples/basic/build.xml
index a86ef1e..a8f3ed3 100644
--- a/examples/basic/build.xml
+++ b/cobertura/src/test/resources/examples/basic/build.xml
@@ -1,146 +1,146 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura.examples.basic" default="coverage" basedir=".">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
-    Copyright (C) 2006 Dan Godfrey
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<property file="build.properties" />
-
-	<path id="cobertura.classpath">
-		<fileset dir="${cobertura.dir}">
-			<include name="cobertura.jar" />
-			<include name="lib/**/*.jar" />
-		</fileset>
-	</path>
-
-	<taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
-
-	<target name="init">
-		<mkdir dir="${classes.dir}" />
-		<mkdir dir="${instrumented.dir}" />
-		<mkdir dir="${reports.xml.dir}" />
-		<mkdir dir="${reports.html.dir}" />
-		<mkdir dir="${coverage.xml.dir}" />
-		<mkdir dir="${coverage.summaryxml.dir}" />
-		<mkdir dir="${coverage.html.dir}" />
-	</target>
-
-	<target name="compile" depends="init">
-		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
-			<classpath refid="cobertura.classpath" />
-		</javac>
-	</target>
-
-	<target name="instrument" depends="init,compile">
-		<!--
-			Remove the coverage data file and any old instrumentation.
-		-->
-		<delete file="cobertura.ser"/>
-		<delete dir="${instrumented.dir}" />
-
-		<!--
-			Instrument the application classes, writing the
-			instrumented classes into ${build.instrumented.dir}.
-		-->
-		<cobertura-instrument todir="${instrumented.dir}">
-			<!--
-				The following line causes instrument to ignore any
-				source line containing a reference to log4j, for the
-				purposes of coverage reporting.
-			-->
-			<ignore regex="org.apache.log4j.*" />
-
-			<fileset dir="${classes.dir}">
-				<!--
-					Instrument all the application classes, but
-					don't instrument the test classes.
-				-->
-				<include name="**/*.class" />
-				<exclude name="**/*Test.class" />
-			</fileset>
-		</cobertura-instrument>
-	</target>
-
-	<target name="test" depends="init,compile">
-		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
-			<!--
-				Note the classpath order: instrumented classes are before the
-				original (uninstrumented) classes.  This is important.
-			-->
-			<classpath location="${instrumented.dir}" />
-			<classpath location="${classes.dir}" />
-
-			<!--
-				The instrumented classes reference classes used by the
-				Cobertura runtime, so Cobertura and its dependencies
-				must be on your classpath.
-			-->
-			<classpath refid="cobertura.classpath" />
-
-			<formatter type="xml" />
-			<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
-			<batchtest todir="${reports.xml.dir}" unless="testcase">
-				<fileset dir="${src.dir}">
-					<include name="**/*Test.java" />
-				</fileset>
-			</batchtest>
-		</junit>
-
-		<junitreport todir="${reports.xml.dir}">
-			<fileset dir="${reports.xml.dir}">
-				<include name="TEST-*.xml" />
-			</fileset>
-			<report format="frames" todir="${reports.html.dir}" />
-		</junitreport>
-	</target>
-
-	<target name="coverage-check">
-		<cobertura-check branchrate="34" totallinerate="100" />
-	</target>
-
-	<target name="coverage-report">
-		<!--
-			Generate an XML file containing the coverage data using
-			the "srcdir" attribute.
-		-->
-		<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
-	</target>
-
-	<target name="summary-coverage-report">
-		<!--
-			Generate an summary XML file containing the coverage data using
-			the "srcdir" attribute.
-		-->
-		<cobertura-report srcdir="${src.dir}" destdir="${coverage.summaryxml.dir}" format="summaryXml" />
-	</target>
-
-	<target name="alternate-coverage-report">
-		<!--
-			Generate a series of HTML files containing the coverage
-			data in a user-readable form using nested source filesets.
-		-->
-		<cobertura-report destdir="${coverage.html.dir}">
-			<fileset dir="${src.dir}">
-				<include name="**/*.java"/>
-			</fileset>
-		</cobertura-report>
-	</target>
-
-	<target name="clean" description="Remove all files created by the build/test process.">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" />
-		<delete file="cobertura.log" />
-		<delete file="cobertura.ser" />
-	</target>
-
-	<target name="coverage" depends="compile,instrument,test,coverage-report,summary-coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="cobertura.examples.basic" default="coverage" basedir=".">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
+    Copyright (C) 2006 Dan Godfrey
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<property file="build.properties" />
+
+	<path id="cobertura.classpath">
+		<fileset dir="${cobertura.dir}">
+			<include name="cobertura*.jar" />
+			<include name="lib/**/*.jar" />
+		</fileset>
+	</path>
+
+	<taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
+
+	<target name="init">
+		<mkdir dir="${classes.dir}" />
+		<mkdir dir="${instrumented.dir}" />
+		<mkdir dir="${reports.xml.dir}" />
+		<mkdir dir="${reports.html.dir}" />
+		<mkdir dir="${coverage.xml.dir}" />
+		<mkdir dir="${coverage.summaryxml.dir}" />
+		<mkdir dir="${coverage.html.dir}" />
+	</target>
+
+	<target name="compile" depends="init">
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
+			<classpath refid="cobertura.classpath" />
+		</javac>
+	</target>
+
+	<target name="instrument" depends="init,compile">
+		<!--
+			Remove the coverage data file and any old instrumentation.
+		-->
+		<delete file="cobertura.ser"/>
+		<delete dir="${instrumented.dir}" />
+
+		<!--
+			Instrument the application classes, writing the
+			instrumented classes into ${build.instrumented.dir}.
+		-->
+		<cobertura-instrument todir="${instrumented.dir}">
+			<!--
+				The following line causes instrument to ignore any
+				source line containing a reference to slf4j/logback, for the
+				purposes of coverage reporting.
+			-->
+			<ignore regex="org.slf4j.*" />
+
+			<fileset dir="${classes.dir}">
+				<!--
+					Instrument all the application classes, but
+					don't instrument the test classes.
+				-->
+				<include name="**/*.class" />
+				<exclude name="**/*Test.class" />
+			</fileset>
+		</cobertura-instrument>
+	</target>
+
+	<target name="test" depends="init,compile">
+		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
+			<!--
+				Note the classpath order: instrumented classes are before the
+				original (uninstrumented) classes.  This is important.
+			-->
+			<classpath location="${instrumented.dir}" />
+			<classpath location="${classes.dir}" />
+
+			<!--
+				The instrumented classes reference classes used by the
+				Cobertura runtime, so Cobertura and its dependencies
+				must be on your classpath.
+			-->
+			<classpath refid="cobertura.classpath" />
+
+			<formatter type="xml" />
+			<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
+			<batchtest todir="${reports.xml.dir}" unless="testcase">
+				<fileset dir="${src.dir}">
+					<include name="**/*Test.java" />
+				</fileset>
+			</batchtest>
+		</junit>
+
+		<junitreport todir="${reports.xml.dir}">
+			<fileset dir="${reports.xml.dir}">
+				<include name="TEST-*.xml" />
+			</fileset>
+			<report format="frames" todir="${reports.html.dir}" />
+		</junitreport>
+	</target>
+
+	<target name="coverage-check">
+		<cobertura-check branchrate="34" totallinerate="100" />
+	</target>
+
+	<target name="coverage-report">
+		<!--
+			Generate an XML file containing the coverage data using
+			the "srcdir" attribute.
+		-->
+		<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
+	</target>
+
+	<target name="summary-coverage-report">
+		<!--
+			Generate an summary XML file containing the coverage data using
+			the "srcdir" attribute.
+		-->
+		<cobertura-report srcdir="${src.dir}" destdir="${coverage.summaryxml.dir}" format="summaryXml" />
+	</target>
+
+	<target name="alternate-coverage-report">
+		<!--
+			Generate a series of HTML files containing the coverage
+			data in a user-readable form using nested source filesets.
+		-->
+		<cobertura-report destdir="${coverage.html.dir}">
+			<fileset dir="${src.dir}">
+				<include name="**/*.java"/>
+			</fileset>
+		</cobertura-report>
+	</target>
+
+	<target name="clean" description="Remove all files created by the build/test process.">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" />
+		<delete file="cobertura.log" />
+		<delete file="cobertura.ser" />
+	</target>
+
+	<target name="coverage" depends="compile,instrument,test,coverage-report,summary-coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>
+
+</project>
diff --git a/examples/basic/build_with_specific_data_file.xml b/cobertura/src/test/resources/examples/basic/build_with_specific_data_file.xml
similarity index 94%
rename from examples/basic/build_with_specific_data_file.xml
rename to cobertura/src/test/resources/examples/basic/build_with_specific_data_file.xml
index b2c8036..2b7caf1 100644
--- a/examples/basic/build_with_specific_data_file.xml
+++ b/cobertura/src/test/resources/examples/basic/build_with_specific_data_file.xml
@@ -1,127 +1,127 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-	This build file does the same thing as the normal build.xml for
-	this example, except that we specify a location for the coverage
-	data file.
--->
-
-<project name="cobertura.examples.basic" default="coverage" basedir=".">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<property file="build.properties" />
-
-	<path id="cobertura_classpath">
-		<fileset dir="${cobertura.dir}">
-			<include name="cobertura.jar" />
-			<include name="lib/**/*.jar" />
-		</fileset>
-	</path>
-
-	<taskdef classpathref="cobertura_classpath" resource="tasks.properties"/>
-
-	<target name="init">
-		<mkdir dir="${classes.dir}" />
-		<mkdir dir="${instrumented.dir}" />
-		<mkdir dir="${reports.xml.dir}" />
-		<mkdir dir="${reports.html.dir}" />
-		<mkdir dir="${coverage.xml.dir}" />
-		<mkdir dir="${coverage.html.dir}" />
-	</target>
-
-	<target name="compile" depends="init">
-		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
-			<classpath refid="cobertura_classpath" />
-		</javac>
-	</target>
-
-	<target name="instrument" depends="init,compile">
-		<!--
-			Remove the coverage data file and any old instrumentation.
-		-->
-		<delete file="${reports.dir}/basic_coverage.ser"/>
-		<delete dir="${instrumented.dir}" />
-
-		<!--
-			Instrument the application classes, writing the
-			instrumented classes into ${build.instrumented.dir}.
-		-->
-		<cobertura-instrument datafile="${reports.dir}/basic_coverage.ser" todir="${instrumented.dir}">
-			<!--
-				The following line causes instrument to ignore any
-				source line containing a reference to log4j, for the
-				purposes of coverage reporting.
-			-->
-			<ignore regex="org.apache.log4j.*" />
-
-			<fileset dir="${classes.dir}">
-				<!--
-					Instrument all the application classes, but
-					don't instrument the test classes.
-				-->
-				<include name="**/*.class" />
-				<exclude name="**/*Test.class" />
-			</fileset>
-		</cobertura-instrument>
-	</target>
-
-	<target name="test" depends="init,compile">
-		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
-			<!--
-				Specify the name of the coverage data file to use.
-			-->
-			<sysproperty key="net.sourceforge.cobertura.datafile" file="${reports.dir}/basic_coverage.ser" />
-
-			<!--
-				Note the classpath order: instrumented classes are before the
-				original (uninstrumented) classes.  This is important.
-			-->
-			<classpath location="${instrumented.dir}" />
-			<classpath location="${classes.dir}" />
-
-			<!--
-				The instrumented classes reference classes used by the
-				Cobertura runtime, so Cobertura and its dependencies
-				must be on your classpath.
-			-->
-			<classpath refid="cobertura_classpath" />
-
-			<formatter type="xml" />
-			<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
-			<batchtest todir="${reports.xml.dir}" unless="testcase">
-				<fileset dir="${src.dir}">
-					<include name="**/*Test.java" />
-				</fileset>
-			</batchtest>
-		</junit>
-
-		<junitreport todir="${reports.xml.dir}">
-			<fileset dir="${reports.xml.dir}">
-				<include name="TEST-*.xml" />
-			</fileset>
-			<report format="frames" todir="${reports.html.dir}" />
-		</junitreport>
-	</target>
-
-	<target name="coverage-report">
-		<cobertura-report datafile="${reports.dir}/basic_coverage.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
-		<cobertura-report datafile="${reports.dir}/basic_coverage.ser" srcdir="${src.dir}" destdir="${coverage.html.dir}" />
-	</target>
-
-	<target name="clean" description="Remove all files created by the build/test process.">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" />
-		<delete file="cobertura.log" />
-	</target>
-
-	<target name="coverage" depends="compile,instrument,test,coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+	This build file does the same thing as the normal build.xml for
+	this example, except that we specify a location for the coverage
+	data file.
+-->
+
+<project name="cobertura.examples.basic" default="coverage" basedir=".">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<property file="build.properties" />
+
+	<path id="cobertura_classpath">
+		<fileset dir="${cobertura.dir}">
+			<include name="cobertura.jar" />
+			<include name="lib/**/*.jar" />
+		</fileset>
+	</path>
+
+	<taskdef classpathref="cobertura_classpath" resource="tasks.properties"/>
+
+	<target name="init">
+		<mkdir dir="${classes.dir}" />
+		<mkdir dir="${instrumented.dir}" />
+		<mkdir dir="${reports.xml.dir}" />
+		<mkdir dir="${reports.html.dir}" />
+		<mkdir dir="${coverage.xml.dir}" />
+		<mkdir dir="${coverage.html.dir}" />
+	</target>
+
+	<target name="compile" depends="init">
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
+			<classpath refid="cobertura_classpath" />
+		</javac>
+	</target>
+
+	<target name="instrument" depends="init,compile">
+		<!--
+			Remove the coverage data file and any old instrumentation.
+		-->
+		<delete file="${reports.dir}/basic_coverage.ser"/>
+		<delete dir="${instrumented.dir}" />
+
+		<!--
+			Instrument the application classes, writing the
+			instrumented classes into ${build.instrumented.dir}.
+		-->
+		<cobertura-instrument datafile="${reports.dir}/basic_coverage.ser" todir="${instrumented.dir}">
+			<!--
+				The following line causes instrument to ignore any
+				source line containing a reference to slf4j/logback, for the
+				purposes of coverage reporting.
+			-->
+			<ignore regex="org.slf4j.*" />
+
+			<fileset dir="${classes.dir}">
+				<!--
+					Instrument all the application classes, but
+					don't instrument the test classes.
+				-->
+				<include name="**/*.class" />
+				<exclude name="**/*Test.class" />
+			</fileset>
+		</cobertura-instrument>
+	</target>
+
+	<target name="test" depends="init,compile">
+		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
+			<!--
+				Specify the name of the coverage data file to use.
+			-->
+			<sysproperty key="net.sourceforge.cobertura.datafile" file="${reports.dir}/basic_coverage.ser" />
+
+			<!--
+				Note the classpath order: instrumented classes are before the
+				original (uninstrumented) classes.  This is important.
+			-->
+			<classpath location="${instrumented.dir}" />
+			<classpath location="${classes.dir}" />
+
+			<!--
+				The instrumented classes reference classes used by the
+				Cobertura runtime, so Cobertura and its dependencies
+				must be on your classpath.
+			-->
+			<classpath refid="cobertura_classpath" />
+
+			<formatter type="xml" />
+			<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
+			<batchtest todir="${reports.xml.dir}" unless="testcase">
+				<fileset dir="${src.dir}">
+					<include name="**/*Test.java" />
+				</fileset>
+			</batchtest>
+		</junit>
+
+		<junitreport todir="${reports.xml.dir}">
+			<fileset dir="${reports.xml.dir}">
+				<include name="TEST-*.xml" />
+			</fileset>
+			<report format="frames" todir="${reports.html.dir}" />
+		</junitreport>
+	</target>
+
+	<target name="coverage-report">
+		<cobertura-report datafile="${reports.dir}/basic_coverage.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
+		<cobertura-report datafile="${reports.dir}/basic_coverage.ser" srcdir="${src.dir}" destdir="${coverage.html.dir}" />
+	</target>
+
+	<target name="clean" description="Remove all files created by the build/test process.">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" />
+		<delete file="cobertura.log" />
+	</target>
+
+	<target name="coverage" depends="compile,instrument,test,coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>
+
+</project>
diff --git a/examples/basic/src/com/example/simple/Simple.java b/cobertura/src/test/resources/examples/basic/src/com/example/simple/Simple.java
similarity index 90%
rename from examples/basic/src/com/example/simple/Simple.java
rename to cobertura/src/test/resources/examples/basic/src/com/example/simple/Simple.java
index 4a0c141..999f27b 100644
--- a/examples/basic/src/com/example/simple/Simple.java
+++ b/cobertura/src/test/resources/examples/basic/src/com/example/simple/Simple.java
@@ -1,106 +1,107 @@
-/**
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package com.example.simple;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.log4j.Logger;
-
-public class Simple
-{
-
-	private static final Logger logger = Logger.getLogger(Simple.class);
-
-	public int square(int x)
-	{
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("x: " + x);
-		}
-
-		int result = x * x;
-
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("result: " + result);
-		}
-
-		return result;
-	}
-
-	public int f(int x)
-	{
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("x: " + x);
-		}
-
-		if (x < 0)
-		{
-			if (logger.isDebugEnabled())
-			{
-				logger.debug("negative x");
-			}
-
-			return square(x);
-		}
-		else if ((x >= 0) && (x <= 5))
-		{
-			if (logger.isDebugEnabled())
-			{
-				logger.debug("0<=x<=5");
-			}
-
-			return x + 3;
-		}
-		else
-		{
-			return 2 * x;
-		}
-	}
-
-	public int sum(Collection c)
-	{
-		int result = 0;
-
-		for (Iterator i = c.iterator(); i.hasNext();)
-		{
-			int value = ((Number)i.next()).intValue();
-
-			if (logger.isDebugEnabled())
-			{
-				logger.debug("value: " + value);
-			}
-
-			result += value;
-		}
-
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("result: " + result);
-		}
-
-		return result;
-	}
+/**
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package com.example.simple;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Simple
+{
+
+	private static final Logger logger = LoggerFactory.getLogger(Simple.class);
+
+	public int square(int x)
+	{
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("x: " + x);
+		}
+
+		int result = x * x;
+
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("result: " + result);
+		}
+
+		return result;
+	}
+
+	public int f(int x)
+	{
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("x: " + x);
+		}
+
+		if (x < 0)
+		{
+			if (logger.isDebugEnabled())
+			{
+				logger.debug("negative x");
+			}
+
+			return square(x);
+		}
+		else if ((x >= 0) && (x <= 5))
+		{
+			if (logger.isDebugEnabled())
+			{
+				logger.debug("0<=x<=5");
+			}
+
+			return x + 3;
+		}
+		else
+		{
+			return 2 * x;
+		}
+	}
+
+	public int sum(Collection c)
+	{
+		int result = 0;
+
+		for (Iterator i = c.iterator(); i.hasNext();)
+		{
+			int value = ((Number)i.next()).intValue();
+
+			if (logger.isDebugEnabled())
+			{
+				logger.debug("value: " + value);
+			}
+
+			result += value;
+		}
+
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("result: " + result);
+		}
+
+		return result;
+	}
 }
\ No newline at end of file
diff --git a/examples/basic/src/com/example/simple/SimpleTest.java b/cobertura/src/test/resources/examples/basic/src/com/example/simple/SimpleTest.java
similarity index 96%
rename from examples/basic/src/com/example/simple/SimpleTest.java
rename to cobertura/src/test/resources/examples/basic/src/com/example/simple/SimpleTest.java
index a49c26e..24fccc3 100644
--- a/examples/basic/src/com/example/simple/SimpleTest.java
+++ b/cobertura/src/test/resources/examples/basic/src/com/example/simple/SimpleTest.java
@@ -1,60 +1,60 @@
-/**
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package com.example.simple;
-
-import java.util.Collection;
-import java.util.LinkedList;
-
-import junit.framework.TestCase;
-
-public class SimpleTest extends TestCase
-{
-
-	final Simple simple = new Simple();
-
-	public SimpleTest(String nm)
-	{
-		super(nm);
-	}
-
-	public void testSquare()
-	{
-		assertEquals(1, simple.square(1));
-		assertEquals(1, simple.square(-1));
-	}
-
-	public void testF()
-	{
-		assertEquals(1, simple.f(-1));
-		assertEquals(12, simple.f(6));
-	}
-
-	public void testSum()
-	{
-		Collection c = new LinkedList();
-		c.add(new Integer(3));
-		c.add(new Integer(5));
-		c.add(new Integer(8));
-		assertEquals(16, simple.sum(c));
-	}
+/**
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2005 Mark Doliner <thekingant at users.sourceforge.net>
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package com.example.simple;
+
+import junit.framework.TestCase;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+public class SimpleTest extends TestCase
+{
+
+	final Simple simple = new Simple();
+
+	public SimpleTest(String nm)
+	{
+		super(nm);
+	}
+
+	public void testSquare()
+	{
+		assertEquals(1, simple.square(1));
+		assertEquals(1, simple.square(-1));
+	}
+
+	public void testF()
+	{
+		assertEquals(1, simple.f(-1));
+		assertEquals(12, simple.f(6));
+	}
+
+	public void testSum()
+	{
+		Collection c = new LinkedList();
+		c.add(new Integer(3));
+		c.add(new Integer(5));
+		c.add(new Integer(8));
+		assertEquals(16, simple.sum(c));
+	}
 }
\ No newline at end of file
diff --git a/cobertura/src/test/resources/examples/functionalconditiontest/.gitignore b/cobertura/src/test/resources/examples/functionalconditiontest/.gitignore
new file mode 100644
index 0000000..18a60f9
--- /dev/null
+++ b/cobertura/src/test/resources/examples/functionalconditiontest/.gitignore
@@ -0,0 +1,3 @@
+/classes/
+/instrumented/
+/reports/
diff --git a/examples/functionalconditiontest/README b/cobertura/src/test/resources/examples/functionalconditiontest/README
similarity index 100%
copy from examples/functionalconditiontest/README
copy to cobertura/src/test/resources/examples/functionalconditiontest/README
diff --git a/examples/functionalconditiontest/build.properties b/cobertura/src/test/resources/examples/functionalconditiontest/build.properties
similarity index 95%
rename from examples/functionalconditiontest/build.properties
rename to cobertura/src/test/resources/examples/functionalconditiontest/build.properties
index 2bdc84c..4a26ef5 100644
--- a/examples/functionalconditiontest/build.properties
+++ b/cobertura/src/test/resources/examples/functionalconditiontest/build.properties
@@ -1,10 +1,10 @@
-
-# The path to cobertura.jar
-cobertura.dir=../..
-
-src.dir=src
-classes.dir=classes
-instrumented.dir=instrumented
-reports.dir=reports
-coverage.xml.dir=${reports.dir}/cobertura-xml
-coverage.html.dir=${reports.dir}/cobertura-html
+
+# The path to cobertura.jar
+cobertura.dir=../..
+
+src.dir=src
+classes.dir=classes
+instrumented.dir=instrumented
+reports.dir=reports
+coverage.xml.dir=${reports.dir}/cobertura-xml
+coverage.html.dir=${reports.dir}/cobertura-html
diff --git a/examples/functionalconditiontest/build.xml b/cobertura/src/test/resources/examples/functionalconditiontest/build.xml
similarity index 92%
rename from examples/functionalconditiontest/build.xml
rename to cobertura/src/test/resources/examples/functionalconditiontest/build.xml
index 3dafe1c..aca6679 100644
--- a/examples/functionalconditiontest/build.xml
+++ b/cobertura/src/test/resources/examples/functionalconditiontest/build.xml
@@ -1,98 +1,95 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura.examples.functionalconditiontest" basedir="." default="help">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2005 Mark Doliner
-	Copyright (C) 2006 John Lewis
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<property file="build.properties" />
-
-	<path id="project.classpath">
-		<path path="${java.class.path}" />
-		<!-- 
-		The next two should only come into play when running this script directly as
-		opposed to being called by a functional test.
-		-->
-		<pathelement location="../../etc" />
-		<pathelement location="../../build/classes" />
-		<fileset dir="../../lib">
-			<include name="*.jar" />
-		</fileset>
-	</path>
-
-	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
-
-	<target name="help">
-		<echo>This example is only used for testing, and is not meant</echo>
-		<echo>to be run from the command line.  It requires certain </echo>
-		<echo>classes to be on the class path to work correctly.</echo>
-	</target>
-
-	<target name="compile">
-		<mkdir dir="${classes.dir}" />
-		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" />
-	</target>
-
-	<target name="instrument-condition-coverage" depends="compile">
-		<mkdir dir="${instrumented.dir}" />
-		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}">
-			<ignore regex="org.apache.log4j.*" />
-			<fileset dir="${classes.dir}">
-				<include name="**/*.class" />
-				<exclude name="**/*Test*" />
-			</fileset>
-		</cobertura-instrument>
-
-		<path id="test.classpath">
-			<path location="${instrumented.dir}" />
-		</path>
-	</target>
-
-	<target name="test" depends="compile">
-		<junit fork="true" dir="${basedir}" haltonfailure="true">
-			<classpath refid="test.classpath" />
-			<classpath location="${classes.dir}" />
-			<classpath path="${java.class.path}" />
-			<classpath refid="project.classpath" />
-
-			<formatter type="plain" usefile="false" />
-			<test name="test.condition.Test" />
-		</junit>
-	</target>
-
-	<target name="coverage-reports">
-		<mkdir dir="${coverage.xml.dir}" />
-		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
-
-		<mkdir dir="${coverage.html.dir}" />
-		<!-- maxmemory is only specified to test the attribute -->
-		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
-			<fileset dir="${src.dir}">
-				<include name="**/*.java" />
-			</fileset>
-		</cobertura-report>
-	</target>
-
-	<target name="coverage-check">
-		<cobertura-check branchrate="34" totallinerate="100" />
-	</target>
-
-	<target name="clean">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" failonerror="false"/>
-		<delete file="cobertura.log" />
-		<delete file="cobertura.ser" />
-		<delete file="cobertura.ser.lock" />
-	</target>
-
-	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
-	<target name="all" depends="test-condition-coverage" />
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="cobertura.examples.functionalconditiontest" basedir="." default="help">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2005 Mark Doliner
+	Copyright (C) 2006 John Lewis
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<property file="build.properties" />
+
+	<path id="project.classpath">
+		<path path="${java.class.path}" />
+		<!-- 
+		The next two should only come into play when running this script directly as
+		opposed to being called by a functional test.
+		-->
+		<pathelement location="../../etc" />
+		<pathelement location="../../target/classes" />
+	</path>
+
+	<taskdef resource="tasks.properties" classpathref="project.classpath"/>
+
+	<target name="help">
+		<echo>This example is only used for testing, and is not meant</echo>
+		<echo>to be run from the command line.  It requires certain </echo>
+		<echo>classes to be on the class path to work correctly.</echo>
+	</target>
+
+	<target name="compile">
+		<mkdir dir="${classes.dir}" />
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" />
+	</target>
+
+	<target name="instrument-condition-coverage" depends="compile">
+		<mkdir dir="${instrumented.dir}" />
+		<cobertura-instrument datafile="${basedir}/cobertura.ser" todir="${instrumented.dir}">
+			<ignore regex="org.slf4j.*" />
+			<fileset dir="${classes.dir}">
+				<include name="**/*.class" />
+				<exclude name="**/*Test*" />
+			</fileset>
+		</cobertura-instrument>
+
+		<path id="test.classpath">
+			<path location="${instrumented.dir}" />
+		</path>
+	</target>
+
+	<target name="test" depends="compile">
+		<junit fork="true" dir="${basedir}" haltonfailure="true">
+			<classpath refid="test.classpath" />
+			<classpath location="${classes.dir}" />
+			<classpath path="${java.class.path}" />
+			<classpath refid="project.classpath" />
+
+			<formatter type="plain" usefile="false" />
+			<test name="test.condition.Test" />
+		</junit>
+	</target>
+
+	<target name="coverage-reports">
+		<mkdir dir="${coverage.xml.dir}" />
+		<cobertura-report datafile="${basedir}/cobertura.ser" srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
+
+		<mkdir dir="${coverage.html.dir}" />
+		<!-- maxmemory is only specified to test the attribute -->
+		<cobertura-report datafile="${basedir}/cobertura.ser" destdir="${coverage.html.dir}" maxmemory="512M">
+			<fileset dir="${src.dir}">
+				<include name="**/*.java" />
+			</fileset>
+		</cobertura-report>
+	</target>
+
+	<target name="coverage-check">
+		<cobertura-check branchrate="34" totallinerate="100" />
+	</target>
+
+	<target name="clean">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" failonerror="false"/>
+		<delete file="cobertura.log" />
+		<delete file="cobertura.ser" />
+		<delete file="cobertura.ser.lock" />
+	</target>
+
+	<target name="test-condition-coverage" depends="clean,compile,instrument-condition-coverage,test,coverage-reports" />
+	<target name="all" depends="test-condition-coverage" />
+
+</project>
diff --git a/examples/functionalconditiontest/src/test/condition/ConditionCalls.java b/cobertura/src/test/resources/examples/functionalconditiontest/src/test/condition/ConditionCalls.java
similarity index 91%
rename from examples/functionalconditiontest/src/test/condition/ConditionCalls.java
rename to cobertura/src/test/resources/examples/functionalconditiontest/src/test/condition/ConditionCalls.java
index d3bcf7c..d0cd4d2 100644
--- a/examples/functionalconditiontest/src/test/condition/ConditionCalls.java
+++ b/cobertura/src/test/resources/examples/functionalconditiontest/src/test/condition/ConditionCalls.java
@@ -1,104 +1,105 @@
-package test.condition;
-
-import org.apache.log4j.Logger;
-
-public class ConditionCalls {
-	
-	/*
-	 * See the note at FirstPassMethodInstrumenter.visitJumpInsn()
-	 * regarding initialization of static variables.  This next static
-	 * is intended to cover that condition. 
-	 */ 
-	public static String whatEver = null;
-	private static final Logger logger = Logger.getLogger(ConditionCalls.class);
-
-	public void call(int i)
-	{
-		if (i>=5) //set CALL_CONDITION_LINE_NUMBER to this line number
-		{
-			try
-			{
-				logger.error("whatEver");  //set CALL_IGNORE_LINE_NUMBER to this line number
-				throw new RuntimeException();
-			}
-			catch (Throwable t)
-			{
-				//eat it
-			}
-			finally
-			{
-				System.out.println("true");
-			}
-		} else {
-			System.out.println("false");
-		}
-	}
-	
-	public void callLookupSwitch(int branch)
-	{
-		switch (branch)  //set LOOKUP_SWITCH_LINE_NUMBER to this line number
-		{
-		case 1:
-			System.out.println("1");
-			break;
-		case 5:
-			System.out.println("5");
-			break;
-		default:
-			System.out.println("default");
-			break;
-		}
-	}
-	
-	public String callTableSwitch(int branch)
-	{
-		int[][] multiArray;
-		switch (branch)  //set TABLE_SWITCH_LINE_NUMBER to this line number
-		{
-		case 0: return("0");
-		case 1: return("1");
-		case 2: return("2");
-		case 3: return("3");
-		case 4: return("4");
-		case 5: return("5");
-		case 6: return("6");
-		case 7: return("7");
-		case 8: return("8");
-		default: multiArray = new int[3][3]; return("" + multiArray[1][1]);
-		}
-	}
-	
-	public void callMultiCondition(int a, int b, int c)
-	{
-		//The c++ is to get SecondPassMethodInstrumenter.visitIincInsn called.
-		if ((a == b) && (b >= 3) || (c++ < a))  //set MULTI_CONDITION_LINE_NUMBER to this line number
-		{
-			System.out.println("true");
-		}
-	}
-
-	public void callMultiCondition2(int a, int b, int c)
-	{
-		if ((a == b) && (b >= utilEcho(3)) || (c < a))  //set MULTI_CONDITION2_LINE_NUMBER to this line number
-		{
-			System.out.println("true");
-		}
-	}
-	
-	int utilEcho(int number)
-	{
-		return number;
-	}
-	
-	static
-	{
-		whatEver = "whatEver";
-	};
-	
-	public static final int CALL_CONDITION_LINE_NUMBER = 17;
-	public static final int CALL_IGNORE_LINE_NUMBER = 21;
-	public static final int LOOKUP_SWITCH_LINE_NUMBER = 39;
-	public static final int TABLE_SWITCH_LINE_NUMBER = 56;
-	public static final int MULTI_CONDITION_LINE_NUMBER = 74;
-	public static final int MULTI_CONDITION2_LINE_NUMBER = 82;
-}
+package test.condition;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConditionCalls {
+	
+	/*
+	 * See the note at FirstPassMethodInstrumenter.visitJumpInsn()
+	 * regarding initialization of static variables.  This next static
+	 * is intended to cover that condition. 
+	 */ 
+	public static String whatEver = null;
+	private static final Logger logger = LoggerFactory.getLogger(ConditionCalls.class);
+
+	public void call(int i)
+	{
+		if (i>=5) //set CALL_CONDITION_LINE_NUMBER to this line number
+		{
+			try
+			{
+				logger.error("whatEver");  //set CALL_IGNORE_LINE_NUMBER to this line number
+				throw new RuntimeException();
+			}
+			catch (Throwable t)
+			{
+				//eat it
+			}
+			finally
+			{
+				System.out.println("true");
+			}
+		} else {
+			System.out.println("false");
+		}
+	}
+	
+	public void callLookupSwitch(int branch)
+	{
+		switch (branch)  //set LOOKUP_SWITCH_LINE_NUMBER to this line number
+		{
+		case 1:
+			System.out.println("1");
+			break;
+		case 5:
+			System.out.println("5");
+			break;
+		default:
+			System.out.println("default");
+			break;
+		}
+	}
+	
+	public String callTableSwitch(int branch)
+	{
+		int[][] multiArray;
+		switch (branch)  //set TABLE_SWITCH_LINE_NUMBER to this line number
+		{
+		case 0: return("0");
+		case 1: return("1");
+		case 2: return("2");
+		case 3: return("3");
+		case 4: return("4");
+		case 5: return("5");
+		case 6: return("6");
+		case 7: return("7");
+		case 8: return("8");
+		default: multiArray = new int[3][3]; return("" + multiArray[1][1]);
+		}
+	}
+	
+	public void callMultiCondition(int a, int b, int c)
+	{
+		//The c++ is to get SecondPassMethodInstrumenter.visitIincInsn called.
+		if ((a == b) && (b >= 3) || (c++ < a))  //set MULTI_CONDITION_LINE_NUMBER to this line number
+		{
+			System.out.println("true");
+		}
+	}
+
+	public void callMultiCondition2(int a, int b, int c)
+	{
+		if ((a == b) && (b >= utilEcho(3)) || (c < a))  //set MULTI_CONDITION2_LINE_NUMBER to this line number
+		{
+			System.out.println("true");
+		}
+	}
+	
+	int utilEcho(int number)
+	{
+		return number;
+	}
+	
+	static
+	{
+		whatEver = "whatEver";
+	};
+	
+	public static final int CALL_CONDITION_LINE_NUMBER = 17;
+	public static final int CALL_IGNORE_LINE_NUMBER = 21;
+	public static final int LOOKUP_SWITCH_LINE_NUMBER = 39;
+	public static final int TABLE_SWITCH_LINE_NUMBER = 56;
+	public static final int MULTI_CONDITION_LINE_NUMBER = 74;
+	public static final int MULTI_CONDITION2_LINE_NUMBER = 82;
+}
diff --git a/examples/functionalconditiontest/src/test/condition/Test.java b/cobertura/src/test/resources/examples/functionalconditiontest/src/test/condition/Test.java
similarity index 96%
rename from examples/functionalconditiontest/src/test/condition/Test.java
rename to cobertura/src/test/resources/examples/functionalconditiontest/src/test/condition/Test.java
index 77d57f4..3705567 100644
--- a/examples/functionalconditiontest/src/test/condition/Test.java
+++ b/cobertura/src/test/resources/examples/functionalconditiontest/src/test/condition/Test.java
@@ -1,56 +1,56 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2007 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.condition;
-
-import junit.framework.TestCase;
-
-/**
- * Simple class used in functional testing of branch coverage.
- * 
- * @author John Lewis
- */
-public class Test extends TestCase
-{
-
-	public Test(String name)
-	{
-		super(name);
-	}
-
-	/**
-	 * Call the methods called "call"
-	 */
-	public void testMethod()
-	{
-		ConditionCalls branch = new ConditionCalls();
-		branch.call(7);
-		branch.callLookupSwitch(1);
-		branch.callTableSwitch(100);
-		branch.callMultiCondition(3, 7, 1);
-		branch.callMultiCondition2(7, 7, 100);
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2007 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package test.condition;
+
+import junit.framework.TestCase;
+
+/**
+ * Simple class used in functional testing of branch coverage.
+ * 
+ * @author John Lewis
+ */
+public class Test extends TestCase
+{
+
+	public Test(String name)
+	{
+		super(name);
+	}
+
+	/**
+	 * Call the methods called "call"
+	 */
+	public void testMethod()
+	{
+		ConditionCalls branch = new ConditionCalls();
+		branch.call(7);
+		branch.callLookupSwitch(1);
+		branch.callTableSwitch(100);
+		branch.callMultiCondition(3, 7, 1);
+		branch.callMultiCondition2(7, 7, 100);
+	}
+
+}
diff --git a/cobertura/src/test/resources/examples/functionaltest1/.gitignore b/cobertura/src/test/resources/examples/functionaltest1/.gitignore
new file mode 100644
index 0000000..766df18
--- /dev/null
+++ b/cobertura/src/test/resources/examples/functionaltest1/.gitignore
@@ -0,0 +1,4 @@
+/classes/
+/instrumented/
+/reports/
+/tmp/
diff --git a/examples/functionalconditiontest/README b/cobertura/src/test/resources/examples/functionaltest1/README
similarity index 96%
rename from examples/functionalconditiontest/README
rename to cobertura/src/test/resources/examples/functionaltest1/README
index 22d8d6e..6762127 100644
--- a/examples/functionalconditiontest/README
+++ b/cobertura/src/test/resources/examples/functionaltest1/README
@@ -1,14 +1,14 @@
-This directory contains an example of using Cobertura to
-instrument an application and generate coverage reports.
-
-To run the example:
-  ant
-
-The application and its tests will be compiled, Cobertura will
-instrument the application, the instrumented application will then be
-tested, and a Cobertura report produced in HTML and XML.
-
-The Cobertura reports can be found in:
-  reports/cobertura-html/index.html
-  reports/cobertura-xml/coverage.xml
-
+This directory contains an example of using Cobertura to
+instrument an application and generate coverage reports.
+
+To run the example:
+  ant
+
+The application and its tests will be compiled, Cobertura will
+instrument the application, the instrumented application will then be
+tested, and a Cobertura report produced in HTML and XML.
+
+The Cobertura reports can be found in:
+  reports/cobertura-html/index.html
+  reports/cobertura-xml/coverage.xml
+
diff --git a/examples/functionaltest1/build.properties b/cobertura/src/test/resources/examples/functionaltest1/build.properties
similarity index 95%
rename from examples/functionaltest1/build.properties
rename to cobertura/src/test/resources/examples/functionaltest1/build.properties
index 2bdc84c..4a26ef5 100644
--- a/examples/functionaltest1/build.properties
+++ b/cobertura/src/test/resources/examples/functionaltest1/build.properties
@@ -1,10 +1,10 @@
-
-# The path to cobertura.jar
-cobertura.dir=../..
-
-src.dir=src
-classes.dir=classes
-instrumented.dir=instrumented
-reports.dir=reports
-coverage.xml.dir=${reports.dir}/cobertura-xml
-coverage.html.dir=${reports.dir}/cobertura-html
+
+# The path to cobertura.jar
+cobertura.dir=../..
+
+src.dir=src
+classes.dir=classes
+instrumented.dir=instrumented
+reports.dir=reports
+coverage.xml.dir=${reports.dir}/cobertura-xml
+coverage.html.dir=${reports.dir}/cobertura-html
diff --git a/examples/functionaltest1/build.xml b/cobertura/src/test/resources/examples/functionaltest1/build.xml
similarity index 95%
rename from examples/functionaltest1/build.xml
rename to cobertura/src/test/resources/examples/functionaltest1/build.xml
index 7693cf7..bac1bc9 100644
--- a/examples/functionaltest1/build.xml
+++ b/cobertura/src/test/resources/examples/functionaltest1/build.xml
@@ -1,254 +1,251 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura.examples.functionaltest1" basedir="." default="help" xmlns:cobertura="antlib:net.sourceforge.cobertura.ant">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2005 Mark Doliner
-	Copyright (C) 2006 John Lewis
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<!-- Import the Cobertura Ant Library -->
-	<property name="cobertura.local.library" location="../../antLibrary" />
-	<import file="${cobertura.local.library}/library.xml" />
-
-	<property file="build.properties" />
-	
-	<path id="project.classpath">
-		<path path="${java.class.path}" />
-		<!-- 
-		The next two should only come into play when running this script directly as
-		opposed to being called by a functional test.
-		-->
-		<pathelement location="../../etc" />
-		<pathelement location="../../build/classes" />
-		
-		<pathelement location="../../src" />
-		<fileset dir="../../lib">
-			<include name="*.jar" />
-		</fileset>
-	</path>
-
-	<target name="taskdef">
-		<taskdef resource="tasks.properties" classpathref="project.classpath" />
-	</target>
-	
-	<target name="taskdef-antlib">
-		<taskdef 
-			classpathref="project.classpath"
-			resource="net/sourceforge/cobertura/ant/antlib.xml"
-			uri="antlib:net.sourceforge.cobertura.ant" />
-	</target>
-
-	<target name="help">
-		<echo>This example is only used for testing, and is not meant</echo>
-		<echo>to be run from the command line.  It requires certain </echo>
-		<echo>classes to be on the class path to work correctly.</echo>
-	</target>
-
-	<target name="compile">
-		<mkdir dir="${classes.dir}" />
-		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" classpathref="project.classpath" />
-		
-		<rmic 
-			base="${classes.dir}" 
-			classpathref="project.classpath" 
-			stubversion="1.2"
-			includes="test/first/RemoteListener.class"
-			debug="lines,source"
-			verify="true"
-		/>
-	</target>
-
-	<target name="instrument-includes-and-excludes" depends="compile,cobertura-groovy-init">
-		<mkdir dir="${instrumented.dir}" />
-		<cobertura:groovy><![CDATA[
-			//load testUtil definitions
-			evaluate(new File("${ant.project.baseDir}/../../testUtil.groovy"))
-
-			ant."${instrumentTaskName}"(datafile:'${basedir}/cobertura.ser', todir:'${instrumented.dir}', classpathref:'project.classpath') {
-				fileset(dir:'${classes.dir}') {
-					include(name:'**/A.class')
-					include(name:'test/first/RemoteListener*.class')
-					exclude(name:'**/B.class')
-					exclude(name:'**/*Test*')
-				}
-			}
-		]]> </cobertura:groovy>
-
-		<path id="test.classpath">
-			<path location="${instrumented.dir}" />
-		</path>
-	</target>
-
-	<target name="instrument-classpath" depends="compile,cobertura-groovy-init">
-		<mkdir dir="${instrumented.dir}" />
-		<cobertura:groovy><![CDATA[
-			//load testUtil definitions
-			evaluate(new File("${ant.project.baseDir}/../../testUtil.groovy"))
-
-			ant."${instrumentTaskName}"(datafile:'${basedir}/cobertura.ser', todir:'${instrumented.dir}') {
-				includeClasses(regex:'test.*')
-				excludeClasses(regex:'test.*.B')
-				excludeClasses(regex:'.*Test*')
-				instrumentationClasspath(location:'${classes.dir}')
-			}
-		]]> </cobertura:groovy>
-
-		<path id="test.classpath">
-			<path location="${instrumented.dir}" />
-		</path>
-	</target>
-
-	<target name="instrument-war" depends="compile,cobertura-groovy-init">
-		<property name="tmp" value="tmp" />
-		<property name="tmp.dir" value="${basedir}/${tmp}" />
-		<property name="this.test.work.dir" location="${tmp.dir}/war" />
-		<property name="this.test.wars" location="${tmp.dir}/wars" />
-		<property name="this.test.extract" location="${tmp.dir}/extract" />
-		<delete dir="${tmp.dir}" />
-		<mkdir dir="${tmp.dir}" />
-
-		<!-- Make a jar with a class from each package -->
-		<zip destfile="${tmp.dir}/app.jar">
-			<fileset dir="${classes.dir}">
-				<include name="test/first/A.class" />
-				<include name="test/second/B.class" />
-				<include name="test/first/RemoteListener*.class" />
-			</fileset>
-		</zip>
-		<!-- TODO: <signjar jar="${this.test.jars}/app.jar" alias="cobertura" storepass="secret" /> -->
-
-		<!-- Make a war file -->
-		<!-- This is required by the war task, but it can be empty -->
-		<touch file="${tmp.dir}/web.xml" />
-		<war destfile="${tmp.dir}/app.war" webxml="${tmp.dir}/web.xml">
-			<lib dir="${tmp.dir}">
-				<include name="app.jar" />
-			</lib>
-			<classes dir="${classes.dir}">
-				<include name="test/first/B.class" />
-				<include name="test/first/Test.class" />
-				<include name="test/second/A.class" />
-			</classes>
-		</war>
-
-		<!-- Instrument the war file -->
-		<mkdir dir="${instrumented.dir}" />
-		<cobertura:groovy><![CDATA[
-			//load testUtil definitions
-			evaluate(new File("${ant.project.baseDir}/../../testUtil.groovy"))
-
-			ant."${instrumentTaskName}"(datafile:'${basedir}/cobertura.ser', todir:'${instrumented.dir}') {
-				includeClasses(regex:'test.*')
-				excludeClasses(regex:'test.*.B')
-				excludeClasses(regex:'.*Test*')
-				fileset(dir:'${tmp.dir}') {
-					include(name:'app.war')
-				}
-			}
-		]]> </cobertura:groovy>
-
-		<!-- Unwar and set the classpath to the unwarred stuff -->
-		<unwar src="${instrumented.dir}/app.war" dest="${instrumented.dir}" />
-
-		<delete dir="${tmp.dir}" />
-
-		<path id="test.classpath">
-			<path location="${instrumented.dir}/WEB-INF/classes" />
-			<fileset dir="${instrumented.dir}/WEB-INF/lib">
-				<include name="*.jar" />
-			</fileset>
-		</path>
-	</target>
-
-	<target name="test" depends="compile">
-		<junit fork="true" dir="${basedir}" haltonfailure="true">
-			<classpath refid="test.classpath" />
-			<classpath location="${classes.dir}" />
-			<classpath path="${java.class.path}" />
-			<classpath refid="project.classpath" />
-
-			<formatter type="plain" usefile="false" />
-			<test name="test.first.Test" />
-		</junit>
-	</target>
-
-	<target name="coverage-reports-only" depends="cobertura-groovy-init">
-		<cobertura:groovy><![CDATA[
-			//load runReports definition
-			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
-			
-			runReports {
-				ant.fileset(dir:'${src.dir}', id:'mysrc') {
-					include(name:'**/*.java')
-				}
-			}
-		]]> </cobertura:groovy>
-	</target>
-	
-	<target name="coverage-reports" depends="taskdef,coverage-reports-only" />
-	
-	<target name="coverage-reports-with-dirset" depends="cobertura-groovy-init">
-		<cobertura:groovy><![CDATA[
-			//load runReports definition
-			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
-			
-			runReports {
-				ant.dirset(dir:'${basedir}', id:'mysrc') {
-					include(name:'**/src')
-				}
-			}
-		]]> </cobertura:groovy>
-	</target>
-
-	<target name="coverage-reports-with-archive" depends="cobertura-groovy-init">
-		<cobertura:groovy><![CDATA[
-			//load runReports definition
-			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
-			
-			//make a source zip file in the tmp.dir
-			ant.sequential {
-				delete(dir:'${tmp.dir}', failonerror:'false')
-				mkdir(dir:'${tmp.dir}')
-				zip(destfile:'${tmp.dir}/source.zip', basedir:'${src.dir}')
-			}
-	
-			runReports {
-				ant.dirset(dir:'${basedir}', id:'mysrc') {
-					include(name:'${tmp}')
-				}
-			}
-		]]> </cobertura:groovy>
-	</target>
-
-	<target name="coverage-check-only" depends="cobertura-groovy-init">
-		<cobertura:groovy><![CDATA[
-			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
-			
-			checkRates()
-			
-		]]> </cobertura:groovy>
-	</target>
-	
-	<target name="coverage-check" depends="taskdef-antlib,coverage-check-only" />
-
-	<target name="clean">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" failonerror="false"/>
-		<delete file="cobertura.log" />
-		<delete file="cobertura.ser" />
-		<delete file="cobertura.ser.lock" />
-	</target>
-
-	<target name="test-dirset" depends="taskdef-antlib,clean,compile,instrument-includes-and-excludes,test,coverage-reports-with-dirset,coverage-check-only" />
-	<target name="test-includes-and-excludes" depends="taskdef,clean,compile,instrument-includes-and-excludes,test,coverage-reports-only" />
-	<target name="test-classpath" depends="taskdef,clean,compile,instrument-classpath,test,coverage-reports-only" />
-	<target name="test-war" depends="taskdef,clean,compile,instrument-war,test,coverage-reports-with-archive" />
-	<target name="all" depends="taskdef,test-includes-and-excludes,test-classpath" />
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="cobertura.examples.functionaltest1" basedir="." default="help" xmlns:cobertura="antlib:net.sourceforge.cobertura.ant">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2005 Mark Doliner
+	Copyright (C) 2006 John Lewis
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<!-- Import the Cobertura Ant Library -->
+	<property name="cobertura.local.library" location="../../antLibrary" />
+	<import file="${cobertura.local.library}/library.xml" />
+
+	<property file="build.properties" />
+	
+	<path id="project.classpath">
+		<path path="${java.class.path}" />
+		<!-- 
+		The next two should only come into play when running this script directly as
+		opposed to being called by a functional test.
+		-->
+		<pathelement location="../../etc" />
+		<pathelement location="../../target/classes" />
+		
+		<pathelement location="../../src/main/java" />
+	</path>
+
+	<target name="taskdef">
+		<taskdef resource="tasks.properties" classpathref="project.classpath" />
+	</target>
+	
+	<target name="taskdef-antlib">
+		<taskdef 
+			classpathref="project.classpath"
+			resource="net/sourceforge/cobertura/ant/antlib.xml"
+			uri="antlib:net.sourceforge.cobertura.ant" />
+	</target>
+
+	<target name="help">
+		<echo>This example is only used for testing, and is not meant</echo>
+		<echo>to be run from the command line.  It requires certain </echo>
+		<echo>classes to be on the class path to work correctly.</echo>
+	</target>
+
+	<target name="compile">
+		<mkdir dir="${classes.dir}" />
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" classpathref="project.classpath" />
+		
+		<rmic 
+			base="${classes.dir}" 
+			classpathref="project.classpath" 
+			stubversion="1.2"
+			includes="test/first/RemoteListener.class"
+			debug="lines,source"
+			verify="true"
+		/>
+	</target>
+
+	<target name="instrument-includes-and-excludes" depends="compile,cobertura-groovy-init">
+		<mkdir dir="${instrumented.dir}" />
+		<cobertura:groovy><![CDATA[
+			//load testUtil definitions
+			evaluate(new File("${ant.project.baseDir}/../../testUtil.groovy"))
+
+			ant."${instrumentTaskName}"(datafile:'${basedir}/cobertura.ser', todir:'${instrumented.dir}', classpathref:'project.classpath') {
+				fileset(dir:'${classes.dir}') {
+					include(name:'**/A.class')
+					include(name:'test/first/RemoteListener*.class')
+					exclude(name:'**/B.class')
+					exclude(name:'**/*Test*')
+				}
+			}
+		]]> </cobertura:groovy>
+
+		<path id="test.classpath">
+			<path location="${instrumented.dir}" />
+		</path>
+	</target>
+
+	<target name="instrument-classpath" depends="compile,cobertura-groovy-init">
+		<mkdir dir="${instrumented.dir}" />
+		<cobertura:groovy><![CDATA[
+			//load testUtil definitions
+			evaluate(new File("${ant.project.baseDir}/../../testUtil.groovy"))
+
+			ant."${instrumentTaskName}"(datafile:'${basedir}/cobertura.ser', todir:'${instrumented.dir}') {
+				includeClasses(regex:'test.*')
+				excludeClasses(regex:'test.*.B')
+				excludeClasses(regex:'.*Test*')
+				instrumentationClasspath(location:'${classes.dir}')
+			}
+		]]> </cobertura:groovy>
+
+		<path id="test.classpath">
+			<path location="${instrumented.dir}" />
+		</path>
+	</target>
+
+	<target name="instrument-war" depends="compile,cobertura-groovy-init">
+		<property name="tmp" value="tmp" />
+		<property name="tmp.dir" value="${basedir}/${tmp}" />
+		<property name="this.test.work.dir" location="${tmp.dir}/war" />
+		<property name="this.test.wars" location="${tmp.dir}/wars" />
+		<property name="this.test.extract" location="${tmp.dir}/extract" />
+		<delete dir="${tmp.dir}" />
+		<mkdir dir="${tmp.dir}" />
+
+		<!-- Make a jar with a class from each package -->
+		<zip destfile="${tmp.dir}/app.jar">
+			<fileset dir="${classes.dir}">
+				<include name="test/first/A.class" />
+				<include name="test/second/B.class" />
+				<include name="test/first/RemoteListener*.class" />
+			</fileset>
+		</zip>
+		<!-- TODO: <signjar jar="${this.test.jars}/app.jar" alias="cobertura" storepass="secret" /> -->
+
+		<!-- Make a war file -->
+		<!-- This is required by the war task, but it can be empty -->
+		<touch file="${tmp.dir}/web.xml" />
+		<war destfile="${tmp.dir}/app.war" webxml="${tmp.dir}/web.xml">
+			<lib dir="${tmp.dir}">
+				<include name="app.jar" />
+			</lib>
+			<classes dir="${classes.dir}">
+				<include name="test/first/B.class" />
+				<include name="test/first/Test.class" />
+				<include name="test/second/A.class" />
+			</classes>
+		</war>
+
+		<!-- Instrument the war file -->
+		<mkdir dir="${instrumented.dir}" />
+		<cobertura:groovy><![CDATA[
+			//load testUtil definitions
+			evaluate(new File("${ant.project.baseDir}/../../testUtil.groovy"))
+
+			ant."${instrumentTaskName}"(datafile:'${basedir}/cobertura.ser', todir:'${instrumented.dir}') {
+				includeClasses(regex:'test.*')
+				excludeClasses(regex:'test.*.B')
+				excludeClasses(regex:'.*Test*')
+				fileset(dir:'${tmp.dir}') {
+					include(name:'app.war')
+				}
+			}
+		]]> </cobertura:groovy>
+
+		<!-- Unwar and set the classpath to the unwarred stuff -->
+		<unwar src="${instrumented.dir}/app.war" dest="${instrumented.dir}" />
+
+		<delete dir="${tmp.dir}" />
+
+		<path id="test.classpath">
+			<path location="${instrumented.dir}/WEB-INF/classes" />
+			<fileset dir="${instrumented.dir}/WEB-INF/lib">
+				<include name="*.jar" />
+			</fileset>
+		</path>
+	</target>
+
+	<target name="test" depends="compile">
+		<junit fork="true" dir="${basedir}" haltonfailure="true">
+			<classpath refid="test.classpath" />
+			<classpath location="${classes.dir}" />
+			<classpath path="${java.class.path}" />
+			<classpath refid="project.classpath" />
+
+			<formatter type="plain" usefile="false" />
+			<test name="test.first.Test" />
+		</junit>
+	</target>
+
+	<target name="coverage-reports-only" depends="cobertura-groovy-init">
+		<cobertura:groovy><![CDATA[
+			//load runReports definition
+			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
+			
+			runReports {
+				ant.fileset(dir:'${src.dir}', id:'mysrc') {
+					include(name:'**/*.java')
+				}
+			}
+		]]> </cobertura:groovy>
+	</target>
+	
+	<target name="coverage-reports" depends="taskdef,coverage-reports-only" />
+	
+	<target name="coverage-reports-with-dirset" depends="cobertura-groovy-init">
+		<cobertura:groovy><![CDATA[
+			//load runReports definition
+			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
+			
+			runReports {
+				ant.dirset(dir:'${basedir}', id:'mysrc') {
+					include(name:'**/src')
+				}
+			}
+		]]> </cobertura:groovy>
+	</target>
+
+	<target name="coverage-reports-with-archive" depends="cobertura-groovy-init">
+		<cobertura:groovy><![CDATA[
+			//load runReports definition
+			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
+			
+			//make a source zip file in the tmp.dir
+			ant.sequential {
+				delete(dir:'${tmp.dir}', failonerror:'false')
+				mkdir(dir:'${tmp.dir}')
+				zip(destfile:'${tmp.dir}/source.zip', basedir:'${src.dir}')
+			}
+	
+			runReports {
+				ant.dirset(dir:'${basedir}', id:'mysrc') {
+					include(name:'${tmp}')
+				}
+			}
+		]]> </cobertura:groovy>
+	</target>
+
+	<target name="coverage-check-only" depends="cobertura-groovy-init">
+		<cobertura:groovy><![CDATA[
+			evaluate(new File("${ant.project.baseDir}/functionalTest.groovy"))
+			
+			checkRates()
+			
+		]]> </cobertura:groovy>
+	</target>
+	
+	<target name="coverage-check" depends="taskdef-antlib,coverage-check-only" />
+
+	<target name="clean">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" failonerror="false"/>
+		<delete file="cobertura.log" />
+		<delete file="cobertura.ser" />
+		<delete file="cobertura.ser.lock" />
+	</target>
+
+	<target name="test-dirset" depends="taskdef-antlib,clean,compile,instrument-includes-and-excludes,test,coverage-reports-with-dirset,coverage-check-only" />
+	<target name="test-includes-and-excludes" depends="taskdef,clean,compile,instrument-includes-and-excludes,test,coverage-reports-only" />
+	<target name="test-classpath" depends="taskdef,clean,compile,instrument-classpath,test,coverage-reports-only" />
+	<target name="test-war" depends="taskdef,clean,compile,instrument-war,test,coverage-reports-with-archive" />
+	<target name="all" depends="taskdef,test-includes-and-excludes,test-classpath" />
+
+</project>
diff --git a/cobertura/src/test/resources/examples/functionaltest1/functionalTest.groovy b/cobertura/src/test/resources/examples/functionaltest1/functionalTest.groovy
new file mode 100644
index 0000000..bbd039e
--- /dev/null
+++ b/cobertura/src/test/resources/examples/functionaltest1/functionalTest.groovy
@@ -0,0 +1,216 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2008 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+
+import org.apache.tools.ant.BuildException
+
+import static org.junit.Assert.assertEquals
+
+//load testUtil definitions
+evaluate(new File("${ant.project.baseDir}/../../testUtil.groovy"))
+
+runReports = { set ->
+
+	//run a full xml report
+	ant."${reportTaskName}"(datafile:'${basedir}/cobertura.ser', srcdir:'${src.dir}', destdir:'${coverage.xml.dir}', format:'xml')
+	
+	def fullReport = readXMLReport("${ant.project.baseDir}/${properties.'coverage.xml.dir'}/coverage.xml")
+
+	//now run the summary report
+	ant."${reportTaskName}"(datafile:'${basedir}/cobertura.ser', srcdir:'${src.dir}', destdir:'${coverage.xml.dir}', format:'summaryxml')
+
+	def summary = readXMLReport("${ant.project.baseDir}/${properties.'coverage.xml.dir'}/coverage-summary.xml")
+
+	assertEquals(fullReport.totalComplexity, summary.totalComplexity, 0)
+	assertEquals(fullReport.totalLineRate, summary.totalLineRate)
+	assertEquals(fullReport.totalBranchRate, summary.totalBranchRate)
+	assertEquals(fullReport.totalLinesCovered, summary.totalLinesCovered)
+	assertEquals(fullReport.totalLinesValid, summary.totalLinesValid)
+	assertEquals(fullReport.totalBranchesCovered, summary.totalBranchesCovered)
+	assertEquals(fullReport.totalBranchesValid, summary.totalBranchesValid)
+	
+	ant.mkdir(dir:'${coverage.html.dir}')
+	
+	// maxmemory is only specified to test the attribute
+	ant."${reportTaskName}"([datafile:'${basedir}/cobertura.ser', destdir:'${coverage.html.dir}', maxmemory:'512M'], set)
+
+}
+
+readXMLReport = { xmlReport ->
+	def parser = new XmlParser()
+	parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false)
+	
+	def info = [:]
+	info.root = parser.parse(xmlReport)
+	
+	info.totalLineRate = rateToInt(info.root.'@line-rate')
+	info.totalBranchRate = rateToInt(info.root.'@branch-rate')
+	info.totalLinesCovered = info.root.'@lines-covered'.toInteger()
+	info.totalLinesValid = info.root.'@lines-valid'.toInteger()
+	info.totalBranchesCovered = info.root.'@branches-covered'.toInteger()
+	info.totalBranchesValid = info.root.'@branches-valid'.toInteger()
+	info.totalComplexity = info.root.'@complexity'.toDouble()
+	
+	assertEquals("line-rate should equal lines-covered/lines-valid", info.totalLineRate, calculateRate(info.totalLinesCovered, info.totalLinesValid))
+	assertEquals("branch-rate should equal branches-covered/branches-valid", info.totalBranchRate, calculateRate(info.totalBranchesCovered, info.totalBranchesValid))
+
+	info
+}
+ 
+checkRates = {
+	/*
+	 * Read the xml report to get the expected values
+	 */
+	def datafile = new File("${ant.project.baseDir}/cobertura.ser")
+	def xmlReport = new File("${ant.project.baseDir}/${ant.project.properties.'coverage.xml.dir'}/coverage.xml")
+	
+	def info = readXMLReport(xmlReport)
+	
+	
+	info.minPackageLineRate = rateToInt(info.root.packages.'package'.'@line-rate'*.toDouble().min().toString())
+	info.minPackageBranchRate = rateToInt(info.root.packages.'package'.'@branch-rate'*.toDouble().min().toString())
+	info.minClassLineRate = rateToInt(info.root.packages.'package'.classes.'class'.'@line-rate'*.toDouble().min().toString())
+	info.minClassBranchRate = rateToInt(info.root.packages.'package'.classes.'class'.'@branch-rate'*.toDouble().min().toString())
+	
+	def ratesMap = [
+			totallinerate:info.totalLineRate,
+			totalbranchrate:info.totalBranchRate,
+			packagelinerate:info.minPackageLineRate,
+			packagebranchrate:info.minPackageBranchRate,
+			linerate:info.minClassLineRate,
+			branchrate:info.minClassBranchRate
+	]
+	
+	/*
+	 * Do a check with all the values - this should pass
+	 */
+	ant.echo(message:"Doing a check with ${ratesMap} - it should pass")
+	def tempMap = [datafile:datafile]
+	tempMap.putAll(ratesMap)
+	ant."${checkTaskName}"(tempMap)
+
+	/*
+	 * Now do a check with each rate individually.   Add one to make sure it fails.
+	 * 
+	 * For those rates that equal 100, there is no way the check can fail, so do
+	 * a check to make sure it passes.
+	 */
+	ratesMap.each { rateType, rateValue ->
+		if (rateValue == 100) {
+			ant.echo(message:"Doing a check with ${rateType}=100 - it should pass")
+			ant."${checkTaskName}"(datafile:datafile, (rateType):rateValue)
+		} else {
+			ant.echo(message:"Doing a check with ${rateType}=${rateValue+1} - it should fail")
+			assertCheckFailure("Check of ${rateType} with value ${rateValue + 1} should have failed") {
+				ant."${checkTaskName}"(datafile:datafile, (rateType):rateValue + 1)
+			}
+		}
+	}
+	
+	if (!ratesMap.values().any { it < 50 }) {
+		ant.fail(message:"This test is expecting one rate to be under 50.   Otherwise the following test will fail.")
+	}
+	 
+	/*
+	 * Now do a check that does not specify any rates.   They should default to 50%.
+	 * This should fail.
+	 */
+	ant.echo(message:"Doing a check using the defaults - it should fail")
+	assertCheckFailure("Check with defaults should fail") {
+		 ant."${checkTaskName}"(datafile:datafile)
+	 }
+	 
+	/*
+	 * Now pass in all 0 values.   It should pass.
+	 */
+	ratesMap.keySet().each { tempMap.put(it, 0) }
+	ant.echo(message:"Doing a check with all zero rates: ${tempMap}")
+	ant."${checkTaskName}"(tempMap)
+	
+}
+ 
+ 
+rateToInt = { doubleString ->
+	doubleString = doubleString.toString()    //in case it is not a string
+	//multiply rate by 100 and drop the decimals
+	(Double.parseDouble(doubleString) * 100.0).intValue()
+}
+ 
+ 
+assertCheckFailure = { errorMessage, closure ->
+	boolean failed = false
+	try {
+		closure.call()
+	} catch (BuildException e) {
+		failed = true
+	}
+	if (!failed) {
+		ant.fail(message:errorMessage)
+	}
+}
+
+calculateRate = { covered, value ->
+	if (value == 0)
+	{
+		return 100
+	}
+	rateToInt(covered/value)
+}
+ 
+ 
+ 
+ 
+ 
+ 
diff --git a/examples/functionaltest1/src/test/first/A.java b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/A.java
similarity index 95%
rename from examples/functionaltest1/src/test/first/A.java
rename to cobertura/src/test/resources/examples/functionaltest1/src/test/first/A.java
index 97a3e7f..cd5898a 100644
--- a/examples/functionaltest1/src/test/first/A.java
+++ b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/A.java
@@ -1,59 +1,59 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2008 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.first;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-
-public class A
-{
-	/*
-	 * Add an annotation to make sure complexity is calculated correctly for source with annotations
-	 */
-	@Deprecated
-	public void call()
-	{
-		someMethod();
-	}
-
-	public void dontCall()
-	{
-		someMethod();
-	}
-
-	public static void someMethod()
-	{
-		String a = null;
-		String b = null;
-
-		a = b;
-		b = a;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2008 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package test.first;
+
+/**
+ * Simple class used in functional testing.
+ * 
+ * @author John Lewis
+ */
+
+public class A
+{
+	/*
+	 * Add an annotation to make sure complexity is calculated correctly for source with annotations
+	 */
+	@Deprecated
+	public void call()
+	{
+		someMethod();
+	}
+
+	public void dontCall()
+	{
+		someMethod();
+	}
+
+	public static void someMethod()
+	{
+		String a = null;
+		String b = null;
+
+		a = b;
+		b = a;
+	}
+
+}
diff --git a/examples/functionaltest1/src/test/first/B.java b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/B.java
similarity index 96%
rename from examples/functionaltest1/src/test/first/B.java
rename to cobertura/src/test/resources/examples/functionaltest1/src/test/first/B.java
index 807890f..6ff24ce 100644
--- a/examples/functionaltest1/src/test/first/B.java
+++ b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/B.java
@@ -1,46 +1,46 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.first;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-public class B
-{
-
-	public void call()
-	{
-		A.someMethod();
-	}
-
-	public void dontCall()
-	{
-		A.someMethod();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package test.first;
+
+/**
+ * Simple class used in functional testing.
+ * 
+ * @author John Lewis
+ */
+public class B
+{
+
+	public void call()
+	{
+		A.someMethod();
+	}
+
+	public void dontCall()
+	{
+		A.someMethod();
+	}
+
+}
diff --git a/examples/functionaltest1/src/test/first/RemoteInterface.java b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/RemoteInterface.java
similarity index 93%
rename from examples/functionaltest1/src/test/first/RemoteInterface.java
rename to cobertura/src/test/resources/examples/functionaltest1/src/test/first/RemoteInterface.java
index 524899d..96284bb 100644
--- a/examples/functionaltest1/src/test/first/RemoteInterface.java
+++ b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/RemoteInterface.java
@@ -1,7 +1,7 @@
-package test.first;
-
-import java.rmi.Remote;
-
-public interface RemoteInterface extends Remote {
-
-}
+package test.first;
+
+import java.rmi.Remote;
+
+public interface RemoteInterface extends Remote {
+
+}
diff --git a/examples/functionaltest1/src/test/first/RemoteListener.java b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/RemoteListener.java
similarity index 95%
rename from examples/functionaltest1/src/test/first/RemoteListener.java
rename to cobertura/src/test/resources/examples/functionaltest1/src/test/first/RemoteListener.java
index 7791fcc..2f9ecc7 100644
--- a/examples/functionaltest1/src/test/first/RemoteListener.java
+++ b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/RemoteListener.java
@@ -1,16 +1,16 @@
-package test.first;
-
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-
-public final class RemoteListener extends UnicastRemoteObject implements RemoteInterface {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	protected RemoteListener() throws RemoteException
-	{
-		
-	}
-}
+package test.first;
+
+import java.rmi.RemoteException;
+import java.rmi.server.UnicastRemoteObject;
+
+public final class RemoteListener extends UnicastRemoteObject implements RemoteInterface {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	protected RemoteListener() throws RemoteException
+	{
+		
+	}
+}
diff --git a/examples/functionaltest1/src/test/first/Test.java b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/Test.java
similarity index 95%
rename from examples/functionaltest1/src/test/first/Test.java
rename to cobertura/src/test/resources/examples/functionaltest1/src/test/first/Test.java
index e121a66..4ad0491 100644
--- a/examples/functionaltest1/src/test/first/Test.java
+++ b/cobertura/src/test/resources/examples/functionaltest1/src/test/first/Test.java
@@ -1,61 +1,61 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.first;
-
-import junit.framework.TestCase;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-public class Test extends TestCase
-{
-
-	public Test(String name)
-	{
-		super(name);
-	}
-
-	/**
-	 * Call the methods called "call"
-	 */
-	public void testMethod()
-	{
-		A a = new A();
-		a.call();
-
-		B b = new B();
-		b.call();
-
-		test.second.A a2 = new test.second.A();
-		a2.call();
-
-		test.second.B b2 = new test.second.B();
-		b2.call();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package test.first;
+
+import junit.framework.TestCase;
+
+/**
+ * Simple class used in functional testing.
+ * 
+ * @author John Lewis
+ */
+public class Test extends TestCase
+{
+
+	public Test(String name)
+	{
+		super(name);
+	}
+
+	/**
+	 * Call the methods called "call"
+	 */
+	public void testMethod()
+	{
+		A a = new A();
+		a.call();
+
+		B b = new B();
+		b.call();
+
+		test.second.A a2 = new test.second.A();
+		a2.call();
+
+		test.second.B b2 = new test.second.B();
+		b2.call();
+	}
+
+}
diff --git a/examples/functionaltest1/src/test/second/A.java b/cobertura/src/test/resources/examples/functionaltest1/src/test/second/A.java
similarity index 95%
rename from examples/functionaltest1/src/test/second/A.java
rename to cobertura/src/test/resources/examples/functionaltest1/src/test/second/A.java
index 346d7a6..cee0c91 100644
--- a/examples/functionaltest1/src/test/second/A.java
+++ b/cobertura/src/test/resources/examples/functionaltest1/src/test/second/A.java
@@ -1,55 +1,55 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.second;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-public class A
-{
-
-	public void call()
-	{
-		someMethod();
-	}
-
-	public void dontCall()
-	{
-		someMethod();
-	}
-
-	public static void someMethod()
-	{
-		String a = null;
-		String b = null;
-
-		a = b;
-		b = a;
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package test.second;
+
+/**
+ * Simple class used in functional testing.
+ * 
+ * @author John Lewis
+ */
+public class A
+{
+
+	public void call()
+	{
+		someMethod();
+	}
+
+	public void dontCall()
+	{
+		someMethod();
+	}
+
+	public static void someMethod()
+	{
+		String a = null;
+		String b = null;
+
+		a = b;
+		b = a;
+	}
+
+}
diff --git a/examples/functionaltest1/src/test/second/B.java b/cobertura/src/test/resources/examples/functionaltest1/src/test/second/B.java
similarity index 96%
rename from examples/functionaltest1/src/test/second/B.java
rename to cobertura/src/test/resources/examples/functionaltest1/src/test/second/B.java
index dbf08c1..428b1fa 100644
--- a/examples/functionaltest1/src/test/second/B.java
+++ b/cobertura/src/test/resources/examples/functionaltest1/src/test/second/B.java
@@ -1,46 +1,46 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package test.second;
-
-/**
- * Simple class used in functional testing.
- * 
- * @author John Lewis
- */
-public class B
-{
-
-	public void call()
-	{
-		A.someMethod();
-	}
-
-	public void dontCall()
-	{
-		A.someMethod();
-	}
-
-}
+/*
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2006 John Lewis
+ *
+ * Note: This file is dual licensed under the GPL and the Apache
+ * Source License (so that it can be used from both the main
+ * Cobertura classes and the ant tasks).
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package test.second;
+
+/**
+ * Simple class used in functional testing.
+ * 
+ * @author John Lewis
+ */
+public class B
+{
+
+	public void call()
+	{
+		A.someMethod();
+	}
+
+	public void dontCall()
+	{
+		A.someMethod();
+	}
+
+}
diff --git a/examples/groovy/README b/cobertura/src/test/resources/examples/groovy/README
similarity index 97%
rename from examples/groovy/README
rename to cobertura/src/test/resources/examples/groovy/README
index 9c5501a..ed1248a 100644
--- a/examples/groovy/README
+++ b/cobertura/src/test/resources/examples/groovy/README
@@ -1,14 +1,14 @@
-This directory contains a simple example of using Cobertura to
-instrument a Groovy application and generate coverage reports.
-
-To run the example:
-  ant
-
-The application and its tests will be compiled, Cobertura will
-instrument the application, the instrumented application will then be
-tested, and a Cobertura report produced in HTML and XML.
-
-The Cobertura reports can be found in:
-  reports/cobertura-html/index.html
-  reports/cobertura-xml/coverage.xml
-
+This directory contains a simple example of using Cobertura to
+instrument a Groovy application and generate coverage reports.
+
+To run the example:
+  ant
+
+The application and its tests will be compiled, Cobertura will
+instrument the application, the instrumented application will then be
+tested, and a Cobertura report produced in HTML and XML.
+
+The Cobertura reports can be found in:
+  reports/cobertura-html/index.html
+  reports/cobertura-xml/coverage.xml
+
diff --git a/examples/groovy/build.properties b/cobertura/src/test/resources/examples/groovy/build.properties
similarity index 96%
rename from examples/groovy/build.properties
rename to cobertura/src/test/resources/examples/groovy/build.properties
index eac9ebb..18c7410 100644
--- a/examples/groovy/build.properties
+++ b/cobertura/src/test/resources/examples/groovy/build.properties
@@ -1,25 +1,25 @@
-# The source code for the examples can be found in this directory
-src.dir=src
-
-# The path to cobertura.jar
-cobertura.dir=../..
-
-# The path to groovy.jar
-groovy.dir=C:/groovy-1.0-jsr-05/lib
-
-# Classes generated by the javac compiler are deposited in this directory
-classes.dir=classes
-
-# Instrumented classes are deposited into this directory
-instrumented.dir=instrumented
-
-# All reports go into this directory
-reports.dir=reports
-
-# Unit test reports from JUnit are deposited into this directory
-reports.xml.dir=${reports.dir}/junit-xml
-reports.html.dir=${reports.dir}/junit-html
-
-# Coverage reports are deposited into these directories
-coverage.xml.dir=${reports.dir}/cobertura-xml
-coverage.html.dir=${reports.dir}/cobertura-html
+# The source code for the examples can be found in this directory
+src.dir=src
+
+# The path to cobertura.jar
+cobertura.dir=../..
+
+# The path to groovy.jar
+groovy.dir=C:/groovy-1.0-jsr-05/lib
+
+# Classes generated by the javac compiler are deposited in this directory
+classes.dir=classes
+
+# Instrumented classes are deposited into this directory
+instrumented.dir=instrumented
+
+# All reports go into this directory
+reports.dir=reports
+
+# Unit test reports from JUnit are deposited into this directory
+reports.xml.dir=${reports.dir}/junit-xml
+reports.html.dir=${reports.dir}/junit-html
+
+# Coverage reports are deposited into these directories
+coverage.xml.dir=${reports.dir}/cobertura-xml
+coverage.html.dir=${reports.dir}/cobertura-html
diff --git a/examples/groovy/build.xml b/cobertura/src/test/resources/examples/groovy/build.xml
similarity index 94%
rename from examples/groovy/build.xml
rename to cobertura/src/test/resources/examples/groovy/build.xml
index de88bd6..1bceea3 100644
--- a/examples/groovy/build.xml
+++ b/cobertura/src/test/resources/examples/groovy/build.xml
@@ -1,140 +1,140 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="cobertura.examples.basic" default="coverage" basedir=".">
-
-	<description>
-    Cobertura - http://cobertura.sourceforge.net/
-    Copyright (C) 2003 jcoverage ltd.
-    Copyright (C) 2006 Mark Doliner <thekingant at users.sourceforge.net>
-    Cobertura is licensed under the GNU General Public License
-    Cobertura comes with ABSOLUTELY NO WARRANTY
-    </description>
-
-	<property file="build.properties" />
-
-	<path id="cobertura.classpath">
-		<fileset dir="${cobertura.dir}">
-			<include name="cobertura.jar" />
-			<include name="lib/**/*.jar" />
-		</fileset>
-	</path>
-
-	<taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
-
-	<path id="groovy.classpath">
-		<fileset dir="${groovy.dir}">
-			<include name="*.jar" />
-		</fileset>
-	</path>
-	<taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" classpathref="groovy.classpath" />
-
-	<target name="init">
-		<mkdir dir="${classes.dir}" />
-		<mkdir dir="${instrumented.dir}" />
-		<mkdir dir="${reports.xml.dir}" />
-		<mkdir dir="${reports.html.dir}" />
-		<mkdir dir="${coverage.xml.dir}" />
-		<mkdir dir="${coverage.html.dir}" />
-	</target>
-
-	<target name="compile" depends="init">
-		<groovyc srcdir="${src.dir}" destdir="${classes.dir}">
-			<classpath refid="cobertura.classpath" />
-		</groovyc>
-	</target>
-
-	<target name="instrument" depends="init,compile">
-		<!--
-			Remove the coverage data file and any old instrumentation.
-		-->
-		<delete file="cobertura.ser"/>
-		<delete dir="${instrumented.dir}" />
-
-		<!--
-			Instrument the application classes, writing the
-			instrumented classes into ${build.instrumented.dir}.
-		-->
-		<cobertura-instrument todir="${instrumented.dir}">
-			<!--
-				The following line causes instrument to ignore any
-				source line containing a reference to log4j, for the
-				purposes of coverage reporting.
-			-->
-			<ignore regex="org.apache.log4j.*" />
-
-			<fileset dir="${classes.dir}">
-				<!--
-					Instrument all the application classes, but
-					don't instrument the test classes.
-				-->
-				<include name="**/*.class" />
-				<exclude name="**/*Test.class" />
-			</fileset>
-		</cobertura-instrument>
-	</target>
-
-	<target name="test" depends="init,compile">
-		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
-			<!--
-				Note the classpath order: instrumented classes are before the
-				original (uninstrumented) classes.  This is important.
-			-->
-			<classpath location="${instrumented.dir}" />
-			<classpath location="${classes.dir}" />
-
-			<!--
-				The instrumented classes reference classes used by the
-				Cobertura runtime, so Cobertura and its dependencies
-				must be on your classpath.
-			-->
-			<classpath refid="cobertura.classpath" />
-
-			<classpath refid="groovy.classpath" />
-
-			<formatter type="xml" />
-			<test name="com.example.simple.SimpleTest" todir="${reports.xml.dir}" />
-		</junit>
-
-		<junitreport todir="${reports.xml.dir}">
-			<fileset dir="${reports.xml.dir}">
-				<include name="TEST-*.xml" />
-			</fileset>
-			<report format="frames" todir="${reports.html.dir}" />
-		</junitreport>
-	</target>
-
-	<target name="coverage-check">
-		<cobertura-check branchrate="34" totallinerate="100" />
-	</target>
-
-	<target name="coverage-report">
-		<!--
-			Generate an XML file containing the coverage data using
-			the "srcdir" attribute.
-		-->
-		<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
-	</target>
-
-	<target name="alternate-coverage-report">
-		<!--
-			Generate a series of HTML files containing the coverage
-			data in a user-readable form using nested source filesets.
-		-->
-		<cobertura-report destdir="${coverage.html.dir}">
-			<fileset dir="${src.dir}">
-				<include name="**/*.groovy"/>
-			</fileset>
-		</cobertura-report>
-	</target>
-
-	<target name="clean" description="Remove all files created by the build/test process.">
-		<delete dir="${classes.dir}" />
-		<delete dir="${instrumented.dir}" />
-		<delete dir="${reports.dir}" />
-		<delete file="cobertura.log" />
-		<delete file="cobertura.ser" />
-	</target>
-
-	<target name="coverage" depends="compile,instrument,test,coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>
-
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="cobertura.examples.basic" default="coverage" basedir=".">
+
+	<description>
+    Cobertura - http://cobertura.sourceforge.net/
+    Copyright (C) 2003 jcoverage ltd.
+    Copyright (C) 2006 Mark Doliner <thekingant at users.sourceforge.net>
+    Cobertura is licensed under the GNU General Public License
+    Cobertura comes with ABSOLUTELY NO WARRANTY
+    </description>
+
+	<property file="build.properties" />
+
+	<path id="cobertura.classpath">
+		<fileset dir="${cobertura.dir}">
+			<include name="cobertura.jar" />
+			<include name="lib/**/*.jar" />
+		</fileset>
+	</path>
+
+	<taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
+
+	<path id="groovy.classpath">
+		<fileset dir="${groovy.dir}">
+			<include name="*.jar" />
+		</fileset>
+	</path>
+	<taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" classpathref="groovy.classpath" />
+
+	<target name="init">
+		<mkdir dir="${classes.dir}" />
+		<mkdir dir="${instrumented.dir}" />
+		<mkdir dir="${reports.xml.dir}" />
+		<mkdir dir="${reports.html.dir}" />
+		<mkdir dir="${coverage.xml.dir}" />
+		<mkdir dir="${coverage.html.dir}" />
+	</target>
+
+	<target name="compile" depends="init">
+		<groovyc srcdir="${src.dir}" destdir="${classes.dir}">
+			<classpath refid="cobertura.classpath" />
+		</groovyc>
+	</target>
+
+	<target name="instrument" depends="init,compile">
+		<!--
+			Remove the coverage data file and any old instrumentation.
+		-->
+		<delete file="cobertura.ser"/>
+		<delete dir="${instrumented.dir}" />
+
+		<!--
+			Instrument the application classes, writing the
+			instrumented classes into ${build.instrumented.dir}.
+		-->
+		<cobertura-instrument todir="${instrumented.dir}">
+			<!--
+				The following line causes instrument to ignore any
+				source line containing a reference to slf4j/logback, for the
+				purposes of coverage reporting.
+			-->
+			<ignore regex="org.slf4j.*" />
+
+			<fileset dir="${classes.dir}">
+				<!--
+					Instrument all the application classes, but
+					don't instrument the test classes.
+				-->
+				<include name="**/*.class" />
+				<exclude name="**/*Test.class" />
+			</fileset>
+		</cobertura-instrument>
+	</target>
+
+	<target name="test" depends="init,compile">
+		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
+			<!--
+				Note the classpath order: instrumented classes are before the
+				original (uninstrumented) classes.  This is important.
+			-->
+			<classpath location="${instrumented.dir}" />
+			<classpath location="${classes.dir}" />
+
+			<!--
+				The instrumented classes reference classes used by the
+				Cobertura runtime, so Cobertura and its dependencies
+				must be on your classpath.
+			-->
+			<classpath refid="cobertura.classpath" />
+
+			<classpath refid="groovy.classpath" />
+
+			<formatter type="xml" />
+			<test name="com.example.simple.SimpleTest" todir="${reports.xml.dir}" />
+		</junit>
+
+		<junitreport todir="${reports.xml.dir}">
+			<fileset dir="${reports.xml.dir}">
+				<include name="TEST-*.xml" />
+			</fileset>
+			<report format="frames" todir="${reports.html.dir}" />
+		</junitreport>
+	</target>
+
+	<target name="coverage-check">
+		<cobertura-check branchrate="34" totallinerate="100" />
+	</target>
+
+	<target name="coverage-report">
+		<!--
+			Generate an XML file containing the coverage data using
+			the "srcdir" attribute.
+		-->
+		<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
+	</target>
+
+	<target name="alternate-coverage-report">
+		<!--
+			Generate a series of HTML files containing the coverage
+			data in a user-readable form using nested source filesets.
+		-->
+		<cobertura-report destdir="${coverage.html.dir}">
+			<fileset dir="${src.dir}">
+				<include name="**/*.groovy"/>
+			</fileset>
+		</cobertura-report>
+	</target>
+
+	<target name="clean" description="Remove all files created by the build/test process.">
+		<delete dir="${classes.dir}" />
+		<delete dir="${instrumented.dir}" />
+		<delete dir="${reports.dir}" />
+		<delete file="cobertura.log" />
+		<delete file="cobertura.ser" />
+	</target>
+
+	<target name="coverage" depends="compile,instrument,test,coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>
+
+</project>
diff --git a/examples/groovy/src/com/example/simple/Simple.groovy b/cobertura/src/test/resources/examples/groovy/src/com/example/simple/Simple.groovy
similarity index 89%
rename from examples/groovy/src/com/example/simple/Simple.groovy
rename to cobertura/src/test/resources/examples/groovy/src/com/example/simple/Simple.groovy
index 1ad0c8b..6471c75 100644
--- a/examples/groovy/src/com/example/simple/Simple.groovy
+++ b/cobertura/src/test/resources/examples/groovy/src/com/example/simple/Simple.groovy
@@ -1,101 +1,102 @@
-/**
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2006 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package com.example.simple;
-
-import org.apache.log4j.Logger;
-
-public class Simple
-{
-
-	private static final Logger logger = Logger.getLogger(Simple.class)
-
-	public int square(int x)
-	{
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("x: " + x)
-		}
-
-		def result = x * x
-
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("result: " + result)
-		}
-
-		return result
-	}
-
-	public int f(int x)
-	{
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("x: " + x)
-		}
-
-		if (x < 0)
-		{
-			if (logger.isDebugEnabled())
-			{
-				logger.debug("negative x")
-			}
-
-			return square(x)
-		}
-		else if ((x >= 0) && (x <= 5))
-		{
-			if (logger.isDebugEnabled())
-			{
-				logger.debug("0<=x<=5")
-			}
-
-			return x + 3
-		}
-		else
-		{
-			return 2 * x
-		}
-	}
-
-	public int sum(Collection c)
-	{
-		def result = 0;
-
-		for (i in c)
-		{
-			if (logger.isDebugEnabled())
-			{
-				logger.debug("value: " + i)
-			}
-
-			result += i;
-		}
-
-		if (logger.isDebugEnabled())
-		{
-			logger.debug("result: " + result)
-		}
-
-		return result
-	}
+/**
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2006 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package com.example.simple;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Simple
+{
+
+	private static final Logger logger = LoggerFactory.getLogger(Simple.class)
+
+	public int square(int x)
+	{
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("x: " + x)
+		}
+
+		def result = x * x
+
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("result: " + result)
+		}
+
+		return result
+	}
+
+	public int f(int x)
+	{
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("x: " + x)
+		}
+
+		if (x < 0)
+		{
+			if (logger.isDebugEnabled())
+			{
+				logger.debug("negative x")
+			}
+
+			return square(x)
+		}
+		else if ((x >= 0) && (x <= 5))
+		{
+			if (logger.isDebugEnabled())
+			{
+				logger.debug("0<=x<=5")
+			}
+
+			return x + 3
+		}
+		else
+		{
+			return 2 * x
+		}
+	}
+
+	public int sum(Collection c)
+	{
+		def result = 0;
+
+		for (i in c)
+		{
+			if (logger.isDebugEnabled())
+			{
+				logger.debug("value: " + i)
+			}
+
+			result += i;
+		}
+
+		if (logger.isDebugEnabled())
+		{
+			logger.debug("result: " + result)
+		}
+
+		return result
+	}
 }
\ No newline at end of file
diff --git a/examples/groovy/src/com/example/simple/SimpleTest.groovy b/cobertura/src/test/resources/examples/groovy/src/com/example/simple/SimpleTest.groovy
similarity index 96%
rename from examples/groovy/src/com/example/simple/SimpleTest.groovy
rename to cobertura/src/test/resources/examples/groovy/src/com/example/simple/SimpleTest.groovy
index 7886b10..a9c8860 100644
--- a/examples/groovy/src/com/example/simple/SimpleTest.groovy
+++ b/cobertura/src/test/resources/examples/groovy/src/com/example/simple/SimpleTest.groovy
@@ -1,57 +1,57 @@
-/**
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2006 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package com.example.simple;
-
-import junit.framework.TestCase;
-
-public class SimpleTest extends TestCase
-{
-
-	final def simple = new Simple()
-
-	public SimpleTest(String nm)
-	{
-		super(nm)
-	}
-
-	public void testSquare()
-	{
-		assertEquals(1, simple.square(1))
-		assertEquals(1, simple.square(-1))
-	}
-
-	public void testF()
-	{
-		assertEquals(1, simple.f(-1))
-		assertEquals(12, simple.f(6))
-	}
-
-	public void testSum()
-	{
-		def c = new LinkedList()
-		c.add(new Integer(3))
-		c.add(new Integer(5))
-		c.add(new Integer(8))
-		assertEquals(16, simple.sum(c))
-	}
+/**
+ * Cobertura - http://cobertura.sourceforge.net/
+ *
+ * Copyright (C) 2003 jcoverage ltd.
+ * Copyright (C) 2006 Mark Doliner
+ *
+ * Cobertura 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Cobertura 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 Cobertura; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+package com.example.simple;
+
+import junit.framework.TestCase;
+
+public class SimpleTest extends TestCase
+{
+
+	final def simple = new Simple()
+
+	public SimpleTest(String nm)
+	{
+		super(nm)
+	}
+
+	public void testSquare()
+	{
+		assertEquals(1, simple.square(1))
+		assertEquals(1, simple.square(-1))
+	}
+
+	public void testF()
+	{
+		assertEquals(1, simple.f(-1))
+		assertEquals(12, simple.f(6))
+	}
+
+	public void testSum()
+	{
+		def c = new LinkedList()
+		c.add(new Integer(3))
+		c.add(new Integer(5))
+		c.add(new Integer(8))
+		assertEquals(16, simple.sum(c))
+	}
 }
\ No newline at end of file
diff --git a/cobertura/src/test/resources/jetty/etc/jetty.xml b/cobertura/src/test/resources/jetty/etc/jetty.xml
new file mode 100644
index 0000000..87929aa
--- /dev/null
+++ b/cobertura/src/test/resources/jetty/etc/jetty.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
+
+<!-- =============================================================== -->
+<!-- Configure the Jetty Server                                      -->
+<!--                                                                 -->
+<!-- Documentation of this file format can be found at:              -->
+<!-- http://docs.codehaus.org/display/JETTY/jetty.xml                -->
+<!--                                                                 -->
+<!-- =============================================================== -->
+
+
+<Configure id="Server" class="org.mortbay.jetty.Server">
+
+    <!-- =========================================================== -->
+    <!-- Server Thread Pool                                          -->
+    <!-- =========================================================== -->
+    <Set name="ThreadPool">
+
+      <New class="org.mortbay.thread.QueuedThreadPool">
+        <Set name="minThreads">10</Set>
+        <Set name="maxThreads">200</Set>
+        <Set name="lowThreads">20</Set>
+        <Set name="SpawnOrShrinkAt">2</Set>
+      </New>
+
+      <!-- Optional Java 5 bounded threadpool with job queue 
+      <New class="org.mortbay.thread.concurrent.ThreadPool">
+        <Set name="corePoolSize">50</Set>
+        <Set name="maximumPoolSize">50</Set>
+      </New>
+      -->
+    </Set>
+
+
+
+    <!-- =========================================================== -->
+    <!-- Set connectors                                              -->
+    <!-- =========================================================== -->
+    <!-- One of each type!                                           -->
+    <!-- =========================================================== -->
+
+    <!-- Use this connector for many frequently idle connections
+         and for threadless continuations.
+    -->    
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.mortbay.jetty.nio.SelectChannelConnector">
+            <Set name="host"><SystemProperty name="jetty.host" /></Set>
+            <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
+            <Set name="maxIdleTime">30000</Set>
+            <Set name="Acceptors">2</Set>
+            <Set name="statsOn">false</Set>
+            <Set name="confidentialPort">8443</Set>
+	    <Set name="lowResourcesConnections">5000</Set>
+	    <Set name="lowResourcesMaxIdleTime">5000</Set>
+          </New>
+      </Arg>
+    </Call>
+
+    <!-- Use this connector if NIO is not available. 
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.mortbay.jetty.bio.SocketConnector">
+            <Set name="port">8081</Set>
+            <Set name="maxIdleTime">50000</Set>
+            <Set name="lowResourceMaxIdleTime">1500</Set>
+          </New>
+      </Arg>
+    </Call>
+    -->
+
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+    <!-- To add a HTTPS SSL listener                                     -->
+    <!-- see jetty-ssl.xml to add an ssl connector. use                  -->
+    <!-- java -jar start.jar etc/jetty.xml etc/jetty-ssl.xml             -->
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+    
+    <!-- =========================================================== -->
+    <!-- Set up global session ID manager                            -->
+    <!-- =========================================================== -->
+    <!--
+    <Set name="sessionIdManager">
+      <New class="org.mortbay.jetty.servlet.HashSessionIdManager">
+        <Set name="workerName">node1</Set>
+      </New>
+    </Set>
+    -->
+
+    <!-- =========================================================== -->
+    <!-- Set handler Collection Structure                            --> 
+    <!-- =========================================================== -->
+    <Set name="handler">
+      <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
+        <Set name="handlers">
+         <Array type="org.mortbay.jetty.Handler">
+           <Item>
+             <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
+           </Item>
+           <Item>
+             <New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
+           </Item>
+           <Item>
+             <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
+           </Item>
+         </Array>
+        </Set>
+      </New>
+    </Set>
+    
+    <!-- =========================================================== -->
+    <!-- Configure the context deployer                              -->
+    <!-- A context deployer will deploy contexts described in        -->
+    <!-- configuration files discovered in a directory.              -->
+    <!-- The configuration directory can be scanned for hot          -->
+    <!-- deployments at the configured scanInterval.                 -->
+    <!--                                                             -->
+    <!-- This deployer is configured to deploy contexts configured   -->
+    <!-- in the $JETTY_HOME/contexts directory                       -->
+    <!--                                                             -->
+    <!-- =========================================================== -->
+    <Call name="addLifeCycle">
+      <Arg>
+        <New class="org.mortbay.jetty.deployer.ContextDeployer">
+          <Set name="contexts"><Ref id="Contexts"/></Set>
+          <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
+          <Set name="scanInterval">5</Set>
+        </New>
+      </Arg>
+    </Call>
+
+    <!-- =========================================================== -->
+    <!-- Configure the webapp deployer.                              -->
+    <!-- A webapp  deployer will deploy standard webapps discovered  -->
+    <!-- in a directory at startup, without the need for additional  -->
+    <!-- configuration files.    It does not support hot deploy or   -->
+    <!-- non standard contexts (see ContextDeployer above).          -->
+    <!--                                                             -->
+    <!-- This deployer is configured to deploy webapps from the      -->
+    <!-- $JETTY_HOME/webapps directory                               -->
+    <!--                                                             -->
+    <!-- Normally only one type of deployer need be used.            -->
+    <!--                                                             -->
+    <!-- =========================================================== -->
+    <Call name="addLifeCycle">
+      <Arg>
+        <New class="org.mortbay.jetty.deployer.WebAppDeployer">
+          <Set name="contexts"><Ref id="Contexts"/></Set>
+          <Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
+	  <Set name="parentLoaderPriority">false</Set>
+	  <Set name="extract">true</Set>
+	  <Set name="allowDuplicates">false</Set>
+          <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
+        </New>
+      </Arg>
+    </Call>
+
+    <!-- =========================================================== -->
+    <!-- Configure Authentication Realms                             -->
+    <!-- Realms may be configured for the entire server here, or     -->
+    <!-- they can be configured for a specific web app in a context  -->
+    <!-- configuration (see $(jetty.home)/contexts/test.xml for an   -->
+    <!-- example).                                                   -->
+    <!-- =========================================================== -->
+    <Set name="UserRealms">
+      <Array type="org.mortbay.jetty.security.UserRealm">
+        <Item>
+          <New class="org.mortbay.jetty.security.HashUserRealm">
+            <Set name="name">Test Realm</Set>
+            <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
+            <Set name="refreshInterval">0</Set>
+          </New>
+        </Item>
+      </Array>
+    </Set>
+
+    <!-- =========================================================== -->
+    <!-- Configure Request Log                                       -->
+    <!-- Request logs  may be configured for the entire server here, -->
+    <!-- or they can be configured for a specific web app in a       -->
+    <!-- contexts configuration (see $(jetty.home)/contexts/test.xml -->
+    <!-- for an example).                                            -->
+    <!-- =========================================================== -->
+    <Ref id="RequestLog">
+      <Set name="requestLog">
+        <New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
+          <Set name="filename"><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.request.log</Set>
+          <Set name="filenameDateFormat">yyyy_MM_dd</Set>
+          <Set name="retainDays">90</Set>
+          <Set name="append">true</Set>
+          <Set name="extended">false</Set>
+          <Set name="logCookies">false</Set>
+          <Set name="LogTimeZone">GMT</Set>
+        </New>
+      </Set>
+    </Ref>
+
+    <!-- =========================================================== -->
+    <!-- extra options                                               -->
+    <!-- =========================================================== -->
+    <Set name="stopAtShutdown">true</Set>
+    <Set name="sendServerVersion">true</Set>
+    <Set name="sendDateHeader">true</Set>
+    <Set name="gracefulShutdown">1000</Set>
+
+</Configure>
diff --git a/cobertura/src/test/resources/jetty/etc/realm.properties b/cobertura/src/test/resources/jetty/etc/realm.properties
new file mode 100644
index 0000000..f9e4e7f
--- /dev/null
+++ b/cobertura/src/test/resources/jetty/etc/realm.properties
@@ -0,0 +1,21 @@
+#
+# This file defines users passwords and roles for a HashUserRealm
+#
+# The format is
+#  <username>: <password>[,<rolename> ...]
+#
+# Passwords may be clear text, obfuscated or checksummed.  The class 
+# org.mortbay.util.Password should be used to generate obfuscated
+# passwords or password checksums
+#
+# If DIGEST Authentication is used, the password must be in a recoverable
+# format, either plain text or OBF:.
+#
+jetty: MD5:164c88b302622e17050af52c89945d44,user
+admin: CRYPT:ad1ks..kc.1Ug,server-administrator,content-administrator,admin
+other: OBF:1xmk1w261u9r1w1c1xmq
+plain: plain
+user: password
+
+# This entry is for digest auth.  The credential is a MD5 hash of username:realmname:password
+digest: MD5:6e120743ad67abfbc385bc2bb754e297
diff --git a/cobertura/src/test/resources/jetty/etc/webdefault.xml b/cobertura/src/test/resources/jetty/etc/webdefault.xml
new file mode 100644
index 0000000..df9fa17
--- /dev/null
+++ b/cobertura/src/test/resources/jetty/etc/webdefault.xml
@@ -0,0 +1,402 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!-- ===================================================================== -->
+<!-- This file contains the default descriptor for web applications.       -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+<!-- The intent of this descriptor is to include jetty specific or common  -->
+<!-- configuration for all webapps.   If a context has a webdefault.xml    -->
+<!-- descriptor, it is applied before the contexts own web.xml file        -->
+<!--                                                                       -->
+<!-- A context may be assigned a default descriptor by:                    -->
+<!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
+<!--  + Passed an arg to addWebApplications                                -->
+<!--                                                                       -->
+<!-- This file is used both as the resource within the jetty.jar (which is -->
+<!-- used as the default if no explicit defaults descriptor is set) and it -->
+<!-- is copied to the etc directory of the Jetty distro and explicitly     -->
+<!-- by the jetty.xml file.                                                -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+<web-app 
+   xmlns="http://java.sun.com/xml/ns/javaee" 
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
+   metadata-complete="true"
+   version="2.5"> 
+
+  <description>
+    Default web.xml file.  
+    This file is applied to a Web application before it's own WEB_INF/web.xml file
+  </description>
+
+
+  <!-- ==================================================================== -->
+  <!-- Context params to control Session Cookies                            -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- UNCOMMENT TO ACTIVATE
+  <context-param>
+    <param-name>org.mortbay.jetty.servlet.SessionDomain</param-name>
+    <param-value>127.0.0.1</param-value>
+  </context-param>
+
+  <context-param>
+    <param-name>org.mortbay.jetty.servlet.SessionPath</param-name>
+    <param-value>/</param-value>
+  </context-param>
+
+  <context-param>
+    <param-name>org.mortbay.jetty.servlet.MaxAge</param-name>
+    <param-value>-1</param-value>
+  </context-param>
+  -->
+
+  <context-param>
+    <param-name>org.mortbay.jetty.webapp.NoTLDJarPattern</param-name>
+    <param-value>start.jar|ant-.*\.jar|dojo-.*\.jar|jetty-.*\.jar|jsp-api-.*\.jar|junit-.*\.jar|servlet-api-.*\.jar|dnsns\.jar|rt\.jar|jsse\.jar|tools\.jar|sunpkcs11\.jar|sunjce_provider\.jar|xerces.*\.jar</param-value>
+  </context-param>
+            
+
+
+  <!-- ==================================================================== -->
+  <!-- The default servlet.                                                 -->
+  <!-- This servlet, normally mapped to /, provides the handling for static -->
+  <!-- content, OPTIONS and TRACE methods for the context.                  -->
+  <!-- The following initParameters are supported:                          -->
+  <!--                                                                      -->
+  <!--   acceptRanges     If true, range requests and responses are         -->
+  <!--                    supported                                         -->
+  <!--                                                                      -->
+  <!--   dirAllowed       If true, directory listings are returned if no    -->
+  <!--                    welcome file is found. Else 403 Forbidden.        -->
+  <!--                                                                      -->
+  <!--   redirectWelcome  If true, redirect welcome file requests           -->
+  <!--                    else use request dispatcher forwards              -->
+  <!--                                                                      -->
+  <!--   gzip             If set to true, then static content will be served--> 
+  <!--                    as gzip content encoded if a matching resource is -->
+  <!--                    found ending with ".gz"                           -->
+  <!--                                                                      -->
+  <!--   resoureBase      Can be set to replace the context resource base   -->
+  <!--                                                                      -->
+  <!--   relativeResourceBase                                               -->
+  <!--                    Set with a pathname relative to the base of the   -->
+  <!--                    servlet context root. Useful for only serving     -->
+  <!--                    static content from only specific subdirectories. -->
+  <!--                                                                      -->
+  <!--   useFileMappedBuffer                                                -->
+  <!--                    If set to true (the default), a  memory mapped    -->
+  <!--                    file buffer will be used to serve static content  -->
+  <!--                    when using an NIO connector. Setting this value   -->
+  <!--                    to false means that a direct buffer will be used  -->
+  <!--                    instead. If you are having trouble with Windows   -->
+  <!--                    file locking, set this to false.                  -->
+  <!--                                                                      -->
+  <!--  cacheControl      If set, all static content will have this value   -->
+  <!--                    set as the cache-control header.                  -->
+  <!--                                                                      -->
+  <!--  maxCacheSize      Maximum size of the static resource cache         -->
+  <!--                                                                      -->
+  <!--  maxCachedFileSize Maximum size of any single file in the cache      -->
+  <!--                                                                      -->
+  <!--  maxCachedFiles    Maximum number of files in the cache              -->
+  <!--                                                                      -->
+  <!--  cacheType         "nio", "bio" or "both" to determine the type(s)   -->
+  <!--                    of resource cache. A bio cached buffer may be used-->
+  <!--                    by nio but is not as efficient as a nio buffer.   -->
+  <!--                    An nio cached buffer may not be used by bio.      -->
+  <!--                                                                      -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <servlet>
+    <servlet-name>default</servlet-name>
+    <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class>
+    <init-param>
+      <param-name>acceptRanges</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>dirAllowed</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>redirectWelcome</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>maxCacheSize</param-name>
+      <param-value>256000000</param-value>
+    </init-param>
+    <init-param>
+      <param-name>maxCachedFileSize</param-name>
+      <param-value>10000000</param-value>
+    </init-param>
+    <init-param>
+      <param-name>maxCachedFiles</param-name>
+      <param-value>1000</param-value>
+    </init-param>
+    <init-param>
+      <param-name>cacheType</param-name>
+      <param-value>both</param-value>
+    </init-param>
+    <init-param>
+      <param-name>gzip</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>useFileMappedBuffer</param-name>
+      <param-value>true</param-value>
+    </init-param>  
+    <!--
+    <init-param>
+      <param-name>cacheControl</param-name>
+      <param-value>max-age=3600,public</param-value>
+    </init-param>
+    -->
+    <load-on-startup>0</load-on-startup>
+  </servlet> 
+
+  <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
+  
+
+  <!-- ==================================================================== -->
+  <!-- JSP Servlet                                                          -->
+  <!-- This is the jasper JSP servlet from the jakarta project              -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
+  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
+  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
+  <!-- following initialization parameters (default values are in square    -->
+  <!-- brackets):                                                           -->
+  <!--                                                                      -->
+  <!--   checkInterval       If development is false and reloading is true, -->
+  <!--                       background compiles are enabled. checkInterval -->
+  <!--                       is the time in seconds between checks to see   -->
+  <!--                       if a JSP page needs to be recompiled. [300]    -->
+  <!--                                                                      -->
+  <!--   compiler            Which compiler Ant should use to compile JSP   -->
+  <!--                       pages.  See the Ant documenation for more      -->
+  <!--                       information. [javac]                           -->
+  <!--                                                                      -->
+  <!--   classdebuginfo      Should the class file be compiled with         -->
+  <!--                       debugging information?  [true]                 -->
+  <!--                                                                      -->
+  <!--   classpath           What class path should I use while compiling   -->
+  <!--                       generated servlets?  [Created dynamically      -->
+  <!--                       based on the current web application]          -->
+  <!--                       Set to ? to make the container explicitly set  -->
+  <!--                       this parameter.                                -->
+  <!--                                                                      -->
+  <!--   development         Is Jasper used in development mode (will check -->
+  <!--                       for JSP modification on every access)?  [true] -->
+  <!--                                                                      -->
+  <!--   enablePooling       Determines whether tag handler pooling is      -->
+  <!--                       enabled  [true]                                -->
+  <!--                                                                      -->
+  <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
+  <!--                       a separate JVM is used for JSP page compiles   -->
+  <!--                       from the one Tomcat is running in. [true]      -->
+  <!--                                                                      -->
+  <!--   ieClassId           The class-id value to be sent to Internet      -->
+  <!--                       Explorer when using <jsp:plugin> tags.         -->
+  <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
+  <!--                                                                      -->
+  <!--   javaEncoding        Java file encoding to use for generating java  -->
+  <!--                       source files. [UTF-8]                          -->
+  <!--                                                                      -->
+  <!--   keepgenerated       Should we keep the generated Java source code  -->
+  <!--                       for each page instead of deleting it? [true]   -->
+  <!--                                                                      -->
+  <!--   logVerbosityLevel   The level of detailed messages to be produced  -->
+  <!--                       by this servlet.  Increasing levels cause the  -->
+  <!--                       generation of more messages.  Valid values are -->
+  <!--                       FATAL, ERROR, WARNING, INFORMATION, and DEBUG. -->
+  <!--                       [WARNING]                                      -->
+  <!--                                                                      -->
+  <!--   mappedfile          Should we generate static content with one     -->
+  <!--                       print statement per input line, to ease        -->
+  <!--                       debugging?  [false]                            -->
+  <!--                                                                      -->
+  <!--                                                                      -->
+  <!--   reloading           Should Jasper check for modified JSPs?  [true] -->
+  <!--                                                                      -->
+  <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
+  <!--                       debugging be suppressed?  [false]              -->
+  <!--                                                                      -->
+  <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
+  <!--                       dumped to a file? [false]                      -->
+  <!--                       False if suppressSmap is true                  -->
+  <!--                                                                      -->
+  <!--   scratchdir          What scratch directory should we use when      -->
+  <!--                       compiling JSP pages?  [default work directory  -->
+  <!--                       for the current web application]               -->
+  <!--                                                                      -->
+  <!--   tagpoolMaxSize      The maximum tag handler pool size  [5]         -->
+  <!--                                                                      -->
+  <!--   xpoweredBy          Determines whether X-Powered-By response       -->
+  <!--                       header is added by generated servlet  [false]  -->
+  <!--                                                                      -->
+  <!-- If you wish to use Jikes to compile JSP pages:                       -->
+  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
+  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
+  <!--   to cause Jikes to emit error messages in a format compatible with  -->
+  <!--   Jasper.                                                            -->
+  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
+  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <servlet id="jsp">
+    <servlet-name>jsp</servlet-name>
+    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+    <init-param>
+        <param-name>logVerbosityLevel</param-name>
+        <param-value>DEBUG</param-value>
+    </init-param>
+    <init-param>
+        <param-name>fork</param-name>
+        <param-value>false</param-value>
+    </init-param>
+    <init-param>
+        <param-name>xpoweredBy</param-name>
+        <param-value>false</param-value>
+    </init-param>
+    <!--  
+    <init-param>
+        <param-name>classpath</param-name>
+        <param-value>?</param-value>
+    </init-param>
+    -->
+    <load-on-startup>0</load-on-startup>
+  </servlet>
+
+  <servlet-mapping> 
+    <servlet-name>jsp</servlet-name> 
+    <url-pattern>*.jsp</url-pattern> 
+    <url-pattern>*.jspf</url-pattern>
+    <url-pattern>*.jspx</url-pattern>
+    <url-pattern>*.xsp</url-pattern>
+    <url-pattern>*.JSP</url-pattern> 
+    <url-pattern>*.JSPF</url-pattern>
+    <url-pattern>*.JSPX</url-pattern>
+    <url-pattern>*.XSP</url-pattern>
+  </servlet-mapping>
+  
+  <!-- ==================================================================== -->
+  <!-- Dynamic Servlet Invoker.                                             -->
+  <!-- This servlet invokes anonymous servlets that have not been defined   -->
+  <!-- in the web.xml or by other means. The first element of the pathInfo  -->
+  <!-- of a request passed to the envoker is treated as a servlet name for  -->
+  <!-- an existing servlet, or as a class name of a new servlet.            -->
+  <!-- This servlet is normally mapped to /servlet/*                        -->
+  <!-- This servlet support the following initParams:                       -->
+  <!--                                                                      -->
+  <!--  nonContextServlets       If false, the invoker can only load        -->
+  <!--                           servlets from the contexts classloader.    -->
+  <!--                           This is false by default and setting this  -->
+  <!--                           to true may have security implications.    -->
+  <!--                                                                      -->
+  <!--  verbose                  If true, log dynamic loads                 -->
+  <!--                                                                      -->
+  <!--  *                        All other parameters are copied to the     -->
+  <!--                           each dynamic servlet as init parameters    -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- Uncomment for dynamic invocation
+  <servlet>
+    <servlet-name>invoker</servlet-name>
+    <servlet-class>org.mortbay.jetty.servlet.Invoker</servlet-class>
+    <init-param>
+      <param-name>verbose</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>nonContextServlets</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>dynamicParam</param-name>
+      <param-value>anyValue</param-value>
+    </init-param>
+    <load-on-startup>0</load-on-startup>
+  </servlet>
+
+  <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
+  -->
+
+
+
+  <!-- ==================================================================== -->
+  <session-config>
+    <session-timeout>30</session-timeout>
+  </session-config>
+
+  <!-- ==================================================================== -->
+  <!-- Default MIME mappings                                                -->
+  <!-- The default MIME mappings are provided by the mime.properties        -->
+  <!-- resource in the org.mortbay.jetty.jar file.  Additional or modified  -->
+  <!-- mappings may be specified here                                       -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- UNCOMMENT TO ACTIVATE
+  <mime-mapping>
+    <extension>mysuffix</extension>
+    <mime-type>mymime/type</mime-type>
+  </mime-mapping>
+  -->
+
+  <!-- ==================================================================== -->
+  <welcome-file-list>
+    <welcome-file>index.html</welcome-file>
+    <welcome-file>index.htm</welcome-file>
+    <welcome-file>index.jsp</welcome-file>
+  </welcome-file-list>
+
+  <!-- ==================================================================== -->
+  <locale-encoding-mapping-list>
+    <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>     
+    <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>   
+  </locale-encoding-mapping-list>
+  
+  <security-constraint>
+    <web-resource-collection>
+      <web-resource-name>Disable TRACE</web-resource-name>
+      <url-pattern>/</url-pattern>
+      <http-method>TRACE</http-method>
+    </web-resource-collection>
+    <auth-constraint/>
+  </security-constraint>
+  
+</web-app>
+
diff --git a/cobertura/src/test/resources/logback-test.xml b/cobertura/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..6ae5fca
--- /dev/null
+++ b/cobertura/src/test/resources/logback-test.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  cobertura
+  %%
+  Copyright (C) 2015 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<configuration>
+  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%-6p %M, %m%n</pattern>
+    </encoder>
+  </appender>
+  <root level="ALL">
+    <appender-ref ref="console"/>
+  </root>
+</configuration>
\ No newline at end of file
diff --git a/cobertura/src/test/resources/test/performance/Test1.class b/cobertura/src/test/resources/test/performance/Test1.class
new file mode 100644
index 0000000..68225af
Binary files /dev/null and b/cobertura/src/test/resources/test/performance/Test1.class differ
diff --git a/cobertura/src/test/resources/testJetty/simple.war b/cobertura/src/test/resources/testJetty/simple.war
new file mode 100644
index 0000000..6cc9882
Binary files /dev/null and b/cobertura/src/test/resources/testJetty/simple.war differ
diff --git a/cobertura/src/test/resources/testJetty/web.xml b/cobertura/src/test/resources/testJetty/web.xml
new file mode 100644
index 0000000..bd9f03f
--- /dev/null
+++ b/cobertura/src/test/resources/testJetty/web.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+  <servlet>
+    <servlet-name>SimpleServlet</servlet-name>
+    <servlet-class>com.acme.servlet.SimpleServlet</servlet-class>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>SimpleServlet</servlet-name>
+    <url-pattern>/SimpleServlet</url-pattern>
+  </servlet-mapping>
+</web-app>
diff --git a/src/net/sourceforge/cobertura/ant/IncludeClasses.java b/cobertura/src/test/resources/testUtil.groovy
similarity index 75%
rename from src/net/sourceforge/cobertura/ant/IncludeClasses.java
rename to cobertura/src/test/resources/testUtil.groovy
index 8bcc889..dd807dc 100644
--- a/src/net/sourceforge/cobertura/ant/IncludeClasses.java
+++ b/cobertura/src/test/resources/testUtil.groovy
@@ -1,75 +1,77 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.ant;
-
-public class IncludeClasses
-{
-
-	String regex;
-
-	public void setRegex(String regex)
-	{
-		this.regex = regex;
-	}
-
-	public String getRegex()
-	{
-		return regex;
-	}
-
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ * Copyright (C) 2008 John Lewis
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache at apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+import org.apache.tools.ant.BuildException;
+
+coberturaNameSpace = 'antlib:net.sourceforge.cobertura.ant'
+
+if (ant.project.getTaskDefinitions().keySet().contains('cobertura-instrument')) {
+	instrumentTaskName = 'cobertura-instrument'
+	reportTaskName = 'cobertura-report'
+	mergeTaskName = 'cobertura-merge'
+	checkTaskName = 'cobertura-check'
+} else if (ant.project.getTaskDefinitions().keySet().contains("${coberturaNameSpace}:instrument" as String)) {
+	/*
+	 *  Antlib was used to load the ant tasks
+	 */
+	instrumentTaskName = "${coberturaNameSpace}:instrument"
+	reportTaskName = "${coberturaNameSpace}:report"
+	mergeTaskName = "${coberturaNameSpace}:merge"
+	checkTaskName = "${coberturaNameSpace}:check"
+} else {
+	throw new BuildException("Must do taskdef to load Cobertura ant tasks")
+}
+
+
diff --git a/codestyle/pom.xml b/codestyle/pom.xml
new file mode 100644
index 0000000..9cd0c3e
--- /dev/null
+++ b/codestyle/pom.xml
@@ -0,0 +1,418 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>org.sonatype.oss</groupId>
+        <artifactId>oss-parent</artifactId>
+        <version>7</version>
+        <relativePath />
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.codestyle</groupId>
+    <artifactId>cobertura-codestyle</artifactId>
+    <version>2.1.1</version>
+    <name>${project.artifactId}</name>
+    <packaging>jar</packaging>
+    <url>${url.prefix}/${path.in.reactor}</url>
+    <description>Cobertura checks and reports on test coverage in your code.</description>
+
+    <prerequisites>
+        <maven>3.0.5</maven>
+    </prerequisites>
+
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <properties>
+        <!-- Build definition properties -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <jdk.version>1.6</jdk.version>
+        <maven.version>2.2.1</maven.version>
+        <enforcer.api.version>1.3.1</enforcer.api.version>
+        <cobertura.haltOnFailure>true</cobertura.haltOnFailure>
+
+        <!-- Code style properties -->
+        <wtp.version>2.0</wtp.version>
+        <clean.plugin.version>2.5</clean.plugin.version>
+        <maven-project-info-reports-plugin.version>2.7</maven-project-info-reports-plugin.version>
+        <pmd.plugin.version>3.0.1</pmd.plugin.version>
+        <checkstyle.plugin.version>2.10</checkstyle.plugin.version>
+
+        <!--
+            Define the URL prefixes for Site Deployment and DistributionManagement.
+            These can be overridden in sub-reactors to tailor releases to other locations.
+        -->
+        <path.in.reactor>codestyle</path.in.reactor>
+        <reactor.name>cobertura</reactor.name>
+        <scm.host>github.com</scm.host>
+        <reactor.url.remote.prefix>http://${scm.host}/${reactor.name}</reactor.url.remote.prefix>
+        <site.url.prefix>scp://www-data@angmar/var/www/${reactor.name}</site.url.prefix>
+        <site.staging.localDirectory>/tmp/${reactor.name}</site.staging.localDirectory>
+        <url.prefix>${reactor.url.remote.prefix}/${reactor.name}/${project.version}</url.prefix>
+        <distro.url.prefix>${site.url.prefix}/${reactor.name}/${project.version}</distro.url.prefix>
+        <scm.conn>scm:git:git://${scm.host}/${reactor.name}/${reactor.name}</scm.conn>
+        <scm.devConnection>scm:git:git@${scm.host}:${reactor.name}/${reactor.name}.git</scm.devConnection>
+    </properties>
+
+    <developers>
+        <developer>
+            <id>lj</id>
+            <name>Lennart Jörelid</name>
+            <email>lj at jguru.se</email>
+            <roles>
+                <role>Developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+    </developers>
+
+    <!--
+    ################################################
+    # Section 2:  Dependency (management) settings
+    ################################################
+    -->
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven.enforcer</groupId>
+            <artifactId>enforcer-api</artifactId>
+            <version>${enforcer.api.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+            <version>${maven.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-artifact</artifactId>
+            <version>${maven.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>${maven.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.plexus</groupId>
+            <artifactId>plexus-container-default</artifactId>
+            <version>1.5.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.shared</groupId>
+            <artifactId>maven-plugin-testing-harness</artifactId>
+            <version>1.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.11</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+    <build>
+        <plugins>
+            <!--
+                Configures the release plugin.
+
+                Why:  Make the release plugin replace any information received from the Sonatype OSS parent.
+                Used: Release lifecycle, mvn release.
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-release-plugin</artifactId>
+                <version>2.5.1</version>
+                <configuration combine.self="override">
+                    <goals>deploy</goals>
+                    <localCheckout>true</localCheckout>
+                    <mavenExecutorId>forked-path</mavenExecutorId>
+                    <tagNameFormat>${reactor.name}-@{project.version}</tagNameFormat>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.scm</groupId>
+                        <artifactId>maven-scm-provider-hg</artifactId>
+                        <version>1.9.2</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.scm</groupId>
+                        <artifactId>maven-scm-provider-gitexe</artifactId>
+                        <version>1.9.2</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${jdk.version}</source>
+                    <target>${jdk.version}</target>
+                    <showWarnings>true</showWarnings>
+                    <showDeprecation>true</showDeprecation>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+
+            <!--
+                Configures the site plugin. Its use is further documented in the site documentation itself.
+
+                Why:  Make compile and publish the Cobertura documentation.
+                Used: Site lifecycle, mvn site.
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-site-plugin</artifactId>
+                <version>3.3</version>
+                <executions>
+                    <execution>
+                        <id>attach-descriptor</id>
+                        <goals>
+                            <goal>attach-descriptor</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <topSiteURL>${site.url.prefix}/${reactor.name}</topSiteURL>
+                    <stagingSiteURL>${site.url.prefix}/${reactor.name}</stagingSiteURL>
+                    <stagingDirectory>${site.staging.localDirectory}</stagingDirectory>
+                    <generateSitemap>true</generateSitemap>
+                    <inputEncoding>${project.build.sourceEncoding}</inputEncoding>
+                    <outputEncoding>${project.reporting.outputEncoding}</outputEncoding>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.wagon</groupId>
+                        <artifactId>wagon-ssh</artifactId>
+                        <version>2.4</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.wagon</groupId>
+                        <artifactId>wagon-file</artifactId>
+                        <version>2.4</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.doxia</groupId>
+                        <artifactId>doxia-module-markdown</artifactId>
+                        <version>1.5</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.doxia</groupId>
+                        <artifactId>doxia-module-xhtml</artifactId>
+                        <version>1.5</version>
+                    </dependency>
+                    <!--
+                        Reflow skin and dependencies.
+                    -->
+                    <!-- dependency>
+                        <groupId>lt.velykis.maven.skins</groupId>
+                        <artifactId>reflow-velocity-tools</artifactId>
+                        <version>1.0.0</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.velocity</groupId>
+                        <artifactId>velocity</artifactId>
+                        <version>1.7</version>
+                    </dependency -->
+                </dependencies>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <version>${checkstyle.plugin.version}</version>
+                <configuration>
+                    <propertyExpansion>cacheFile=${project.build.directory}/checkstyle-cachefile</propertyExpansion>
+                    <configLocation>${project.build.outputDirectory}/codestyle/cobertura/checkstyle.xml</configLocation>
+                    <failOnViolation>true</failOnViolation>
+                    <violationSeverity>error</violationSeverity>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>verify</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>report</id>
+                        <goals>
+                            <goal>checkstyle</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <excludeDefaults>true</excludeDefaults>
+        <outputDirectory>${project.build.directory}/site</outputDirectory>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <dependencyDetailsEnabled>false</dependencyDetailsEnabled>
+                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+                </configuration>
+                <!-- reportSets>
+                    <reportSet>
+                        <reports>
+                            <report>dependencies</report>
+                            <report>scm</report>
+                        </reports>
+                    </reportSet>
+                </reportSets -->
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <configuration>
+                    <stylesheet>java</stylesheet>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jxr-plugin</artifactId>
+                <version>2.3</version>
+            </plugin>
+
+            <!--
+                 Due to problems in the Maven 3 site plugin you must enter the configuration twice,
+                 once for the pluginManagement section and once for the site, see
+                 http://jira.codehaus.org/browse/MSITE-516 and http://jira.codehaus.org/browse/MSITE-523
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-pmd-plugin</artifactId>
+                <version>${pmd.plugin.version}</version>
+                <configuration>
+                    <rulesets>
+                        <ruleset>${project.build.outputDirectory}/codestyle/pmd-rules.xml</ruleset>
+                    </rulesets>
+                    <targetJdk>${jdk.version}</targetJdk>
+                    <sourceEncoding>UTF-8</sourceEncoding>
+                </configuration>
+            </plugin>
+            <!--
+                 Due to problems in the Maven 3 site plugin you must enter the configuration twice,
+                 once for the pluginManagement section and once for the site, see
+                 http://jira.codehaus.org/browse/MSITE-516 and http://jira.codehaus.org/browse/MSITE-523
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <version>${checkstyle.plugin.version}</version>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <propertyExpansion>cacheFile=${project.build.directory}/checkstyle-cachefile</propertyExpansion>
+                    <configLocation>${project.build.outputDirectory}/codestyle/checkstyle.xml</configLocation>
+                    <failOnViolation>true</failOnViolation>
+                    <violationSeverity>error</violationSeverity>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </reporting>
+
+    <profiles>
+        <!--
+            Purpose: Use GPG to sign artifacts during release:perform.
+        -->
+        <profile>
+            <id>release-sign-artifacts</id>
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.4</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+
+    <!--
+        Define the issue management system.
+    -->
+    <issueManagement>
+        <system>github</system>
+        <url>${reactor.url.remote.prefix}/${reactor.name}/issues</url>
+    </issueManagement>
+
+    <!--
+        Define repository settings for Maven's deploy and release plugins.
+        To comply with Maven standards, the repository definitions should
+        go in the settings.xml file, rather than into the POM.
+
+        This leaves the site URL mechanics in the POM to cater for staging
+        and deploying sites.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+</project>
diff --git a/codestyle/src/main/resources/codestyle/cobertura/checkstyle-suppressions.xml b/codestyle/src/main/resources/codestyle/cobertura/checkstyle-suppressions.xml
new file mode 100644
index 0000000..5f50f31
--- /dev/null
+++ b/codestyle/src/main/resources/codestyle/cobertura/checkstyle-suppressions.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suppressions PUBLIC
+        "-//Puppy Crawl//DTD Suppressions 1.0//EN"
+        "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
+
+<suppressions>
+    <!--
+        No default suppressions, this file is simply a placeholder
+        to enable custom suppressions in child reactors.
+    -->
+</suppressions>
\ No newline at end of file
diff --git a/codestyle/src/main/resources/codestyle/cobertura/checkstyle.xml b/codestyle/src/main/resources/codestyle/cobertura/checkstyle.xml
new file mode 100644
index 0000000..609b7d9
--- /dev/null
+++ b/codestyle/src/main/resources/codestyle/cobertura/checkstyle.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+
+<module name="Checker">
+    <property name="severity" value="warning"/>
+
+    <module name="TreeWalker">
+        <module name="JavadocMethod">
+            <property name="scope" value="public"/>
+            <property name="allowMissingPropertyJavadoc" value="true"/>
+            <property name="tokens" value="METHOD_DEF"/>
+            <property name="allowUndeclaredRTE" value="true"/>
+        </module>
+        <module name="LineLength">
+            <property name="max" value="120"/>
+        </module>
+
+        <module name="JavadocStyle">
+            <property name="checkFirstSentence" value="false"/>
+            <property name="checkHtml" value="false"/>
+        </module>
+
+        <module name="ConstantName">
+            <property name="format" value="(^[A-Z][A-Z0-9_]*$)|log"/>
+        </module>
+        <module name="LocalFinalVariableName">
+            <property name="format" value="(^[a-z][a-zA-Z0-9]*$)|(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
+        </module>
+        <module name="LocalVariableName"/>
+        <module name="MemberName"/>
+        <module name="MethodName"/>
+        <module name="PackageName"/>
+        <module name="ParameterName"/>
+        <module name="StaticVariableName"/>
+        <module name="TypeName"/>
+        <module name="AvoidStarImport">
+            <property name="severity" value="error"/>
+        </module>
+        <module name="JavaNCSS"/>
+
+        <!--
+            Enforce correct logging mechanics in release artifacts.
+        -->
+        <module name="IllegalImport">
+            <property name="severity" value="error"/>
+            <property name="illegalPkgs"
+                      value="java.util.logging, org.jboss.logging, org.apache.log4j, org.apache.commons.logging"/>
+        </module>
+
+        <!--
+            We should not use Calendar or Date types in any public method.
+            They could be used internally - and only within model classes to cope with JPA time types -
+            but not within parameters or return types.
+        -->
+        <module name="IllegalType">
+            <property name="severity" value="error"/>
+            <property name="tokens" value="PARAMETER_DEF, METHOD_DEF"/>
+            <property name="illegalClassNames"
+                      value="java.util.GregorianCalendar, java.util.Calendar, java.util.Date, java.util.Vector, java.util.Properties"/>
+        </module>
+
+        <!--
+            Validate that we don't use the System.exit, out or err in the code.
+            Use proper logging instead.
+        -->
+        <module name="Regexp">
+            <property name="message" value="System.exit"/>
+            <property name="severity" value="error"/>
+            <property name="format" value="System\.exit"/>
+            <property name="illegalPattern" value="true"/>
+        </module>
+        <module name="Regexp">
+            <property name="message" value="System.out"/>
+            <property name="severity" value="error"/>
+            <property name="format" value="System\.out."/>
+            <property name="illegalPattern" value="true"/>
+        </module>
+        <module name="Regexp">
+            <property name="message" value="System.err"/>
+            <property name="severity" value="error"/>
+            <property name="format" value="System\.err."/>
+            <property name="illegalPattern" value="true"/>
+        </module>
+
+        <module name="RedundantImport"/>
+        <module name="UnusedImports"/>
+        <module name="MethodLength"/>
+        <module name="ParameterNumber">
+            <property name="max" value="5"/>
+            <property name="tokens" value="METHOD_DEF"/>
+        </module>
+
+        <module name="EmptyForIteratorPad"/>
+        <module name="MethodParamPad"/>
+        <module name="OperatorWrap"/>
+        <module name="ParenPad"/>
+        <module name="TypecastParenPad"/>
+        <module name="WhitespaceAfter"/>
+        <module name="ModifierOrder"/>
+        <module name="AvoidNestedBlocks"/>
+        <module name="EmptyBlock">
+            <property name="option" value="text"/>
+        </module>
+        <module name="LeftCurly"/>
+        <module name="NeedBraces"/>
+        <module name="RightCurly"/>
+        <module name="EmptyStatement"/>
+        <module name="EqualsHashCode"/>
+        <module name="IllegalInstantiation"/>
+        <module name="InnerAssignment"/>
+        <module name="MagicNumber"/>
+        <module name="MissingSwitchDefault"/>
+        <module name="RedundantThrows">
+            <property name="allowUnchecked" value="true"/>
+            <property name="allowSubclasses" value="true"/>
+        </module>
+        <module name="SimplifyBooleanExpression"/>
+        <module name="SimplifyBooleanReturn"/>
+        <module name="FinalClass"/>
+        <module name="HideUtilityClassConstructor"/>
+        <module name="InterfaceIsType"/>
+        <module name="VisibilityModifier">
+            <property name="packageAllowed" value="true"/>
+            <property name="protectedAllowed" value="true"/>
+        </module>
+        <module name="ArrayTypeStyle"/>
+        <module name="FinalParameters"/>
+        <module name="UpperEll"/>
+        <module name="JavadocType">
+            <property name="excludeScope" value="private"/>
+            <property name="scope" value="public"/>
+            <property name="authorFormat" value="\S"/>
+            <property name="tokens" value="INTERFACE_DEF"/>
+        </module>
+        <module name="FallThrough"/>
+        <module name="DefaultComesLast"/>
+        <module name="ReturnCount">
+            <property name="format" value="^equals$|^compareTo$"/>
+            <property name="max" value="3"/>
+        </module>
+    </module>
+    <module name="FileLength"/>
+    <module name="FileTabCharacter"/>
+    <module name="Translation"/>
+</module>
diff --git a/codestyle/src/main/resources/codestyle/cobertura/findbugs-excludes.xml b/codestyle/src/main/resources/codestyle/cobertura/findbugs-excludes.xml
new file mode 100644
index 0000000..e888ddc
--- /dev/null
+++ b/codestyle/src/main/resources/codestyle/cobertura/findbugs-excludes.xml
@@ -0,0 +1,6 @@
+<FindBugsFilter>
+    <Match>
+        <Package name="~jsp\.jsp.*"/>
+    </Match>
+</FindBugsFilter>
+
diff --git a/codestyle/src/main/resources/codestyle/cobertura/findbugs.xml b/codestyle/src/main/resources/codestyle/cobertura/findbugs.xml
new file mode 100644
index 0000000..9855ac4
--- /dev/null
+++ b/codestyle/src/main/resources/codestyle/cobertura/findbugs.xml
@@ -0,0 +1,1052 @@
+<FindBugsFilter>
+    <Match>
+        <Bug pattern="SKIPPED_CLASS_TOO_BIG"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO_CORE_THREADS"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF_SCHEDULED_THREAD_POOL_EXECUTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_UNSUPPORTED_METHOD"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_EMPTY_DB_PASSWORD"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_CONSTANT_DB_PASSWORD"/>
+    </Match>
+    <Match>
+        <Bug pattern="HRS_REQUEST_PARAMETER_TO_COOKIE"/>
+    </Match>
+    <Match>
+        <Bug pattern="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER"/>
+    </Match>
+    <Match>
+        <Bug pattern="XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER"/>
+    </Match>
+    <Match>
+        <Bug pattern="XSS_REQUEST_PARAMETER_TO_SEND_ERROR"/>
+    </Match>
+    <Match>
+        <Bug pattern="XSS_REQUEST_PARAMETER_TO_JSP_WRITER"/>
+    </Match>
+    <Match>
+        <Bug pattern="SW_SWING_METHODS_INVOKED_IN_SWING_THREAD"/>
+    </Match>
+    <Match>
+        <Bug pattern="IL_INFINITE_LOOP"/>
+    </Match>
+    <Match>
+        <Bug pattern="IL_INFINITE_RECURSIVE_LOOP"/>
+    </Match>
+    <Match>
+        <Bug pattern="IL_CONTAINER_ADDED_TO_ITSELF"/>
+    </Match>
+    <Match>
+        <Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="UI_INHERITANCE_UNSAFE_GETRESOURCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_BOOLEAN_RETURN_NULL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_SYNC_AND_NULL_CHECK_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="RpC_REPEATED_CONDITIONAL_TEST"/>
+    </Match>
+    <Match>
+        <Bug pattern="AM_CREATES_EMPTY_ZIP_FILE_ENTRY"/>
+    </Match>
+    <Match>
+        <Bug pattern="AM_CREATES_EMPTY_JAR_FILE_ENTRY"/>
+    </Match>
+    <Match>
+        <Bug pattern="IMSE_DONT_CATCH_IMSE"/>
+    </Match>
+    <Match>
+        <Bug pattern="FL_MATH_USING_FLOAT_PRECISION"/>
+    </Match>
+    <Match>
+        <Bug pattern="CN_IDIOM"/>
+    </Match>
+    <Match>
+        <Bug pattern="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE"/>
+    </Match>
+    <Match>
+        <Bug pattern="CN_IDIOM_NO_SUPER_CALL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER"/>
+    </Match>
+    <Match>
+        <Bug pattern="DE_MIGHT_DROP"/>
+    </Match>
+    <Match>
+        <Bug pattern="DE_MIGHT_IGNORE"/>
+    </Match>
+    <Match>
+        <Bug pattern="DP_DO_INSIDE_DO_PRIVILEGED"/>
+    </Match>
+    <Match>
+        <Bug pattern="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED"/>
+    </Match>
+    <Match>
+        <Bug pattern="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_COLLECTION_OF_URLS"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_BLOCKING_METHODS_ON_URL"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_EXIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_RUN_FINALIZERS_ON_EXIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_STRING_CTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_STRING_VOID_CTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_STRING_TOSTRING"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_GC"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_BOOLEAN_CTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_NUMBER_CTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_FP_NUMBER_CTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_CONVERT_CASE"/>
+    </Match>
+    <Match>
+        <Bug pattern="BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="BX_BOXING_IMMEDIATELY_UNBOXED"/>
+    </Match>
+    <Match>
+        <Bug pattern="BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_BOXED_PRIMITIVE_TOSTRING"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_NEW_FOR_GETCLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_MONITOR_WAIT_ON_CONDITION"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_01_TO_INT"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_NEXTINT_VIA_NEXTDOUBLE"/>
+    </Match>
+    <Match>
+        <Bug pattern="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE"/>
+    </Match>
+    <Match>
+        <Bug pattern="SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING"/>
+    </Match>
+    <Match>
+        <Bug pattern="DM_USELESS_THREAD"/>
+    </Match>
+    <Match>
+        <Bug pattern="DC_DOUBLECHECK"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_FINALIZER_NULLS_FIELDS"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_FINALIZER_ONLY_NULLS_FIELDS"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_PUBLIC_SHOULD_BE_PROTECTED"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_EMPTY"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_NULLIFY_SUPER"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_USELESS"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_MISSING_SUPER_CALL"/>
+    </Match>
+    <Match>
+        <Bug pattern="FI_EXPLICIT_INVOCATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_DONT_DEFINE_EQUALS_FOR_ENUM"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_SELF_USE_OBJECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_OTHER_USE_OBJECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_OTHER_NO_OBJECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_SELF_NO_OBJECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_GETCLASS_AND_CLASS_CONSTANT"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_UNUSUAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_COMPARING_CLASS_NAMES"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_ALWAYS_TRUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_ALWAYS_FALSE"/>
+    </Match>
+    <Match>
+        <Bug pattern="HSC_HUGE_SHARED_STRING_CONSTANT"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_ARGUMENT_MIGHT_BE_NULL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="CO_SELF_NO_OBJECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="HE_USE_OF_UNHASHABLE_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="HE_HASHCODE_USE_OBJECT_EQUALS"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS"/>
+    </Match>
+    <Match>
+        <Bug pattern="HE_HASHCODE_NO_EQUALS"/>
+    </Match>
+    <Match>
+        <Bug pattern="HE_EQUALS_USE_HASHCODE"/>
+    </Match>
+    <Match>
+        <Bug pattern="HE_INHERITS_EQUALS_USE_HASHCODE"/>
+    </Match>
+    <Match>
+        <Bug pattern="HE_EQUALS_NO_HASHCODE"/>
+    </Match>
+    <Match>
+        <Bug pattern="EQ_ABSTRACT_SELF"/>
+    </Match>
+    <Match>
+        <Bug pattern="ES_COMPARING_STRINGS_WITH_EQ"/>
+    </Match>
+    <Match>
+        <Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ"/>
+    </Match>
+    <Match>
+        <Bug pattern="CO_ABSTRACT_SELF"/>
+    </Match>
+    <Match>
+        <Bug pattern="IS_FIELD_NOT_GUARDED"/>
+    </Match>
+    <Match>
+        <Bug pattern="MSF_MUTABLE_SERVLET_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="IS2_INCONSISTENT_SYNC"/>
+    </Match>
+    <Match>
+        <Bug pattern="NN_NAKED_NOTIFY"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_EXPOSE_REP"/>
+    </Match>
+    <Match>
+        <Bug pattern="EI_EXPOSE_REP"/>
+    </Match>
+    <Match>
+        <Bug pattern="EI_EXPOSE_REP2"/>
+    </Match>
+    <Match>
+        <Bug pattern="EI_EXPOSE_STATIC_REP2"/>
+    </Match>
+    <Match>
+        <Bug pattern="RU_INVOKE_RUN"/>
+    </Match>
+    <Match>
+        <Bug pattern="SP_SPIN_ON_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="NS_DANGEROUS_NON_SHORT_CIRCUIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="NS_NON_SHORT_CIRCUIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="TLW_TWO_LOCK_WAIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="UW_UNCOND_WAIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="UR_UNINIT_READ"/>
+    </Match>
+    <Match>
+        <Bug pattern="UG_SYNC_SET_UNSYNC_GET"/>
+    </Match>
+    <Match>
+        <Bug pattern="IC_INIT_CIRCULARITY"/>
+    </Match>
+    <Match>
+        <Bug pattern="IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="IT_NO_SUCH_ELEMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="DL_SYNCHRONIZATION_ON_SHARED_CONSTANT"/>
+    </Match>
+    <Match>
+        <Bug pattern="DL_SYNCHRONIZATION_ON_BOOLEAN"/>
+    </Match>
+    <Match>
+        <Bug pattern="DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE"/>
+    </Match>
+    <Match>
+        <Bug pattern="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE"/>
+    </Match>
+    <Match>
+        <Bug pattern="ESync_EMPTY_SYNC"/>
+    </Match>
+    <Match>
+        <Bug pattern="IS_INCONSISTENT_SYNC"/>
+    </Match>
+    <Match>
+        <Bug pattern="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="ML_SYNC_ON_UPDATED_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_OOI_PKGPROTECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_FINAL_PKGPROTECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_SHOULD_BE_FINAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_PKGPROTECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_MUTABLE_HASHTABLE"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_MUTABLE_ARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="MS_CANNOT_BE_FINAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_SAME_SIMPLE_NAME_AS_INTERFACE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_VERY_CONFUSING"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_VERY_CONFUSING_INTENTIONAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_WRONG_PACKAGE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_WRONG_PACKAGE_INTENTIONAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_CONFUSING"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_METHOD_CONSTRUCTOR_CONFUSION"/>
+    </Match>
+    <Match>
+        <Bug pattern="NM_CLASS_NOT_EXCEPTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="RR_NOT_CHECKED"/>
+    </Match>
+    <Match>
+        <Bug pattern="SR_NOT_CHECKED"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_READ_RESOLVE_IS_STATIC"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_PRIVATE_READ_RESOLVE_NOT_INHERITED"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_READ_RESOLVE_MUST_RETURN_OBJECT"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_METHOD_MUST_BE_PRIVATE"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_NO_SUITABLE_CONSTRUCTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_NO_SERIALVERSIONID"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE"/>
+    </Match>
+    <Match>
+        <Bug pattern="WS_WRITEOBJECT_SYNC"/>
+    </Match>
+    <Match>
+        <Bug pattern="RS_READOBJECT_SYNC"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_NONSTATIC_SERIALVERSIONID"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_NONFINAL_SERIALVERSIONID"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_NONLONG_SERIALVERSIONID"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_BAD_FIELD_INNER_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_INNER_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="SE_BAD_FIELD_STORE"/>
+    </Match>
+    <Match>
+        <Bug pattern="SC_START_IN_CTOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="SS_SHOULD_BE_STATIC"/>
+    </Match>
+    <Match>
+        <Bug pattern="UUF_UNUSED_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="URF_UNREAD_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="QF_QUESTIONABLE_FOR_LOOP"/>
+    </Match>
+    <Match>
+        <Bug pattern="UWF_NULL_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_LOAD_OF_KNOWN_NULL_VALUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_DEREFERENCE_OF_READLINE_VALUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_IMMEDIATE_DEREFERENCE_OF_READLINE"/>
+    </Match>
+    <Match>
+        <Bug pattern="SIC_INNER_SHOULD_BE_STATIC"/>
+    </Match>
+    <Match>
+        <Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON"/>
+    </Match>
+    <Match>
+        <Bug pattern="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS"/>
+    </Match>
+    <Match>
+        <Bug pattern="WA_NOT_IN_LOOP"/>
+    </Match>
+    <Match>
+        <Bug pattern="WA_AWAIT_NOT_IN_LOOP"/>
+    </Match>
+    <Match>
+        <Bug pattern="NO_NOTIFY_NOT_NOTIFYALL"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_CHECK_FOR_POSITIVE_INDEXOF"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_DONT_JUST_NULL_CHECK_READLINE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_RETURN_VALUE_IGNORED"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_EXCEPTION_NOT_THROWN"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_RETURN_VALUE_IGNORED2"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_ALWAYS_NULL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_STORE_INTO_NONNULL_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_ALWAYS_NULL_EXCEPTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_ON_SOME_PATH"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_ON_SOME_PATH_EXCEPTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_PARAM_DEREF_NONVIRTUAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NONNULL_PARAM_VIOLATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NONNULL_RETURN_VIOLATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_CLONE_COULD_RETURN_NULL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_TOSTRING_COULD_RETURN_NULL"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_GUARANTEED_DEREF"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH"/>
+    </Match>
+    <Match>
+        <Bug pattern="SI_INSTANCE_BEFORE_FINALS_ASSIGNED"/>
+    </Match>
+    <Match>
+        <Bug pattern="OS_OPEN_STREAM"/>
+    </Match>
+    <Match>
+        <Bug pattern="OS_OPEN_STREAM_EXCEPTION_PATH"/>
+    </Match>
+    <Match>
+        <Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS"/>
+    </Match>
+    <Match>
+        <Bug pattern="UCF_USELESS_CONTROL_FLOW"/>
+    </Match>
+    <Match>
+        <Bug pattern="UCF_USELESS_CONTROL_FLOW_NEXT_LINE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES"/>
+    </Match>
+    <Match>
+        <Bug pattern="RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="UL_UNRELEASED_LOCK"/>
+    </Match>
+    <Match>
+        <Bug pattern="UL_UNRELEASED_LOCK_EXCEPTION_PATH"/>
+    </Match>
+    <Match>
+        <Bug pattern="RC_REF_COMPARISON"/>
+    </Match>
+    <Match>
+        <Bug pattern="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY"/>
+    </Match>
+    <Match>
+        <Bug pattern="EC_UNRELATED_TYPES"/>
+    </Match>
+    <Match>
+        <Bug pattern="EC_UNRELATED_INTERFACES"/>
+    </Match>
+    <Match>
+        <Bug pattern="EC_UNRELATED_CLASS_AND_INTERFACE"/>
+    </Match>
+    <Match>
+        <Bug pattern="EC_NULL_ARG"/>
+    </Match>
+    <Match>
+        <Bug pattern="MWN_MISMATCHED_WAIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="MWN_MISMATCHED_NOTIFY"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_LOCAL_SELF_ASSIGNMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_FIELD_SELF_ASSIGNMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_FIELD_DOUBLE_ASSIGNMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_LOCAL_DOUBLE_ASSIGNMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_FIELD_SELF_COMPUTATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_LOCAL_SELF_COMPUTATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_FIELD_SELF_COMPARISON"/>
+    </Match>
+    <Match>
+        <Bug pattern="SA_LOCAL_SELF_COMPARISON"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_RANDOM_USED_ONLY_ONCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_ABSOLUTE_VALUE_OF_RANDOM_INT"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_ABSOLUTE_VALUE_OF_HASHCODE"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_REM_OF_RANDOM_INT"/>
+    </Match>
+    <Match>
+        <Bug pattern="RV_REM_OF_HASHCODE"/>
+    </Match>
+    <Match>
+        <Bug pattern="INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE"/>
+    </Match>
+    <Match>
+        <Bug pattern="INT_BAD_COMPARISON_WITH_SIGNED_BYTE"/>
+    </Match>
+    <Match>
+        <Bug pattern="INT_VACUOUS_BIT_OPERATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="INT_VACUOUS_COMPARISON"/>
+    </Match>
+    <Match>
+        <Bug pattern="INT_BAD_REM_BY_1"/>
+    </Match>
+    <Match>
+        <Bug pattern="BIT_IOR_OF_SIGNED_BYTE"/>
+    </Match>
+    <Match>
+        <Bug pattern="BIT_ADD_OF_SIGNED_BYTE"/>
+    </Match>
+    <Match>
+        <Bug pattern="BIT_AND"/>
+    </Match>
+    <Match>
+        <Bug pattern="BIT_SIGNED_CHECK"/>
+    </Match>
+    <Match>
+        <Bug pattern="BIT_SIGNED_CHECK_HIGH_BIT"/>
+    </Match>
+    <Match>
+        <Bug pattern="BIT_AND_ZZ"/>
+    </Match>
+    <Match>
+        <Bug pattern="BIT_IOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="LI_LAZY_INIT_STATIC"/>
+    </Match>
+    <Match>
+        <Bug pattern="LI_LAZY_INIT_UPDATE_STATIC"/>
+    </Match>
+    <Match>
+        <Bug pattern="JLM_JSR166_LOCK_MONITORENTER"/>
+    </Match>
+    <Match>
+        <Bug pattern="UPM_UNCALLED_PRIVATE_METHOD"/>
+    </Match>
+    <Match>
+        <Bug pattern="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="ODR_OPEN_DATABASE_RESOURCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH"/>
+    </Match>
+    <Match>
+        <Bug pattern="SBSC_USE_STRINGBUFFER_CONCATENATION"/>
+    </Match>
+    <Match>
+        <Bug pattern="ITA_INEFFICIENT_TO_ARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD"/>
+    </Match>
+    <Match>
+        <Bug pattern="IJU_SETUP_NO_SUPER"/>
+    </Match>
+    <Match>
+        <Bug pattern="IJU_TEARDOWN_NO_SUPER"/>
+    </Match>
+    <Match>
+        <Bug pattern="IJU_SUITE_NOT_STATIC"/>
+    </Match>
+    <Match>
+        <Bug pattern="IJU_BAD_SUITE_METHOD"/>
+    </Match>
+    <Match>
+        <Bug pattern="IJU_NO_TESTS"/>
+    </Match>
+    <Match>
+        <Bug pattern="BOA_BADLY_OVERRIDDEN_ADAPTER"/>
+    </Match>
+    <Match>
+        <Bug pattern="SQL_BAD_RESULTSET_ACCESS"/>
+    </Match>
+    <Match>
+        <Bug pattern="SQL_BAD_PREPARED_STATEMENT_ACCESS"/>
+    </Match>
+    <Match>
+        <Bug pattern="SIO_SUPERFLUOUS_INSTANCEOF"/>
+    </Match>
+    <Match>
+        <Bug pattern="EC_ARRAY_AND_NONARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="EC_BAD_ARRAY_COMPARE"/>
+    </Match>
+    <Match>
+        <Bug pattern="STI_INTERRUPTED_ON_CURRENTTHREAD"/>
+    </Match>
+    <Match>
+        <Bug pattern="STI_INTERRUPTED_ON_UNKNOWNTHREAD"/>
+    </Match>
+    <Match>
+        <Bug pattern="IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN"/>
+    </Match>
+    <Match>
+        <Bug pattern="DLS_DEAD_LOCAL_STORE"/>
+    </Match>
+    <Match>
+        <Bug pattern="DLS_DEAD_LOCAL_STORE_IN_RETURN"/>
+    </Match>
+    <Match>
+        <Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="DLS_DEAD_LOCAL_STORE_OF_NULL"/>
+    </Match>
+    <Match>
+        <Bug pattern="MF_METHOD_MASKS_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="MF_CLASS_MASKS_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="WMI_WRONG_MAP_ITERATOR"/>
+    </Match>
+    <Match>
+        <Bug pattern="ISC_INSTANTIATE_STATIC_CLASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="REC_CATCH_EXCEPTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER"/>
+    </Match>
+    <Match>
+        <Bug pattern="FE_FLOATING_POINT_EQUALITY"/>
+    </Match>
+    <Match>
+        <Bug pattern="UM_UNNECESSARY_MATH"/>
+    </Match>
+    <Match>
+        <Bug pattern="RI_REDUNDANT_INTERFACES"/>
+    </Match>
+    <Match>
+        <Bug pattern="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="MTIA_SUSPECT_SERVLET_INSTANCE_FIELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="PS_PUBLIC_SEMAPHORES"/>
+    </Match>
+    <Match>
+        <Bug pattern="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG"/>
+    </Match>
+    <Match>
+        <Bug pattern="ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND"/>
+    </Match>
+    <Match>
+        <Bug pattern="ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL"/>
+    </Match>
+    <Match>
+        <Bug pattern="ICAST_IDIV_CAST_TO_DOUBLE"/>
+    </Match>
+    <Match>
+        <Bug pattern="J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_NONSERIALIZABLE_OBJECT_WRITTEN"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_BAD_CONVERSION"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_ARG_MISMATCH"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_ILLEGAL"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_MISSING_ARGUMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_FORMAT_STRING_BAD_ARGUMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG"/>
+    </Match>
+    <Match>
+        <Bug pattern="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS"/>
+    </Match>
+    <Match>
+        <Bug pattern="BC_BAD_CAST_TO_ABSTRACT_COLLECTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="BC_IMPOSSIBLE_CAST"/>
+    </Match>
+    <Match>
+        <Bug pattern="NP_NULL_INSTANCEOF"/>
+    </Match>
+    <Match>
+        <Bug pattern="BC_IMPOSSIBLE_INSTANCEOF"/>
+    </Match>
+    <Match>
+        <Bug pattern="BC_VACUOUS_INSTANCEOF"/>
+    </Match>
+    <Match>
+        <Bug pattern="BC_UNCONFIRMED_CAST"/>
+    </Match>
+    <Match>
+        <Bug pattern="BC_BAD_CAST_TO_CONCRETE_COLLECTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="RE_POSSIBLE_UNINTENDED_PATTERN"/>
+    </Match>
+    <Match>
+        <Bug pattern="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION"/>
+    </Match>
+    <Match>
+        <Bug pattern="RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION"/>
+    </Match>
+    <Match>
+        <Bug pattern="DLS_OVERWRITTEN_INCREMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT"/>
+    </Match>
+    <Match>
+        <Bug pattern="ICAST_BAD_SHIFT_AMOUNT"/>
+    </Match>
+    <Match>
+        <Bug pattern="IM_MULTIPLYING_RESULT_OF_IREM"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_INVOKING_HASHCODE_ON_ARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_INVOKING_TOSTRING_ON_ARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY"/>
+    </Match>
+    <Match>
+        <Bug pattern="IM_AVERAGE_COMPUTATION_COULD_OVERFLOW"/>
+    </Match>
+    <Match>
+        <Bug pattern="IM_BAD_CHECK_FOR_ODD"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_HARDCODED_ABSOLUTE_FILENAME"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_BAD_MONTH"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_USELESS_SUBSTRING"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_CALLING_NEXT_FROM_HASNEXT"/>
+    </Match>
+    <Match>
+        <Bug pattern="SWL_SLEEP_WITH_LOCK_HELD"/>
+    </Match>
+    <Match>
+        <Bug pattern="DB_DUPLICATE_BRANCHES"/>
+    </Match>
+    <Match>
+        <Bug pattern="DB_DUPLICATE_SWITCH_CLAUSES"/>
+    </Match>
+    <Match>
+        <Bug pattern="XFB_XML_FACTORY_BYPASS"/>
+    </Match>
+    <Match>
+        <Bug pattern="CI_CONFUSED_INHERITANCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT"/>
+    </Match>
+    <Match>
+        <Bug pattern="GC_UNCHECKED_TYPE_IN_GENERIC_CALL"/>
+    </Match>
+    <Match>
+        <Bug pattern="GC_UNRELATED_TYPES"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_VACUOUS_SELF_COLLECTION_CALL"/>
+    </Match>
+    <Match>
+        <Bug pattern="DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION"/>
+    </Match>
+    <Match>
+        <Bug pattern="STCAL_STATIC_CALENDAR_INSTANCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE"/>
+    </Match>
+    <Match>
+        <Bug pattern="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED"/>
+    </Match>
+    <Match>
+        <Bug pattern="TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED"/>
+    </Match>
+    <Match>
+        <Bug pattern="TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK"/>
+    </Match>
+    <Match>
+        <Bug pattern="TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK"/>
+    </Match>
+    <Match>
+        <Bug pattern="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK"/>
+    </Match>
+    <Match>
+        <Bug pattern="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK"/>
+    </Match>
+    <Match>
+        <Bug pattern="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM"/>
+    </Match>
+    <Match>
+        <Bug pattern="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL"/>
+    </Match>
+</FindBugsFilter>
diff --git a/codestyle/src/main/resources/codestyle/cobertura/pmd-rules.xml b/codestyle/src/main/resources/codestyle/cobertura/pmd-rules.xml
new file mode 100644
index 0000000..5e5c147
--- /dev/null
+++ b/codestyle/src/main/resources/codestyle/cobertura/pmd-rules.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<ruleset name="Nazgul Tools PMD Rules"
+         xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
+
+    <description>Cobertura PMD rules</description>
+
+    <!--
+        Rule priority definitions:
+
+        1: Change absolutely required. Behavior is critically broken/buggy.
+        2: Change highly recommended. Behavior is quite likely to be broken/buggy.
+        3: Change recommended. Behavior is confusing, perhaps buggy, and/or against standards/best practices.
+        4: Change optional. Behavior is not likely to be buggy, but more just flies in the face of standards/style/good taste.
+        5: Change highly optional. Nice to have, such as a consistent naming policy for package/class/fields...
+    -->
+
+    <rule ref="rulesets/java/basic.xml"/>
+    <rule ref="rulesets/java/unusedcode.xml"/>
+
+    <!--
+        Class design checks.
+    -->
+    <rule ref="rulesets/java/design.xml/CloseResource">
+        <priority>3</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/ConstructorCallsOverridableMethod">
+        <priority>3</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/EqualsNull">
+        <priority>2</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/FinalFieldCouldBeStatic">
+        <priority>2</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/IdempotentOperations">
+        <priority>2</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/InstantiationToGetClass">
+        <priority>3</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/MissingStaticMethodInNonInstantiatableClass">
+        <priority>2</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/PreserveStackTrace">
+        <priority>3</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/SingularField">
+        <priority>4</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/SimplifyConditional">
+        <priority>3</priority>
+    </rule>
+    <rule ref="rulesets/java/design.xml/UnnecessaryLocalBeforeReturn">
+        <priority>3</priority>
+    </rule>
+</ruleset>
diff --git a/conversion/conversion-api/pom.xml b/conversion/conversion-api/pom.xml
new file mode 100644
index 0000000..a256d89
--- /dev/null
+++ b/conversion/conversion-api/pom.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- +=============================================== -->
+    <!-- | Section 1:  Project information                -->
+    <!-- +=============================================== -->
+    <parent>
+        <groupId>net.sourceforge.cobertura.poms</groupId>
+        <artifactId>cobertura-api-parent</artifactId>
+        <version>2.1.1</version>
+        <relativePath>../../poms/cobertura-api-parent</relativePath>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.conversion.api</groupId>
+    <artifactId>cobertura-conversion-api</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>conversion/conversion-api</path.in.reactor>
+    </properties>
+
+    <!-- +=============================================== -->
+    <!-- | Section 2:  Dependency (management) settings   -->
+    <!-- +=============================================== -->
+    <dependencies>
+        <!-- Internal dependencies -->
+
+        <!-- External dependencies. -->
+        <!-- dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency -->
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+        </dependency>
+
+        <!-- Test dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>se.jguru.nazgul.core.xmlbinding.spi.jaxb</groupId>
+            <artifactId>nazgul-core-xmlbinding-spi-jaxb</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>se.jguru.nazgul.test.xmlbinding</groupId>
+            <artifactId>nazgul-core-xmlbinding-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <!-- +=============================================== -->
+    <!-- | Section 4:  External systems                   -->
+    <!-- +=============================================== -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/conversion/conversion-api/src/main/java/net/sourceforge/cobertura/conversion/api/jaxb/AtomicLongAdapter.java b/conversion/conversion-api/src/main/java/net/sourceforge/cobertura/conversion/api/jaxb/AtomicLongAdapter.java
new file mode 100644
index 0000000..e101536
--- /dev/null
+++ b/conversion/conversion-api/src/main/java/net/sourceforge/cobertura/conversion/api/jaxb/AtomicLongAdapter.java
@@ -0,0 +1,61 @@
+/*
+ * #%L
+ * cobertura-conversion-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.conversion.api.jaxb;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * XML adapter for AtomicLong instances.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class AtomicLongAdapter extends XmlAdapter<Long, AtomicLong> {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public AtomicLong unmarshal(final Long v) throws Exception {
+
+        // Handle nulls.
+        if(v == null) {
+            return null;
+        }
+
+        // Convert and return.
+        return new AtomicLong(v);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Long marshal(final AtomicLong v) throws Exception {
+
+        // Handle nulls.
+        if(v == null) {
+            return null;
+        }
+
+        // Convert and return.
+        return v.get();
+    }
+}
diff --git a/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/JaxbUtils.java b/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/JaxbUtils.java
new file mode 100644
index 0000000..5b70b06
--- /dev/null
+++ b/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/JaxbUtils.java
@@ -0,0 +1,143 @@
+/*
+ * #%L
+ * cobertura-conversion-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.conversion.api;
+
+import se.jguru.nazgul.core.xmlbinding.spi.jaxb.helper.JaxbNamespacePrefixResolver;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.JAXBIntrospector;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
+import javax.xml.transform.stream.StreamSource;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public final class JaxbUtils {
+
+    // Internal state
+    private static final String COBERTURA_NAMESPACE = "http://github.com/cobertura";
+    private static final JaxbNamespacePrefixResolver namespacePrefixMapper = new JaxbNamespacePrefixResolver();
+
+    static {
+        namespacePrefixMapper.put(COBERTURA_NAMESPACE, "cobertura");
+    }
+
+    /*
+     * Hide constructors for utility classes.
+     */
+    private JaxbUtils() {
+    }
+
+    /**
+     * Retrieves a JAXB Marshaller which can marshal the supplied, JAXB-annotated types.
+     *
+     * @param jaxbAnnotatedTypes Types to be marshalled by the retrieved Marshaller. All types must be JAXB-annotated.
+     * @return a JAXB Marshaller which can marshal the supplied, JAXB-annotated types,
+     * and which will produce human-readable (rather than compressed) XML.
+     */
+    public static Marshaller getHumanReadableMarshallerFor(final Class... jaxbAnnotatedTypes) {
+
+        try {
+            final JAXBContext ctx = JAXBContext.newInstance(jaxbAnnotatedTypes);
+            return se.jguru.nazgul.core.xmlbinding.spi.jaxb.helper.JaxbUtils.getHumanReadableStandardMarshaller(
+                    ctx, namespacePrefixMapper, false);
+        } catch (JAXBException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Creates a DocumentRoot-worthy JAXBElement holding the supplied single object
+     * and sporting the supplied QName namespaceURI, localPart and prefix.
+     *
+     * @param object       The JAXB-annotated object to wrap in a JAXBElement.
+     * @param namespaceURI The XML namespace URI.
+     * @param localPart    The XML localPart of the returned JAXBElement.
+     * @param prefix       The XML namespace prefix of the returned JAXBElement.
+     * @param <T>          The type of the object.
+     * @return a DocumentRoot-worthy JAXBElement holding the supplied single object.
+     */
+    public static <T> JAXBElement<T> getDocumentRoot(final T object,
+                                                     final String namespaceURI,
+                                                     final String localPart,
+                                                     final String prefix) {
+
+        final QName qName = new QName(namespaceURI, localPart, prefix);
+        return new JAXBElement<T>(qName, (Class<T>) object.getClass(), object);
+    }
+
+    /**
+     * Creates a DocumentRoot-worthy JAXBElement holding the supplied single object
+     * and sporting the standard cobertura XML namespace URI, and the given localPart.
+     *
+     * @param object       The JAXB-annotated object to wrap in a JAXBElement.
+     * @param localPart    The XML localPart of the returned JAXBElement.
+     * @param <T>          The type of the object.
+     * @return a DocumentRoot-worthy JAXBElement holding the supplied single object.
+     */
+    public static <T> JAXBElement<T> getDocumentRoot(final T object,
+                                                     final String localPart) {
+        return getDocumentRoot(object, COBERTURA_NAMESPACE, localPart, "unused");
+    }
+
+    public static <T> String marshal(final T toMarshal, final String elementName) {
+
+        StringWriter result;
+        try {
+            Marshaller marshaller = JaxbUtils.getHumanReadableMarshallerFor(toMarshal.getClass());
+            JAXBElement<T> rootElement = JaxbUtils.getDocumentRoot(toMarshal, elementName);
+
+            result = new StringWriter();
+            marshaller.marshal(rootElement, result);
+
+            // All Done
+            return result.toString();
+
+        } catch (JAXBException e) {
+            throw new RuntimeException("Could not marshal [" + elementName + "]", e);
+        }
+    }
+
+    public static <T> T unmarshalInstance(final String data, final Class<T> expectedType) {
+
+        try {
+            // Assume we should only unmarshal a single type.
+            final JAXBContext ctx = JAXBContext.newInstance(expectedType);
+            final Unmarshaller unmarshaller = ctx.createUnmarshaller();
+
+            // To ignore the namespace and xml element localPart,
+            // unmarshal the instance as a JAXBElement.
+            final StreamSource streamSource = new StreamSource(new StringReader(data));
+            final JAXBElement<T> jaxbElement = unmarshaller.unmarshal(streamSource, expectedType);
+
+            // All done.
+            return jaxbElement.getValue();
+
+        } catch (JAXBException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/jaxb/AtomicLongAdapterTest.java b/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/jaxb/AtomicLongAdapterTest.java
new file mode 100644
index 0000000..ba9ecc8
--- /dev/null
+++ b/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/jaxb/AtomicLongAdapterTest.java
@@ -0,0 +1,74 @@
+/*
+ * #%L
+ * cobertura-conversion-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.conversion.api.jaxb;
+
+import net.sourceforge.cobertura.conversion.api.JaxbUtils;
+import net.sourceforge.cobertura.conversion.api.jaxb.helpers.Person;
+import org.custommonkey.xmlunit.DetailedDiff;
+import org.custommonkey.xmlunit.Diff;
+import org.junit.Assert;
+import org.junit.Test;
+import se.jguru.nazgul.test.xmlbinding.XmlTestUtils;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class AtomicLongAdapterTest {
+
+    @Test
+    public void validateMarshalling() throws Exception {
+
+        // Assemble
+        final String name = "Lennart";
+        final AtomicLong age = new AtomicLong(45);
+
+        final Person unitUnderTest = new Person(name, age);
+        final String expected = XmlTestUtils.readFully("testdata/person.xml");
+
+        // Act
+        final String result = JaxbUtils.marshal(unitUnderTest, "person");
+        // System.out.println("Got: " + result);
+
+        // Assert
+        final Diff diff = XmlTestUtils.compareXmlIgnoringWhitespace(expected, result);
+        Assert.assertTrue("Detailed Diff: " + new DetailedDiff(diff), diff.identical());
+    }
+
+    @Test
+    public void validateUnmarshalling() {
+
+        // Assemble
+        final String name = "Lennart";
+        final AtomicLong age = new AtomicLong(45);
+
+        final Person expected = new Person(name, age);
+        final String data = XmlTestUtils.readFully("testdata/person.xml");
+
+        // Act
+        final Person unmarshalled = JaxbUtils.unmarshalInstance(data, Person.class);
+
+        // Assert
+        Assert.assertNotNull(unmarshalled);
+        Assert.assertEquals(expected.toString(), unmarshalled.toString());
+        Assert.assertEquals(expected, unmarshalled);
+    }
+}
diff --git a/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/jaxb/helpers/Person.java b/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/jaxb/helpers/Person.java
new file mode 100644
index 0000000..2f08917
--- /dev/null
+++ b/conversion/conversion-api/src/test/java/net/sourceforge/cobertura/conversion/api/jaxb/helpers/Person.java
@@ -0,0 +1,101 @@
+/*
+ * #%L
+ * cobertura-conversion-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.conversion.api.jaxb.helpers;
+
+import net.sourceforge.cobertura.conversion.api.jaxb.AtomicLongAdapter;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+ at XmlType(namespace = "http://cobertura/tests", propOrder = {"name", "age"})
+ at XmlAccessorType(XmlAccessType.FIELD)
+public class Person {
+
+    // Internal state
+    @XmlAttribute(required = true)
+    @XmlJavaTypeAdapter(AtomicLongAdapter.class)
+    private AtomicLong age;
+
+    @XmlElement(required = true, nillable = false)
+    private String name;
+
+    public Person() {
+    }
+
+    public Person(String name, AtomicLong age) {
+        this.age = age;
+        this.name = name;
+    }
+
+    public AtomicLong getAge() {
+        return age;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        return name.hashCode() + age.hashCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+
+        // Check sanity
+        if(obj == null) {
+            return false;
+        }
+        if(obj == this) {
+            return true;
+        }
+
+        // All done.
+        if(!(obj instanceof Person)) {
+            return false;
+        }
+
+        final Person that = (Person) obj;
+        return getName().equals(that.getName()) && getAge().get() == that.getAge().get();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "Person [" + getName() + ", " + getAge() + "]";
+    }
+}
diff --git a/conversion/conversion-api/src/test/resources/logback-test.xml b/conversion/conversion-api/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..e975136
--- /dev/null
+++ b/conversion/conversion-api/src/test/resources/logback-test.xml
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+  #%L
+  cobertura-conversion-api
+  %%
+  Copyright (C) 2013 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<configuration>
+
+    <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%c{1}::%M]: %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- By default, make the logging keep quiet -->
+    <root level="DEBUG">
+        <appender-ref ref="Stdout"/>
+    </root>
+
+    <!-- Lower the logging level for relevant classes -->
+    <logger name="net.sourceforge.cobertura" level="WARN"/>
+    <logger name="net.sourceforge.cobertura.conversion.api" level="DEBUG"/>
+
+    <!-- Make the frameworks shut up. -->
+    <logger name="org.springframework" level="WARN"/>
+
+</configuration>
diff --git a/conversion/conversion-api/src/test/resources/testdata/person.xml b/conversion/conversion-api/src/test/resources/testdata/person.xml
new file mode 100644
index 0000000..5da7291
--- /dev/null
+++ b/conversion/conversion-api/src/test/resources/testdata/person.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  #%L
+  cobertura-conversion-api
+  %%
+  Copyright (C) 2013 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<cobertura:person age="45" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:core="http://www.jguru.se/nazgul/core"
+                  xmlns:cobertura="http://github.com/cobertura" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <name>Lennart</name>
+</cobertura:person>
diff --git a/conversion/pom.xml b/conversion/pom.xml
new file mode 100644
index 0000000..4ad9691
--- /dev/null
+++ b/conversion/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>net.sourceforge.cobertura</groupId>
+        <artifactId>cobertura-reactor</artifactId>
+        <version>2.1.1</version>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.conversion</groupId>
+    <artifactId>cobertura-conversion-reactor</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>conversion</path.in.reactor>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Modules
+    ################################################
+    -->
+    <modules>
+        <module>conversion-api</module>
+    </modules>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/etc/log4j.properties b/etc/log4j.properties
deleted file mode 100644
index 1feec77..0000000
--- a/etc/log4j.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-
-# set default logging level and appender
-log4j.rootCategory=WARN, console
-#log4j.category.net.sourceforge.cobertura=WARN, console
-
-#log4j.category.net.sourceforge.cobertura.check=DEBUG, console
-#log4j.category.net.sourceforge.cobertura.coverage=DEBUG, file
-#log4j.category.net.sourceforge.cobertura.coverage.CoverageDataFactory=INFO, file
-#log4j.category.net.sourceforge.cobertura.coverage.SaveInstrumentationTimer=DEBUG, file
-#log4j.category.net.sourceforge.cobertura.merge=DEGUG, console
-#log4j.category.net.sourceforge.cobertura.reporting=DEBUG, file
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%-6p %M, %m%n
-
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.File=cobertura.log
-log4j.appender.file.MaxFileSize=3000KB
-log4j.appender.file.MaxBackupIndex=3
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d %-2p [%t] %c{3} - %m - (%F:%L) %n
diff --git a/interaction/annotations/annotations-api/pom.xml b/interaction/annotations/annotations-api/pom.xml
new file mode 100644
index 0000000..d294e33
--- /dev/null
+++ b/interaction/annotations/annotations-api/pom.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- +=============================================== -->
+    <!-- | Section 1:  Project information                -->
+    <!-- +=============================================== -->
+    <parent>
+        <groupId>net.sourceforge.cobertura.poms</groupId>
+        <artifactId>cobertura-api-parent</artifactId>
+        <version>2.1.1</version>
+        <relativePath>../../../poms/cobertura-api-parent</relativePath>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.interaction.annotations.api</groupId>
+    <artifactId>cobertura-annotations-api</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>interaction/annotations/annotations-api</path.in.reactor>
+    </properties>
+
+    <!-- +=============================================== -->
+    <!-- | Section 2:  Dependency (management) settings   -->
+    <!-- +=============================================== -->
+    <dependencies>
+        <!-- External dependencies. -->
+
+        <!-- Test dependencies -->
+    </dependencies>
+
+    <!-- +=============================================== -->
+    <!-- | Section 3:  Build settings                     -->
+    <!-- +=============================================== -->
+    <!-- build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.openjpa</groupId>
+                <artifactId>openjpa-maven-plugin</artifactId>
+                <version>${openjpa.version}</version>
+                <executions>
+                    <execution>
+                        <id>enhancer</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>enhance</goal>
+                        </goals>
+                        <configuration>
+                            <includes>**/*.class</includes>
+                            <persistenceXmlFile>${basedir}/src/main/weaving/openjpa/tree-model-persistence.xml
+                            </persistenceXmlFile>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <includes>**/*.class</includes>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.openjpa</groupId>
+                        <artifactId>openjpa</artifactId>
+                        <version>${openjpa.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build -->
+
+    <!-- +=============================================== -->
+    <!-- | Section 4:  External systems                   -->
+    <!-- +=============================================== -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/interaction/annotations/annotations-api/src/main/java/net/sourceforge/cobertura/interaction/annotations/api/metrics/CoberturaIgnored.java b/interaction/annotations/annotations-api/src/main/java/net/sourceforge/cobertura/interaction/annotations/api/metrics/CoberturaIgnored.java
new file mode 100644
index 0000000..ffd7f04
--- /dev/null
+++ b/interaction/annotations/annotations-api/src/main/java/net/sourceforge/cobertura/interaction/annotations/api/metrics/CoberturaIgnored.java
@@ -0,0 +1,48 @@
+/*
+ * #%L
+ * cobertura-annotations-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.interaction.annotations.api.metrics;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation which indicates that a particular construct should be ignored by Cobertura's instrumentation and
+ * metrics. CoberturaIgnored will ensure that all code (lines and branches) within its scope are excepted from
+ * instrumentation, implying the following semantics when annotating a particular scope:
+ * <p/>
+ * <dl>
+ * <dt>Method annotation</dt>
+ * <dd>The lines within the annotated Method will not be instrumented.</dd>
+ * <dt>Class annotation</dt>
+ * <dd>The lines within the annotated Class will not be instrumented.</dd>
+ * <dt>Package annotation</dt>
+ * <dd>The lines within the all Classes within the annotated Package will not be instrumented.</dd>
+ * </dl>
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid, jGuru Europe AB</a>
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Documented
+ at Target({ElementType.METHOD, ElementType.TYPE, ElementType.PACKAGE})
+public @interface CoberturaIgnored {
+}
diff --git a/interaction/annotations/pom.xml b/interaction/annotations/pom.xml
new file mode 100644
index 0000000..08d1d90
--- /dev/null
+++ b/interaction/annotations/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>net.sourceforge.cobertura.interaction</groupId>
+        <artifactId>cobertura-interaction-reactor</artifactId>
+        <version>2.1.1</version>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.interaction.annotations</groupId>
+    <artifactId>cobertura-annotations-reactor</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>annotations</path.in.reactor>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Modules
+    ################################################
+    -->
+    <modules>
+        <module>annotations-api</module>
+    </modules>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/interaction/pom.xml b/interaction/pom.xml
new file mode 100644
index 0000000..7001baf
--- /dev/null
+++ b/interaction/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>net.sourceforge.cobertura</groupId>
+        <artifactId>cobertura-reactor</artifactId>
+        <version>2.1.1</version>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.interaction</groupId>
+    <artifactId>cobertura-interaction-reactor</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>interaction</path.in.reactor>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Modules
+    ################################################
+    -->
+    <modules>
+        <module>annotations</module>
+    </modules>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/metrics/metrics-api/pom.xml b/metrics/metrics-api/pom.xml
new file mode 100644
index 0000000..2121975
--- /dev/null
+++ b/metrics/metrics-api/pom.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- +=============================================== -->
+    <!-- | Section 1:  Project information                -->
+    <!-- +=============================================== -->
+    <parent>
+        <groupId>net.sourceforge.cobertura.poms</groupId>
+        <artifactId>cobertura-api-parent</artifactId>
+        <version>2.1.1</version>
+        <relativePath>../../poms/cobertura-api-parent</relativePath>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.metrics.api</groupId>
+    <artifactId>cobertura-metrics-api</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>metrics/metrics-api</path.in.reactor>
+    </properties>
+
+    <!-- +=============================================== -->
+    <!-- | Section 2:  Dependency (management) settings   -->
+    <!-- +=============================================== -->
+    <dependencies>
+        <!-- Internal dependencies -->
+        <dependency>
+            <groupId>net.sourceforge.cobertura.metrics.model</groupId>
+            <artifactId>cobertura-metrics-model</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+
+        <!-- External dependencies. -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>se.jguru.nazgul.core.algorithms.api</groupId>
+            <artifactId>nazgul-core-algorithms-api</artifactId>
+        </dependency>
+
+        <!-- Test dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>se.jguru.nazgul.test.xmlbinding</groupId>
+            <artifactId>nazgul-core-xmlbinding-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <!-- +=============================================== -->
+    <!-- | Section 3:  Build settings                     -->
+    <!-- +=============================================== -->
+    <!-- build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.openjpa</groupId>
+                <artifactId>openjpa-maven-plugin</artifactId>
+                <version>${openjpa.version}</version>
+                <executions>
+                    <execution>
+                        <id>enhancer</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>enhance</goal>
+                        </goals>
+                        <configuration>
+                            <includes>**/*.class</includes>
+                            <persistenceXmlFile>${basedir}/src/main/weaving/openjpa/tree-model-persistence.xml
+                            </persistenceXmlFile>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <includes>**/*.class</includes>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.openjpa</groupId>
+                        <artifactId>openjpa</artifactId>
+                        <version>${openjpa.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build -->
+
+    <!-- +=============================================== -->
+    <!-- | Section 4:  External systems                   -->
+    <!-- +=============================================== -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/AbstractCoverageCalculator.java b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/AbstractCoverageCalculator.java
new file mode 100644
index 0000000..082a502
--- /dev/null
+++ b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/AbstractCoverageCalculator.java
@@ -0,0 +1,80 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api;
+
+import net.sourceforge.cobertura.metrics.api.location.SourceLocationFilter;
+import net.sourceforge.cobertura.metrics.model.coverage.Rate;
+import org.apache.commons.lang3.Validate;
+
+/**
+ * Abstract implementation of a CoverageCalculator, providing
+ * some utility method implementations and synchronization primitives.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public abstract class AbstractCoverageCalculator implements CoverageCalculator {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final Rate getCoverageRate(final SourceLocationFilter filter, final CoverageType type) {
+
+        // Check sanity
+        Validate.notNull(type, "Cannot handle null type argument.");
+        Validate.notNull(filter, "Cannot handle null filter argument.");
+
+        // Delegate
+        return getRate(filter, type);
+    }
+
+    /**
+     * Retrieves the coverage rate for the supplied CoverageType.
+     * <p/>
+     * The getRate method should be implemented to be atomic/synchronized, in regards
+     * to any call to the addExecutionStep methods. In plain english, the internal state of this
+     * AbstractCoverageCalculator subclass must be permitted to complete changing its internal
+     * storage state before enabling the {@code getRate } method to calculate its value.
+     *
+     * @param nonNullCoverageType The CoverageType for which coverage is desired. Guaranteed not to be {@code null}.
+     * @param nonNullFilter       The SourceLocationFilter instance used to filter out all relevant CoverageRate
+     *                            object on record, and collect a correct Rate from them all.
+     * @return the coverage Rate for the given CoverageType.
+     */
+    protected abstract Rate getRate(final SourceLocationFilter nonNullFilter, final CoverageType nonNullCoverageType);
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final double getCoverage(final SourceLocationFilter filter, final CoverageType type) {
+
+        // Delegate
+        final Rate coverageRate = getCoverageRate(filter, type);
+
+        // Handle fringe cases.
+        if (coverageRate == null) {
+            return 0;
+        }
+
+        // Divide and return.
+        return ((double) coverageRate.getActual()) / ((double) coverageRate.getMaximum());
+    }
+}
diff --git a/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/CoverageCalculator.java b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/CoverageCalculator.java
new file mode 100644
index 0000000..31bb1da
--- /dev/null
+++ b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/CoverageCalculator.java
@@ -0,0 +1,95 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api;
+
+import net.sourceforge.cobertura.metrics.api.event.SourceLocationListener;
+import net.sourceforge.cobertura.metrics.api.location.SourceLocationFilter;
+import net.sourceforge.cobertura.metrics.model.coverage.Rate;
+
+/**
+ * Specification for how to calculate test coverage rates. Typical usage
+ * would be along the lines in the example shown below:
+ * <p/>
+ * <pre>
+ *     <code>
+ *         // Acquire a CoverageCalculator
+ *         CoverageCalculator calc = new SomeCoverageCalculator();
+ *
+ *         // Start running the tests, and add execution steps for
+ *         // all SourceLocations the tests.
+ *         //
+ *         // This is done in quite another form in reality, but
+ *         // corresponding pseudo-code is shown below.
+ *         UnitTestRunner runner = new SomeParticularTestRunner(config);
+ *         List<InstrumentedTest> allTestsInProject = getAllInstrumentedTestsInProject();
+ *
+ *         for(InstrumentedTest currentTest : allTestsInProject) {
+ *
+ *             // Add the listener
+ *             currentTest.addSourceLocationListener(calc.getSourceLocationListener());
+ *
+ *             // Now run the test
+ *             runner.execute(currentTest);
+ *         }
+ *
+ *         // Create some filters to define which measurements we are interested in.
+ *         final SourceLocationFilter somePackageFilter = new SourceLocationFilter("some\\.package\\.name");
+ *         final SourceLocationFilter someClassFilter = new SourceLocationFilter("some\\.package\\.name, "SomeClass");
+ *
+ *         // Calculate some coverage rates.
+ *         double allPackageLineCoverage = calc.getCoverage(somePackageFilter, CoverageType.LINE);
+ *         double allPackageBranchCoverage = calc.getCoverage(somePackageFilter, CoverageType.BRANCH);
+ *         double allClassLineCoverage = calc.getCoverage(someClassFilter, CoverageType.LINE);
+ *         double allClassBranchCoverage = calc.getCoverage(someClassFilter, CoverageType.BRANCH);
+ *     </code>
+ * </pre>
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public interface CoverageCalculator {
+
+    /**
+     * Retrieves the coverage rate for the supplied CoverageType.
+     *
+     * @param filter The SourceLocationFilter defining which CoverageRecords should be
+     *               included in the retrieved Rate.
+     * @param type   The CoverageType for which coverage is desired.
+     * @return the coverage Rate for the given CoverageType.
+     */
+    Rate getCoverageRate(SourceLocationFilter filter, CoverageType type);
+
+    /**
+     * Convenience method, retrieving Coverage rate as a supplied type
+     *
+     * @param filter The SourceLocationFilter defining which CoverageRecords should be
+     *               included in the retrieved Rate.
+     * @param type   The CoverageType for which coverage is desired.
+     * @return the coverage, given as a value between 0 and 1.
+     */
+    double getCoverage(SourceLocationFilter filter, CoverageType type);
+
+    /**
+     * Retrieves a SourceLocationListener used to record execution steps ("hits"/"touches")
+     * of all SourceLocations within tests into this CoverageCalculator.
+     *
+     * @return a SourceLocationListener dumping its event data updates into this CoverageCalculator.
+     */
+    SourceLocationListener getSourceLocationListener();
+}
diff --git a/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/CoverageType.java b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/CoverageType.java
new file mode 100644
index 0000000..15c14e8
--- /dev/null
+++ b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/CoverageType.java
@@ -0,0 +1,38 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api;
+
+/**
+ * Enumeration holding all known coverage types.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public enum CoverageType {
+
+    /**
+     * Line coverage, implying coverage calculated per source code line.
+     */
+    LINE,
+
+    /**
+     * Branch coverage, implying coverage calculated per source execution branch line.
+     */
+    BRANCH
+}
diff --git a/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/event/AbstractSourceLocationListener.java b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/event/AbstractSourceLocationListener.java
new file mode 100644
index 0000000..6e6a782
--- /dev/null
+++ b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/event/AbstractSourceLocationListener.java
@@ -0,0 +1,71 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api.event;
+
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+import org.apache.commons.lang3.Validate;
+
+/**
+ * Abstract implementation of the SourceLocationListener specification, used
+ * to provide a base for subclassing.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public abstract class AbstractSourceLocationListener implements SourceLocationListener {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void addExecutionSteps(final SourceLocation location, final int numSteps) {
+
+        // Check sanity
+        Validate.notNull(location, "Cannot handle null location argument.");
+        Validate.isTrue(numSteps >= 0, "Cannot handle negative numSteps argument. (Got: " + numSteps + ").");
+
+        // Delegate and return.
+        addInternalExecutionSteps(location, numSteps);
+    }
+
+    /**
+     * Adds a given number of execution steps ("hits"/"touches") to the supplied SourceLocation.
+     * <p/>
+     * The addInternalExecutionSteps method should be implemented to be atomic/synchronized, in regards
+     * to the data it updates. In plain english, the data updated by this SourceLocationListener
+     * must fully change its internal storage state before this method returns.
+     *
+     * @param nonNullLocation  The SourceLocation where 1 execution step should be added.
+     *                         Guaranteed never to be {@code null}.
+     * @param positiveNumSteps The number of execution steps to add to the supplied SourceLocation.
+     *                         Guaranteed not to be negative.
+     */
+    protected abstract void addInternalExecutionSteps(final SourceLocation nonNullLocation,
+                                                      final int positiveNumSteps);
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final void addExecutionStep(final SourceLocation location) {
+
+        // Delegate
+        addExecutionSteps(location, 1);
+    }
+}
diff --git a/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/event/SourceLocationListener.java b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/event/SourceLocationListener.java
new file mode 100644
index 0000000..53556d5
--- /dev/null
+++ b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/event/SourceLocationListener.java
@@ -0,0 +1,52 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api.event;
+
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+
+/**
+ * Event listener invoked by instrumented tests when a particular SourceLocation has
+ * been hit/touched during an automated test execution.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public interface SourceLocationListener {
+
+    /**
+     * Adds 1 to the recorded execution steps ("hits"/"touches") to the supplied SourceLocation.
+     * The addExecutionStep method should be implemented to be atomic/synchronized, in regards
+     * to the data state it updates.
+     *
+     * @param location The SourceLocation where 1 execution step should be added. Cannot be {@code null}.
+     */
+    void addExecutionStep(SourceLocation location);
+
+    /**
+     * Adds a given number of execution steps ("hits"/"touches") to the supplied SourceLocation.
+     * The addExecutionSteps method should be implemented to be atomic/synchronized, in regards
+     * to the data state it updates.
+     *
+     * @param location The SourceLocation where 1 execution step should be added.
+     *                 Cannot be {@code null}.
+     * @param numSteps The number of execution steps to add to the supplied SourceLocation.
+     *                 Cannot be less than 1.
+     */
+    void addExecutionSteps(SourceLocation location, int numSteps);
+}
diff --git a/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/location/SourceLocationFilter.java b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/location/SourceLocationFilter.java
new file mode 100644
index 0000000..3763467
--- /dev/null
+++ b/metrics/metrics-api/src/main/java/net/sourceforge/cobertura/metrics/api/location/SourceLocationFilter.java
@@ -0,0 +1,259 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api.location;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+import org.apache.commons.lang3.Validate;
+import se.jguru.nazgul.core.algorithms.api.collections.predicate.Filter;
+
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Filter separating valid from invalid SourceLocation instances.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid, jGuru Europe AB</a>
+ */
+public class SourceLocationFilter implements Filter<SourceLocation> {
+
+    // Internal state
+    private static final LocationScope[] COMPARISON_ORDER = {LocationScope.PACKAGE,
+            LocationScope.CLASS, LocationScope.METHOD, LocationScope.LINE, LocationScope.SEGMENT};
+    private LocationScope scope;
+    private boolean acceptAllInProject;
+    private SortedMap<LocationScope, Pattern> locationPatternMap;
+
+    /**
+     * Creates a SourceLocationFilter instance which accepts all SourceLocations.
+     */
+    public SourceLocationFilter() {
+        setupInternalState(LocationScope.PROJECT);
+    }
+
+    /**
+     * Creates a SourceLocationFilter instance with the supplied Java regular expression
+     * to be applied within package scope. No pattern may be {@code null} or empty.
+     *
+     * @param packagePattern The regexp to be matched to SourceLocation package properties.
+     */
+    public SourceLocationFilter(final String packagePattern) {
+
+        // Assign internal state
+        setupInternalState(LocationScope.PACKAGE);
+
+        // Compile patterns and check sanity
+        compilePattern(LocationScope.PACKAGE, packagePattern);
+    }
+
+    /**
+     * Creates a SourceLocationFilter instance with the supplied Java regular expressions
+     * to be applied within the appropriate scope. No pattern may be {@code null } or empty.
+     *
+     * @param packagePattern The regexp to be matched to SourceLocation package properties.
+     * @param classPattern   The regexp to be matched to SourceLocation class properties.
+     */
+    public SourceLocationFilter(final String packagePattern,
+                                final String classPattern) {
+
+        // Assign internal state
+        setupInternalState(LocationScope.CLASS);
+
+        // Compile patterns and check sanity
+        compilePattern(LocationScope.PACKAGE, packagePattern);
+        compilePattern(LocationScope.CLASS, classPattern);
+    }
+
+    /**
+     * Creates a SourceLocationFilter instance with the supplied Java regular expressions
+     * to be applied within the appropriate scope. No pattern may be {@code null } or empty.
+     *
+     * @param packagePattern The regexp to be matched to SourceLocation package properties.
+     * @param classPattern   The regexp to be matched to SourceLocation class properties.
+     * @param methodPattern  The regexp to be matched to SourceLocation method properties.
+     */
+    public SourceLocationFilter(final String packagePattern,
+                                final String classPattern,
+                                final String methodPattern) {
+        // Assign internal state
+        setupInternalState(LocationScope.METHOD);
+
+        // Compile patterns and check sanity
+        compilePattern(LocationScope.PACKAGE, packagePattern);
+        compilePattern(LocationScope.CLASS, classPattern);
+        compilePattern(LocationScope.METHOD, methodPattern);
+    }
+
+    /**
+     * Creates a SourceLocationFilter instance with the supplied Java regular expressions
+     * to be applied within the appropriate scope. No pattern may be {@code null } or empty.
+     *
+     * @param packagePattern    The regexp to be matched to SourceLocation package properties.
+     * @param classPattern      The regexp to be matched to SourceLocation class properties.
+     * @param methodPattern     The regexp to be matched to SourceLocation method properties.
+     * @param lineNumberPattern The regexp to be matched to SourceLocation line number properties.
+     */
+    public SourceLocationFilter(final String packagePattern,
+                                final String classPattern,
+                                final String methodPattern,
+                                final String lineNumberPattern) {
+
+        // Assign internal state
+        setupInternalState(LocationScope.LINE);
+
+        // Compile patterns and check sanity
+        compilePattern(LocationScope.PACKAGE, packagePattern);
+        compilePattern(LocationScope.CLASS, classPattern);
+        compilePattern(LocationScope.METHOD, methodPattern);
+        compilePattern(LocationScope.LINE, lineNumberPattern);
+    }
+
+    /**
+     * Creates a SourceLocationFilter instance with the supplied Java regular expressions
+     * to be applied within the appropriate scope. No pattern may be {@code null } or empty.
+     *
+     * @param packagePattern       The regexp to be matched to SourceLocation package properties.
+     * @param classPattern         The regexp to be matched to SourceLocation class properties.
+     * @param methodPattern        The regexp to be matched to SourceLocation method properties.
+     * @param lineNumberPattern    The regexp to be matched to SourceLocation line number properties.
+     * @param branchSegmentPattern The regexp to be matched to SourceLocation branch segment index properties.
+     */
+    public SourceLocationFilter(final String packagePattern,
+                                final String classPattern,
+                                final String methodPattern,
+                                final String lineNumberPattern,
+                                final String branchSegmentPattern) {
+
+        // Assign internal state
+        setupInternalState(LocationScope.SEGMENT);
+
+        // Compile patterns and check sanity
+        compilePattern(LocationScope.PACKAGE, packagePattern);
+        compilePattern(LocationScope.CLASS, classPattern);
+        compilePattern(LocationScope.METHOD, methodPattern);
+        compilePattern(LocationScope.LINE, lineNumberPattern);
+        compilePattern(LocationScope.SEGMENT, branchSegmentPattern);
+    }
+
+    /**
+     * Retrieves the lowest LocationScope used to filter incoming SourceLocations.
+     * For example, if this SourceLocationFilter has {@code LocationScope.CLASS }, then
+     * package name and class name attributes are used to filter SourceLocations (but
+     * method, lineNumber and segment attributes are not).
+     *
+     * @return The lowest scope used to filter SourceLocation instances, implying that Patterns for the given
+     * scope and all above it are used to filter SourceLocations.
+     */
+    public final LocationScope getScope() {
+        return scope;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean accept(final SourceLocation candidate) {
+
+        if (acceptAllInProject) {
+            return true;
+        } else {
+            for (LocationScope current : COMPARISON_ORDER) {
+
+                // Only compare down to the level defined within this SourceLocationFilter.
+                if (current.compareTo(scope) > 0) {
+                    break;
+                }
+
+                // Compare scope values to actual ones.
+                final String toMatch = "" + candidate.get(current);
+                final Matcher matcher = locationPatternMap.get(current).matcher(toMatch);
+
+                if (!matcher.matches()) {
+                    return false;
+                }
+            }
+        }
+
+        // All OK.
+        return true;
+    }
+
+    /**
+     * Convenience method which translates a string containing dots ("{@code .}"), such as a
+     * java package name, to a valid Java Regular Expressions where the dots are interpreted
+     * literally.
+     *
+     * @param patternWithDots The pattern containing verbatim dots (such as "com.foo.bar.some.package").
+     * @return The pattern, transformed to a Java Regular Expression requiring the dots verbatim
+     * For example, {@code "com.foo.bar.some.package"} would be transformed into
+     * {@code "com\\.foo\\.bar\\.some\\.package"}
+     */
+    public static String escapeDots(final String patternWithDots) {
+
+        // Check sanity
+        Validate.notEmpty(patternWithDots, "Cannot handle null or empty patternWithDots argument.");
+
+        // Escape dots and return
+        return patternWithDots.replaceAll("\\.", "\\\\.");
+    }
+
+    /**
+     * Convenience method to generate a Java Regular Expression pattern string which includes the
+     * supplied Package, and optionally all subpackages to it.
+     *
+     * @param thePackage         The Package to acquire a filter for. Cannot be {@code null}.
+     * @param includeSubPackages if {@code true}, generates a pattern string which accepts/hits
+     *                           subpackages of the supplied Package in addition to the given Package.
+     * @return a Java Regular Expression pattern string which includes the
+     * supplied Package, and optionally all subpackages to it.
+     */
+    public static String getPattern(final Package thePackage, boolean includeSubPackages) {
+
+        // Check sanity
+        Validate.notNull(thePackage, "Cannot handle null thePackage argument.");
+
+        // Ensure that subpackages can be included if so requested.
+        final String exactPackagePattern = escapeDots(thePackage.getName());
+        return includeSubPackages ? exactPackagePattern + "(\\.\\w*)*" : exactPackagePattern;
+    }
+
+    //
+    // Private helpers
+    //
+
+    private void setupInternalState(final LocationScope scope) {
+
+        locationPatternMap = new TreeMap<LocationScope, Pattern>();
+        acceptAllInProject = scope == LocationScope.PROJECT;
+        this.scope = scope;
+    }
+
+    private void compilePattern(final LocationScope location, final String javaRegExp) {
+
+        // Check sanity
+        Validate.notEmpty(javaRegExp, "Cannot handle null or empty " + location.toString().toLowerCase()
+                + " scope java regexp.");
+
+        // All done.
+        locationPatternMap.put(location, Pattern.compile(javaRegExp));
+    }
+}
diff --git a/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/T_AbstractCoverageCalculatorTest.java b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/T_AbstractCoverageCalculatorTest.java
new file mode 100644
index 0000000..394a7d7
--- /dev/null
+++ b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/T_AbstractCoverageCalculatorTest.java
@@ -0,0 +1,160 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api;
+
+import net.sourceforge.cobertura.metrics.api.event.SourceLocationListener;
+import net.sourceforge.cobertura.metrics.api.helpers.DebugCoverageCalculator;
+import net.sourceforge.cobertura.metrics.api.location.SourceLocationFilter;
+import net.sourceforge.cobertura.metrics.model.coverage.Rate;
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid, jGuru Europe AB</a>
+ */
+public class T_AbstractCoverageCalculatorTest {
+
+    // Shared state
+    private DebugCoverageCalculator unitUnderTest;
+    private CoverageType coverageType = CoverageType.LINE;
+    private SourceLocationFilter toStringFilter;
+    private SourceLocationFilter rateClassFilter;
+
+    @Before
+    public void setupSharedState() throws Exception {
+
+        unitUnderTest = new DebugCoverageCalculator();
+        final SourceLocationListener sourceLocationListener = unitUnderTest.getSourceLocationListener();
+
+        // Add some state to the DebugCoverageCalculator.
+        for(int i = 0; i < 20; i += 2) {
+
+            final String methodName = i < 9 ? "toString" : "hashCode";
+            final SourceLocation location = getLocation(Rate.class.getMethod(methodName, null), i);
+
+            sourceLocationListener.addExecutionSteps(location, i % 5);
+        }
+
+        // Create the filters.
+        final String ratePackageName = Rate.class.getPackage().getName().replaceAll("\\.", "\\\\.");
+        final String rateClassName = Rate.class.getSimpleName();
+
+        toStringFilter = new SourceLocationFilter(ratePackageName, rateClassName, "toString");
+        rateClassFilter = new SourceLocationFilter(ratePackageName, rateClassName);
+
+        /*
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:0,segment:0: 0,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:2,segment:0: 2,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:4,segment:0: 4,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:6,segment:0: 1,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:8,segment:0: 3
+
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:10,segment:0: 0,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:12,segment:0: 2,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:14,segment:0: 4,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:16,segment:0: 1,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:18,segment:0: 3,
+         */
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void validateExceptionOnNullSourceLocationFilter() {
+
+        // Act & Assert
+        unitUnderTest.getCoverage(null, coverageType);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void validateExceptionOnNullCoverageType() {
+
+        // Act & Assert
+        unitUnderTest.getCoverage(rateClassFilter, null);
+    }
+
+    @Test
+    public void validateCoverageOnToStringMethod() {
+
+        /*
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:0,segment:0: 0,  <--- miss!
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:2,segment:0: 2,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:4,segment:0: 4,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:6,segment:0: 1,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:8,segment:0: 3
+         */
+
+        // Assemble
+        final int expectedMax = 5;
+        final int expectedHits = 4;
+
+        // Act
+        final Rate coverageRate = unitUnderTest.getCoverageRate(toStringFilter, CoverageType.LINE);
+        final double coverage = unitUnderTest.getCoverage(toStringFilter, CoverageType.LINE);
+
+        // Assert
+        Assert.assertEquals(expectedMax, coverageRate.getMaximum());
+        Assert.assertEquals(expectedHits, coverageRate.getActual());
+        Assert.assertEquals(((double) expectedHits)/((double) expectedMax), coverage, 0.1d);
+    }
+
+    @Test
+    public void validateCoverageOnRateClass() {
+
+        /*
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:0,segment:0: 0,  <-- Miss!
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:2,segment:0: 2,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:4,segment:0: 4,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:6,segment:0: 1,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:8,segment:0: 3
+
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:10,segment:0: 0, <-- Miss!
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:12,segment:0: 2,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:14,segment:0: 4,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:16,segment:0: 1,
+        net.sourceforge.cobertura.metrics.model.coverage.Rate::hashCode,line:18,segment:0: 3,
+         */
+
+        // Assemble
+        final double expectedClassCoverage = 8d/10d;
+
+        // Act
+        final double classCoverage = unitUnderTest.getCoverage(rateClassFilter, coverageType);
+
+        // Assert
+        Assert.assertEquals(expectedClassCoverage, classCoverage, 0.1d);
+    }
+
+    //
+    // Private helpers
+    //
+
+    private SourceLocation getLocation(final Method method, final int lineNumber) {
+
+        final String methodName = method.getName();
+        final String className = method.getDeclaringClass().getSimpleName();
+        final String packageName = method.getDeclaringClass().getPackage().getName();
+
+        // All Done.
+        return new SourceLocation(packageName, className, methodName, lineNumber, 0);
+    }
+}
diff --git a/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/helpers/DebugCoverageCalculator.java b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/helpers/DebugCoverageCalculator.java
new file mode 100644
index 0000000..345c0be
--- /dev/null
+++ b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/helpers/DebugCoverageCalculator.java
@@ -0,0 +1,108 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api.helpers;
+
+import net.sourceforge.cobertura.metrics.api.AbstractCoverageCalculator;
+import net.sourceforge.cobertura.metrics.api.CoverageType;
+import net.sourceforge.cobertura.metrics.api.event.AbstractSourceLocationListener;
+import net.sourceforge.cobertura.metrics.api.event.SourceLocationListener;
+import net.sourceforge.cobertura.metrics.api.location.SourceLocationFilter;
+import net.sourceforge.cobertura.metrics.model.coverage.CoverageRecord;
+import net.sourceforge.cobertura.metrics.model.coverage.Rate;
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+import se.jguru.nazgul.core.algorithms.api.collections.CollectionAlgorithms;
+import se.jguru.nazgul.core.algorithms.api.collections.predicate.Filter;
+import se.jguru.nazgul.core.algorithms.api.collections.predicate.Tuple;
+
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid, jGuru Europe AB</a>
+ */
+public class DebugCoverageCalculator extends AbstractCoverageCalculator {
+
+    // Shared state
+    public final SortedMap<SourceLocation, CoverageRecord> coverageRecords
+            = new TreeMap<SourceLocation, CoverageRecord>();
+    public SourceLocationListener listener = new AbstractSourceLocationListener() {
+
+        private final Object lock = new Object();
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected void addInternalExecutionSteps(final SourceLocation nonNullLocation,
+                                                 final int positiveNumSteps) {
+
+            synchronized (lock) {
+                CoverageRecord coverageRecord = coverageRecords.get(nonNullLocation);
+
+                if (coverageRecord == null) {
+                    coverageRecord = new CoverageRecord(nonNullLocation, positiveNumSteps);
+                } else {
+                    coverageRecord.addHits(positiveNumSteps);
+                }
+
+                // Write the record back into the Map.
+                coverageRecords.put(nonNullLocation, coverageRecord);
+            }
+        }
+    };
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected Rate getRate(final SourceLocationFilter nonNullFilter, final CoverageType nonNullCoverageType) {
+
+        if(nonNullCoverageType == CoverageType.BRANCH) {
+            throw new IllegalArgumentException("Cannot handle branch coverage.");
+        }
+
+        final Filter<Tuple<SourceLocation, CoverageRecord>> filter = new Filter<Tuple<SourceLocation, CoverageRecord>>() {
+            @Override
+            public boolean accept(final Tuple<SourceLocation, CoverageRecord> candidate) {
+                return candidate != null && nonNullFilter.accept(candidate.getKey());
+            }
+        };
+
+        final Map<SourceLocation, CoverageRecord> result = CollectionAlgorithms.filter(coverageRecords, filter);
+        int hits = 0;
+        for(CoverageRecord current : result.values()) {
+            if(current.getHitCount() != 0) {
+                hits++;
+            }
+        }
+
+        // All done.
+        return new Rate(result.size(), hits, CoverageType.LINE.toString());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public SourceLocationListener getSourceLocationListener() {
+        return listener;
+    }
+}
diff --git a/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/helpers/DebugSourceLocationListener.java b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/helpers/DebugSourceLocationListener.java
new file mode 100644
index 0000000..9ddbf7d
--- /dev/null
+++ b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/helpers/DebugSourceLocationListener.java
@@ -0,0 +1,49 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api.helpers;
+
+import net.sourceforge.cobertura.metrics.api.event.AbstractSourceLocationListener;
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+
+import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid, jGuru Europe AB</a>
+ */
+public class DebugSourceLocationListener extends AbstractSourceLocationListener {
+
+    public ConcurrentNavigableMap<SourceLocation, Integer> recordedSteps
+            = new ConcurrentSkipListMap<SourceLocation, Integer>();
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void addInternalExecutionSteps(final SourceLocation nonNullLocation, final int positiveNumSteps) {
+
+        Integer numSteps = recordedSteps.get(nonNullLocation);
+        if(numSteps == null) {
+            recordedSteps.put(nonNullLocation, positiveNumSteps);
+        } else {
+            recordedSteps.put(nonNullLocation, numSteps + positiveNumSteps);
+        }
+    }
+}
diff --git a/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/location/SourceLocationFilterTest.java b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/location/SourceLocationFilterTest.java
new file mode 100644
index 0000000..af8a007
--- /dev/null
+++ b/metrics/metrics-api/src/test/java/net/sourceforge/cobertura/metrics/api/location/SourceLocationFilterTest.java
@@ -0,0 +1,151 @@
+/*
+ * #%L
+ * cobertura-metrics-api
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.api.location;
+
+import net.sourceforge.cobertura.metrics.model.coverage.Rate;
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+import java.util.regex.Pattern;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class SourceLocationFilterTest {
+
+    // Shared state
+    private SourceLocation toStringInRateClass;
+    private SourceLocation hashCodeInRateClass;
+
+    @Before
+    public void setupSharedState() throws Exception {
+
+        try {
+            toStringInRateClass = getLocation(Rate.class.getMethod("toString", null), 122);
+            hashCodeInRateClass = getLocation(SourceLocation.class.getMethod("hashCode"), 145);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException("Could not create SourceLocations", e);
+        }
+    }
+
+    @Test
+    public void validateStandardJavaRegExps() {
+
+        // Assemble
+        final String pkg = Rate.class.getPackage().getName();
+        final String escaped = pkg.replaceAll("\\.", "\\\\.");
+        final Pattern packageNamePattern = Pattern.compile(pkg);
+        final Pattern escapedNamePattern = Pattern.compile(escaped);
+
+        final String invalidPackage = "net.sourceforge_cobertura.metrics.model.coverage";
+        final String parentPackage  = "net.sourceforge.cobertura.metrics.model";
+        final String subPackage  = "net.sourceforge.cobertura.metrics.model.foobar";
+
+        // Act & Assert
+        Assert.assertTrue(escapedNamePattern.matcher(pkg).matches());
+        Assert.assertTrue(packageNamePattern.matcher(pkg).matches());
+        Assert.assertFalse(escapedNamePattern.matcher(invalidPackage).matches());
+        Assert.assertTrue(packageNamePattern.matcher(invalidPackage).matches());
+        Assert.assertFalse(escapedNamePattern.matcher(parentPackage).matches());
+        Assert.assertFalse(escapedNamePattern.matcher(subPackage).matches());
+    }
+
+    @Test
+    public void validateConveniencePatternMethods() {
+
+        // Assemble
+        final Package ratePackage = Rate.class.getPackage(); // "net.sourceforge.cobertura.metrics.model.coverage"
+        final String noSubpackagesExpectedPattern = ratePackage.getName().replaceAll("\\.", "\\\\.");
+        final String withSubpackagesExpectedPattern = noSubpackagesExpectedPattern + "(\\.\\w*)*";
+
+        final String invalidPackage = "net.sourceforge_cobertura.metrics.model.coverage";
+        final String parentPackage  = "net.sourceforge.cobertura.metrics.model";
+        final String exactPackage  = "net.sourceforge.cobertura.metrics.model.coverage";
+        final String subPackage  = "net.sourceforge.cobertura.metrics.model.coverage.foobar";
+
+        // Act
+        final Pattern noSubpackages = Pattern.compile(SourceLocationFilter.getPattern(ratePackage, false));
+        final Pattern withSubpackages = Pattern.compile(SourceLocationFilter.getPattern(ratePackage, true));
+
+        // Assert
+        Assert.assertEquals(noSubpackagesExpectedPattern, noSubpackages.pattern());
+        Assert.assertEquals(withSubpackagesExpectedPattern, withSubpackages.pattern());
+
+        System.out.println("Got: " + withSubpackages.pattern());
+        Assert.assertTrue(withSubpackages.matcher(subPackage).matches());
+        Assert.assertFalse(withSubpackages.matcher(parentPackage).matches());
+        Assert.assertFalse(withSubpackages.matcher(invalidPackage).matches());
+        Assert.assertTrue(withSubpackages.matcher(exactPackage).matches());
+
+        Assert.assertTrue(noSubpackages.matcher(exactPackage).matches());
+        Assert.assertFalse(noSubpackages.matcher(subPackage).matches());
+        Assert.assertFalse(noSubpackages.matcher(parentPackage).matches());
+        Assert.assertFalse(noSubpackages.matcher(invalidPackage).matches());
+    }
+
+    @Test
+    public void validateRegexpFiltering() {
+
+        // Assemble
+        final String packageRegExp = Rate.class.getPackage().getName();
+        final String classRegExp = Rate.class.getSimpleName();
+        final SourceLocationFilter unitUnderTest = new SourceLocationFilter(packageRegExp, classRegExp, "toString");
+
+        // Act
+        final boolean toStringAccept = unitUnderTest.accept(toStringInRateClass);
+        final boolean hashCodeAccept = unitUnderTest.accept(hashCodeInRateClass);
+
+        // Assert
+        Assert.assertTrue(toStringAccept);
+        Assert.assertFalse(hashCodeAccept);
+    }
+
+    @Test
+    public void validateProjectLevelAcceptanceFiltering() {
+
+        // Assemble
+        final SourceLocationFilter unitUnderTest = new SourceLocationFilter();
+
+        // Act
+        final boolean toStringAccept = unitUnderTest.accept(toStringInRateClass);
+        final boolean hashCodeAccept = unitUnderTest.accept(hashCodeInRateClass);
+
+        // Assert
+        Assert.assertTrue(toStringAccept);
+        Assert.assertTrue(hashCodeAccept);
+    }
+
+    //
+    // Private helpers
+    //
+
+    private SourceLocation getLocation(final Method method, final int lineNumber) {
+
+        final String methodName = method.getName();
+        final String className = method.getDeclaringClass().getSimpleName();
+        final String packageName = method.getDeclaringClass().getPackage().getName();
+
+        // All Done.
+        return new SourceLocation(packageName, className, methodName, lineNumber, 0);
+    }
+}
diff --git a/metrics/metrics-api/src/test/resources/logback-test.xml b/metrics/metrics-api/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..e500639
--- /dev/null
+++ b/metrics/metrics-api/src/test/resources/logback-test.xml
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+  #%L
+  cobertura-metrics-api
+  %%
+  Copyright (C) 2013 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<configuration>
+
+    <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%c{1}::%M]: %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- By default, make the logging keep quiet -->
+    <root level="DEBUG">
+        <appender-ref ref="Stdout"/>
+    </root>
+
+    <!-- Lower the logging level for relevant classes -->
+    <logger name="net.sourceforge.cobertura" level="WARN"/>
+    <logger name="net.sourceforge.cobertura.metrics.api" level="DEBUG"/>
+
+    <!-- Make the frameworks shut up. -->
+    <logger name="org.springframework" level="WARN"/>
+
+</configuration>
diff --git a/metrics/metrics-model/pom.xml b/metrics/metrics-model/pom.xml
new file mode 100644
index 0000000..f899d3e
--- /dev/null
+++ b/metrics/metrics-model/pom.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- +=============================================== -->
+    <!-- | Section 1:  Project information                -->
+    <!-- +=============================================== -->
+    <parent>
+        <groupId>net.sourceforge.cobertura.poms</groupId>
+        <artifactId>cobertura-api-parent</artifactId>
+        <version>2.1.1</version>
+        <relativePath>../../poms/cobertura-api-parent</relativePath>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.metrics.model</groupId>
+    <artifactId>cobertura-metrics-model</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>metrics/metrics-model</path.in.reactor>
+    </properties>
+
+    <!-- +=============================================== -->
+    <!-- | Section 2:  Dependency (management) settings   -->
+    <!-- +=============================================== -->
+    <dependencies>
+        <!-- Internal dependencies -->
+        <dependency>
+            <groupId>net.sourceforge.cobertura.interaction.annotations.api</groupId>
+            <artifactId>cobertura-annotations-api</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sourceforge.cobertura.conversion.api</groupId>
+            <artifactId>cobertura-conversion-api</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+
+        <!-- External dependencies. -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+        </dependency>
+
+        <!-- Test dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>se.jguru.nazgul.core.xmlbinding.spi.jaxb</groupId>
+            <artifactId>nazgul-core-xmlbinding-spi-jaxb</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>se.jguru.nazgul.test.xmlbinding</groupId>
+            <artifactId>nazgul-core-xmlbinding-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <!-- +=============================================== -->
+    <!-- | Section 3:  Build settings                     -->
+    <!-- +=============================================== -->
+    <!-- build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.openjpa</groupId>
+                <artifactId>openjpa-maven-plugin</artifactId>
+                <version>${openjpa.version}</version>
+                <executions>
+                    <execution>
+                        <id>enhancer</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>enhance</goal>
+                        </goals>
+                        <configuration>
+                            <includes>**/*.class</includes>
+                            <persistenceXmlFile>${basedir}/src/main/weaving/openjpa/tree-model-persistence.xml
+                            </persistenceXmlFile>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <includes>**/*.class</includes>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.openjpa</groupId>
+                        <artifactId>openjpa</artifactId>
+                        <version>${openjpa.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build -->
+
+    <!-- +=============================================== -->
+    <!-- | Section 4:  External systems                   -->
+    <!-- +=============================================== -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/LocationScope.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/LocationScope.java
new file mode 100644
index 0000000..4649c40
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/LocationScope.java
@@ -0,0 +1,67 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model;
+
+import net.sourceforge.cobertura.metrics.model.Namespace;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * Scope definition for filtering/ordering SourceLocations.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid, jGuru Europe AB</a>
+ */
+ at XmlType(namespace = Namespace.COBERTURA_NAMESPACE)
+ at XmlEnum
+public enum LocationScope {
+
+    /**
+     * Full project scope, indicating all SourceLocations within the project.
+     */
+    PROJECT,
+
+    /**
+     * Package scope, indicating all SourceLocations within a given package (not including subpackages).
+     */
+    PACKAGE,
+
+    /**
+     * Class scope, indicating all SourceLocations within a supplied Class.
+     * Inner classes are not included within the scope of their enclosing Class.
+     */
+    CLASS,
+
+    /**
+     * Method scope, indicating all SourceLocations within a supplied Method.
+     * Closures are not included within the scope of their enclosing Method.
+     */
+    METHOD,
+
+    /**
+     * Line scope, indicating all SourceLocations within a supplied Line.
+     */
+    LINE,
+
+    /**
+     * Segment scope (atomic), indicating the SourceLocation of a supplied branch segment within a given Line.
+     */
+    SEGMENT
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/Namespace.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/Namespace.java
new file mode 100644
index 0000000..cf63671
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/Namespace.java
@@ -0,0 +1,33 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model;
+
+/**
+ * Holder for frequently used XML and JSON constants.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public interface Namespace {
+
+    /**
+     * The namespace used by Cobertura's XML structures.
+     */
+    String COBERTURA_NAMESPACE = "http://github.com/cobertura";
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/CoverageRecord.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/CoverageRecord.java
new file mode 100644
index 0000000..fa80812
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/CoverageRecord.java
@@ -0,0 +1,152 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage;
+
+import net.sourceforge.cobertura.conversion.api.jaxb.AtomicLongAdapter;
+import net.sourceforge.cobertura.metrics.model.Namespace;
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+import org.apache.commons.lang3.Validate;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.io.Serializable;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Record of coverage, linking a SourceLocation with a hitCount (i.e. the number
+ * of times an automated test has executed the SourceLocation statement).
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+ at XmlType(namespace = Namespace.COBERTURA_NAMESPACE,
+        propOrder = {"location", "hitCount"})
+ at XmlAccessorType(XmlAccessType.FIELD)
+public class CoverageRecord implements Serializable, Comparable<CoverageRecord> {
+
+    private static final long serialVersionUID = 0xC0BE101;
+
+    // Internal state
+    @XmlAttribute(required = true)
+    @XmlJavaTypeAdapter(AtomicLongAdapter.class)
+    private AtomicLong hitCount;
+
+    @XmlElement(required = true, nillable = false)
+    private SourceLocation location;
+
+    /**
+     * JAXB/JPA-friendly constructor.
+     */
+    public CoverageRecord() {
+    }
+
+    /**
+     * Convenience constructor creating a CoverageRecord instance with the supplied
+     * SourceLocation and a 0 hitcount.
+     *
+     * @param location The SourceLocation of this CoverageRecord.
+     */
+    public CoverageRecord(final SourceLocation location) {
+        this(location, 0);
+    }
+
+    /**
+     * Compound constructor creating a CoverageRecord instance wrapping the supplied data.
+     *
+     * @param location The SourceLocation of this CoverageRecord.
+     * @param hitCount The hitCount, i.e. the number of times that the supplied SourceLocation has been executed by
+     *                 automated tests. Cannot be negative.
+     */
+    public CoverageRecord(final SourceLocation location, final long hitCount) {
+
+        // Check santiy
+        Validate.notNull(location, "Cannot handle null location argument.");
+        Validate.isTrue(hitCount >= 0, "Cannot handle negative hitCount.");
+
+        // Assign internal state
+        this.location = location;
+        this.hitCount = new AtomicLong(hitCount);
+    }
+
+    /**
+     * Increases the hitCount by 1.
+     */
+    public void addHit() {
+        hitCount.incrementAndGet();
+    }
+
+    /**
+     * Increases the hitCount by the supplied (positive) amount.
+     *
+     * @param hitCount The hitCount increase. Cannot be negative.
+     */
+    public void addHits(final long hitCount) {
+
+        // Check sanity
+        Validate.isTrue(hitCount >= 0, "Cannot handle negative hitCount argument.");
+
+        // All done.s
+        this.hitCount.addAndGet(hitCount);
+    }
+
+    /**
+     * @return The hitCount, i.e. the number of times that the supplied SourceLocation has been executed by
+     * automated tests. Cannot be negative.
+     */
+    public long getHitCount() {
+        return hitCount.get();
+    }
+
+    /**
+     * @return The SourceLocation of this CoverageRecord.
+     */
+    public SourceLocation getLocation() {
+        return location;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return location.toString() + ": " + hitCount;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compareTo(final CoverageRecord that) {
+
+        // Check sanity
+        if (that == null) {
+            return Integer.MIN_VALUE;
+        }
+        if (that == this) {
+            return 0;
+        }
+
+        // All done.
+        return toString().compareTo(that.toString());
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/Rate.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/Rate.java
new file mode 100644
index 0000000..49882f9
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/Rate.java
@@ -0,0 +1,166 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage;
+
+import net.sourceforge.cobertura.metrics.model.Namespace;
+import org.apache.commons.lang3.Validate;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import java.io.Serializable;
+
+/**
+ * Simplified specification of a rate, holding maximum and actual numbers as well as
+ * a description of the rate type to enable separation and grouping of different rates.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+ at XmlType(namespace = Namespace.COBERTURA_NAMESPACE, propOrder = {"maximum", "actual", "rateType"})
+ at XmlAccessorType(XmlAccessType.FIELD)
+public class Rate implements Serializable, Comparable<Rate> {
+
+    private static final long serialVersionUID = 0xC0BE100;
+
+    // Internal state
+    @XmlAttribute(required = true)
+    private int maximum;
+
+    @XmlAttribute(required = false)
+    private int actual;
+
+    @XmlElement(required = true, nillable = false)
+    private String rateType;
+
+    /**
+     * JAXB-friendly constructor.
+     */
+    public Rate() {
+        rateType = "unknown";
+    }
+
+    /**
+     * Compound constructor, creating a Rate wrapping the supplied values.
+     *
+     * @param maximum  The maximum value for this rate.
+     * @param actual   The actual value for this rate.
+     * @param rateType The type fo
+     */
+    public Rate(final int maximum, final int actual, final String rateType) {
+
+        // Check sanity
+        Validate.notEmpty(rateType, "Cannot handle null or empty rateType argument.");
+        Validate.isTrue(actual >= 0, "Cannot handle negative actual argument.");
+        Validate.isTrue(maximum >= 0, "Cannot handle negative maximum argument.");
+        Validate.isTrue(maximum >= actual, "maximum argument must be >= actual argument.");
+
+        // Assign internal state
+        this.maximum = maximum;
+        this.actual = actual;
+        this.rateType = rateType;
+    }
+
+    /**
+     * @return the maximum value for this rate, such as the maximum/valid branch or
+     * line count within a java class.
+     */
+    public int getMaximum() {
+        return maximum;
+    }
+
+    /**
+     * @return the actual value for this rate, such as the covered/executed branch or
+     * line count within a java class.
+     */
+    public int getActual() {
+        return actual;
+    }
+
+    /**
+     * Retrieves the type of this Rate, such as "branch", "line".
+     *
+     * @return the description of this Rate, such as "branch", "line".
+     * The rateType cannot be {@code null} or empty - it is considered a classifier
+     * of this rate.
+     */
+    public String getRateType() {
+        return rateType;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compareTo(final Rate that) {
+
+        // Check sanity
+        if (that == null) {
+            return Integer.MIN_VALUE;
+        }
+        if (that == this) {
+            return 0;
+        }
+
+        // Compare the values
+        int result = getRateType().compareTo(that.getRateType());
+        if (result == 0) {
+            result = getMaximum() - that.getMaximum();
+        }
+        if (result == 0) {
+            result = getActual() - that.getActual();
+        }
+
+        // All done.
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "Rate (" + getRateType() + "): [" + getActual() + "/" + getMaximum() + "]";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        return getRateType().hashCode() + getMaximum() + getActual();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+
+        // Check sanity
+        if(obj == null) {
+            return false;
+        }
+
+        // All done.
+        return (obj instanceof Rate) && (hashCode() == obj.hashCode());
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/AbstractBranchAndLineCoverage.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/AbstractBranchAndLineCoverage.java
new file mode 100644
index 0000000..9a94a2c
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/AbstractBranchAndLineCoverage.java
@@ -0,0 +1,139 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.legacy;
+
+import net.sourceforge.cobertura.metrics.model.Namespace;
+import org.apache.commons.lang3.Validate;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * Abstract implementation of the BranchAndLineCoverage specification, sporting standard implementations
+ * and simple state.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+ at XmlType(namespace = Namespace.COBERTURA_NAMESPACE, propOrder = {"validLineCount", "coveredLineCount"})
+ at XmlAccessorType(XmlAccessType.FIELD)
+public abstract class AbstractBranchAndLineCoverage<T extends AbstractBranchAndLineCoverage>
+        extends AbstractBranchCoverage<T> implements BranchAndLineCoverage {
+
+    private static final long serialVersionUID = 0xC0BE003;
+
+    // Internal state
+    @XmlAttribute(required = false)
+    private int coveredLineCount;
+
+    @XmlAttribute(required = true)
+    private int validLineCount;
+
+    /**
+     * JAXB-friendly constructor, which implies that the AbstractBranchAndLineCoverage
+     * instance is created with 0 valid and covered branch and line count values.
+     */
+    public AbstractBranchAndLineCoverage() {
+    }
+
+    /**
+     * Compound constructor, creating an AbstractBranchAndLineCoverage instance wrapping the supplied data.
+     *
+     * @param coveredBranchCount The number of covered branches (execution paths through the source code),
+     *                           which must be positive and lesser than or equal to the validBranchCount.
+     * @param validBranchCount   The number of valid branches (execution paths through the source code),
+     *                           which must be positive and greater than or equal to the coveredBranchCount.
+     */
+    protected AbstractBranchAndLineCoverage(final int coveredBranchCount,
+                                            final int validBranchCount,
+                                            final int coveredLineCount,
+                                            final int validLineCount) {
+
+        super(coveredBranchCount, validBranchCount);
+
+        // Assign internal state
+        setLineCounts(coveredLineCount, validLineCount);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public double getLineCoverageRate() throws IllegalStateException {
+        return getDefaultCoverageRate(validLineCount, coveredLineCount, "validLineCount", "coveredLineCount");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getCoveredLineCount() {
+        return coveredLineCount;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getValidLineCount() {
+        return validLineCount;
+    }
+
+    /**
+     * Assigns the coveredLineCount of this AbstractBranchAndLineCoverage instance.
+     *
+     * @param coveredLineCount The number of covered branches (execution paths through the source code),
+     *                         which must be positive and lesser than or equal to the validLineCount.
+     * @throws IllegalArgumentException if the coveredLineCount parameter is negative or larger than the
+     *                                  validLineCount.
+     */
+    protected final void setCoveredLineCount(int coveredLineCount) throws IllegalArgumentException {
+
+        // Check sanity
+        Validate.isTrue(coveredLineCount >= 0, "Cannot handle negative coveredLineCount argument.");
+        Validate.isTrue(validLineCount >= coveredLineCount, "coveredLineCount argument must be >= validLineCount (Got"
+                + " coveredBranchCount: " + coveredLineCount + ", validLineCount: " + validLineCount + ").");
+
+        // Assign internal state
+        this.coveredLineCount = coveredLineCount;
+    }
+
+    /**
+     * Assigns the coveredLineCount and validLineCount counters.
+     *
+     * @param coveredLineCount The number of covered branches (execution paths through the source code),
+     *                         which must be positive and lesser than or equal to the validLineCount.
+     * @param validLineCount   The number of valid branches (execution paths through the source code),
+     *                         which must be positive and greater than or equal to the coveredLineCount.
+     * @throws IllegalArgumentException if any argument is negative or coveredLineCount is larger
+     *                                  than validLineCount.
+     */
+    protected final void setLineCounts(final int coveredLineCount, final int validLineCount)
+            throws IllegalArgumentException {
+
+        // Check sanity
+        Validate.isTrue(validLineCount >= 0, "Cannot handle negative validLineCount argument.");
+
+        // Assign internal state
+        this.validLineCount = validLineCount;
+        setCoveredLineCount(coveredLineCount);
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/AbstractBranchCoverage.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/AbstractBranchCoverage.java
new file mode 100644
index 0000000..16d8f57
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/AbstractBranchCoverage.java
@@ -0,0 +1,175 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.legacy;
+
+import net.sourceforge.cobertura.metrics.model.Namespace;
+import org.apache.commons.lang3.Validate;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * Abstract implementation of the BranchCoverage specification, sporting standard implementations and simple state.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+ at XmlType(namespace = Namespace.COBERTURA_NAMESPACE, propOrder = {"validBranchCount", "coveredBranchCount"})
+ at XmlAccessorType(XmlAccessType.FIELD)
+public abstract class AbstractBranchCoverage<T extends AbstractBranchCoverage>
+        implements BranchCoverage, Comparable<T> {
+
+    private static final long serialVersionUID = 0xC0BE002;
+
+    // Internal state
+    @XmlAttribute(required = false)
+    private int coveredBranchCount;
+
+    @XmlAttribute(required = true)
+    private int validBranchCount;
+
+    /**
+     * JAXB-friendly constructor, which implies that the AbstractBranchCoverage
+     * instance is created with 0 valid and covered branch count values.
+     */
+    public AbstractBranchCoverage() {
+    }
+
+    /**
+     * Compound constructor, creating an AbstractBranchCoverage instance wrapping the supplied data.
+     *
+     * @param coveredBranchCount The number of covered branches (execution paths through the source code),
+     *                           which must be positive and lesser than or equal to the validBranchCount.
+     * @param validBranchCount   The number of valid branches (execution paths through the source code),
+     *                           which must be positive and greater than or equal to the coveredBranchCount.
+     */
+    protected AbstractBranchCoverage(final int coveredBranchCount,
+                                     final int validBranchCount) {
+
+        // Assign internal state
+        setBranchCounts(coveredBranchCount, validBranchCount);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getValidBranchCount() {
+        return validBranchCount;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getCoveredBranchCount() {
+        return coveredBranchCount;
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p/>
+     * TODO: Move to API, to make the model simpler? (This is just a calculation of known data).
+     */
+    @Override
+    public double getBranchCoverageRate() throws IllegalStateException {
+        return getDefaultCoverageRate(validBranchCount, coveredBranchCount, "validBranchCount", "coveredBranchCount");
+    }
+
+    /**
+     * Assigns the coveredBranchCount of this AbstractBranchCoverage instance.
+     *
+     * @param coveredBranchCount The number of covered branches (execution paths through the source code),
+     *                           which must be positive and lesser than or equal to the validBranchCount.
+     * @throws IllegalArgumentException if the coveredBranchCount parameter is negative or larger than the
+     *                                  validBranchCount.
+     */
+    protected final void setCoveredBranchCount(int coveredBranchCount) throws IllegalArgumentException {
+
+        // Check sanity
+        Validate.isTrue(coveredBranchCount >= 0, "Cannot handle negative coveredBranchCount argument.");
+        Validate.isTrue(validBranchCount >= coveredBranchCount, "coveredBranchCount argument must be >= validBranchCount (Got coveredBranchCount:"
+                + " " + coveredBranchCount + ", validBranchCount: " + validBranchCount + ").");
+
+        // Assign internal state
+        this.coveredBranchCount = coveredBranchCount;
+    }
+
+    /**
+     * Assigns the coveredBranchCount and validBranchCount counters.
+     *
+     * @param coveredBranchCount The number of covered branches (execution paths through the source code),
+     *                           which must be positive and lesser than or equal to the validBranchCount.
+     * @param validBranchCount   The number of valid branches (execution paths through the source code),
+     *                           which must be positive and greater than or equal to the coveredBranchCount.
+     * @throws IllegalArgumentException if any argument is negative or coveredBranchCount is larger
+     *                                  than validBranchCount.
+     */
+    protected final void setBranchCounts(final int coveredBranchCount, final int validBranchCount)
+            throws IllegalArgumentException {
+
+        // Check sanity
+        Validate.isTrue(validBranchCount >= 0, "Cannot handle negative validBranchCount argument.");
+
+        // Assign internal state
+        this.validBranchCount = validBranchCount;
+        setCoveredBranchCount(coveredBranchCount);
+    }
+
+    /**
+     * Retrieves the coverage rate for the supplied data.
+     *
+     * @param maxCount        The maximum/valid count of lines or branches.
+     * @param actualCount     The actual/registered count of lines or branches.
+     * @param maxCountTerm    The term for the maximum count, such as "validBranchCount".
+     * @param actualCountTerm The term for the actual count, such as "coveredBranchCount".
+     * @return the coverage percentage, as a number {@code 0 < x < 1}.
+     * @throws java.lang.IllegalArgumentException if {@code maxCount < actualCount }.
+     */
+    protected static double getDefaultCoverageRate(final int maxCount,
+                                                   final int actualCount,
+                                                   final String maxCountTerm,
+                                                   final String actualCountTerm)
+            throws IllegalArgumentException {
+
+        final String maxStatement = maxCountTerm + " [" + maxCount + "]";
+        final String actualStatement = actualCountTerm + " [" + actualCount + "]";
+
+        // Check sanity
+        Validate.isTrue(maxCount >= 0, "Cannot handle negative " + maxStatement + ".");
+        Validate.isTrue(actualCount >= 0, "Cannot handle negative " + actualStatement + ".");
+        if (maxCount == 0) {
+
+            if (actualCount != 0) {
+                throw new IllegalStateException(maxStatement + " is invalid for " + actualStatement + ".");
+            }
+
+            // Both counts are 0; there are no branches and no coverage.
+            return 0;
+        }
+        if (maxCount < actualCount) {
+            throw new IllegalStateException(maxStatement + " should never be < " + actualStatement + ".");
+        }
+
+        // All done.
+        return ((double) actualCount) / ((double) maxCount);
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/BranchAndLineCoverage.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/BranchAndLineCoverage.java
new file mode 100644
index 0000000..782d2c3
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/BranchAndLineCoverage.java
@@ -0,0 +1,52 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.legacy;
+
+/**
+ * Specification for all types which contain branch and source code line coverage metrics.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public interface BranchAndLineCoverage extends BranchCoverage {
+
+    /**
+     * @return The number of valid source code lines measured by this BranchAndLineCoverage instance.
+     * This number must be positive, and greater than or equal to the covered line count.
+     */
+    int getValidLineCount();
+
+    /**
+     * @return The number of source code lines traversed by tests and recorded in this BranchAndLineCoverage instance.
+     * This number must be positive, but lower than or equal to the valid branch count.
+     */
+    int getCoveredLineCount();
+
+    /**
+     * Retrieves the source code line coverage rate, which is normally the covered line count
+     * divided by the valid line count.
+     *
+     * @return The coverage rate, which should be a double in the range {@code 0 < rate < 1}. Normally,
+     * this is calculated as {@code getCoveredLineCount() / getValidLineCount() }. Should the value of
+     * {@code getCoveredLineCount() } be 0, this method should return 0.
+     *
+     * @throws java.lang.IllegalStateException if {@code getValidLineCount() > getCoveredLineCount() }.
+     */
+    double getLineCoverageRate() throws IllegalStateException;
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/BranchCoverage.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/BranchCoverage.java
new file mode 100644
index 0000000..c8e00a6
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/legacy/BranchCoverage.java
@@ -0,0 +1,56 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.legacy;
+
+import java.io.Serializable;
+
+/**
+ * Specification for all types which contain branch coverage metrics.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public interface BranchCoverage extends Serializable {
+
+    /**
+     * @return The number of valid branches measured by this BranchCoverage instance.
+     * This number must be positive, and greater than or equal to the covered branch count.
+     */
+    int getValidBranchCount();
+
+    /**
+     * @return The number of branches traversed by tests and recorded in this BranchCoverage instance.
+     * This number must be positive, but lower than or equal to the valid branch count.
+     */
+    int getCoveredBranchCount();
+
+    /**
+     * TODO: Move to API, to make the model simpler? (This is just a calculation of known data).
+     *
+     * Retrieves the branch coverage rate, which is normally the covered branch count
+     * divided by the valid branch count.
+     *
+     * @return The coverage rate, which should be a double in the range {@code 0 < rate < 1}. Normally,
+     * this is calculated as {@code getCoveredBranchCount() / getValidBranchCount() }. Should the value of
+     * {@code getCoveredBranchCount() } be 0, this method should return 0.
+     *
+     * @throws java.lang.IllegalStateException if {@code getValidBranchCount() > getCoveredBranchCount() }.
+     */
+    double getBranchCoverageRate() throws IllegalStateException;
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/AbstractCoverageScope.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/AbstractCoverageScope.java
new file mode 100644
index 0000000..8f56ee3
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/AbstractCoverageScope.java
@@ -0,0 +1,190 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.scope;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+import net.sourceforge.cobertura.metrics.model.Namespace;
+import org.apache.commons.lang3.Validate;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * Abstract CoverageScope implementation holding most values.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+ at XmlType(namespace = Namespace.COBERTURA_NAMESPACE,
+        propOrder = {"name", "patterns"})
+ at XmlAccessorType(XmlAccessType.FIELD)
+public abstract class AbstractCoverageScope implements CoverageScope {
+
+    // Internal state
+    @XmlElement(required = true, nillable = false)
+    private String name;
+
+    @XmlTransient
+    private transient EnumMap<LocationScope, Pattern> patternMap;
+
+    @XmlElementWrapper(name = "patterns", required = true, nillable = false)
+    @XmlElement(name = "pattern")
+    private List<String> patterns;
+
+    /**
+     * JAXB-friendly constructor.
+     */
+    public AbstractCoverageScope() {
+    }
+
+    /**
+     * Compound constructor invoked by subclasses.
+     * The constructor will, in turn, call the template setup method {@code setupPatternMap} to configure
+     * the patternMap.
+     *
+     * @param name The human-readable name of this AbstractCoverageScope instance,
+     *             such as the fully qualified package or class name.
+     * @throws java.lang.IllegalStateException if the patternMap, populated from the {@code setupPatternMap} method
+     * held null patterns.
+     */
+    protected AbstractCoverageScope(final String name) throws IllegalStateException {
+
+        // Check sanity
+        Validate.notEmpty(name, "Cannot handle null or empty name argument.");
+
+        // Assign internal state
+        this.name = name;
+        this.patternMap = new EnumMap<LocationScope, Pattern>(LocationScope.class);
+        patternMap.put(LocationScope.PROJECT, Pattern.compile("\\*"));
+
+        // Acquire the pattern map and validate its content
+        setupPatternMap(patternMap);
+
+        // Copy all Patterns to the patterns List
+        for(Map.Entry<LocationScope, Pattern> current : patternMap.entrySet()) {
+            patterns.add(current.getValue().pattern());
+        }
+    }
+
+    /**
+     * Template initialization method, invoked from within the constructor of AbstractCoverageScope
+     * intended for the concrete subclass to setup the EnumMap relating LocationScope to
+     * selection Pattern. The only method legal to call within this class from within the setupPatternMap
+     * method is {@code getName() } - all other methods called from within this setupPatternMap method
+     * will throw exceptions due to instance state not being initialized.
+     *
+     * @param patternMap An EnumMap holding one element:
+     * {@code patternMap.put(LocationScope.PROJECT, Pattern.compile("\\*")); }
+     */
+    protected abstract void setupPatternMap(final EnumMap<LocationScope, Pattern> patternMap);
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Pattern get(final LocationScope scope) {
+
+        if(patternMap == null) {
+
+            // Re-generate the patternMap
+            this.patternMap = new EnumMap<LocationScope, Pattern>(LocationScope.class);
+
+            for(int i = 0; i < Math.min(patterns.size(), LocationScope.values().length); i++) {
+
+                // Patterns should not contain null elements.
+                patternMap.put(LocationScope.values()[i], Pattern.compile(patterns.get(i)));
+            }
+        }
+
+
+        // All done.
+        return patternMap.get(scope);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final LocationScope getLowestScope() {
+        LocationScope toReturn = null;
+
+        // Simply find the last of the keys.
+        for (LocationScope current : patternMap.keySet()) {
+            toReturn = current;
+        }
+
+        // All done.
+        return toReturn;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compareTo(final CoverageScope that) {
+
+        // Check sanity
+        if (that == null) {
+            return Integer.MIN_VALUE;
+        }
+        if (that == this) {
+            return 0;
+        }
+
+        // Compare parts.
+        int toReturn = getLowestScope().compareTo(that.getLowestScope());
+        if (toReturn == 0) {
+
+            for(LocationScope current : LocationScope.values()) {
+                if(current.compareTo(getLowestScope()) > 0) {
+                    break;
+                }
+
+                toReturn = get(current).pattern().compareTo(that.get(current).pattern());
+                if(toReturn != 0) {
+                    break;
+                }
+            }
+        }
+
+        // Compare the names
+        if (toReturn == 0) {
+            toReturn = this.getName().compareTo(that.getName());
+        }
+
+        // All done.
+        return toReturn;
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/ClassCoverageScope.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/ClassCoverageScope.java
new file mode 100644
index 0000000..0aa2ce2
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/ClassCoverageScope.java
@@ -0,0 +1,71 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.scope;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+
+import java.util.EnumMap;
+import java.util.regex.Pattern;
+
+/**
+ * CoverageScope implementation for a single Class (without any inner classes included).
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class ClassCoverageScope extends AbstractCoverageScope {
+
+    // Internal state
+    private transient Class<?> theClass;
+
+    /**
+     * JAXB-friendly constructor.
+     */
+    public ClassCoverageScope() {
+    }
+
+    /**
+     * Compound constructor invoked by subclasses.
+     * The constructor will, in turn, call the template setup method {@code setupPatternMap} to configure
+     * the patternMap.
+     *
+     * @param aClass The class for which this ClassCoverageScope should be generated.
+     * @throws IllegalStateException if the patternMap, populated from the {@code setupPatternMap} method
+     *                                         held null patterns.
+     */
+    public ClassCoverageScope(final Class<?> aClass) throws IllegalStateException {
+        super(aClass.getName());
+
+        // Assign internal state
+        theClass = aClass;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void setupPatternMap(EnumMap<LocationScope, Pattern> patternMap) {
+
+        final String packagePattern = theClass.getPackage().getName().replaceAll("\\.", "\\\\.");
+        final String classPattern = theClass.getSimpleName();
+
+        patternMap.put(LocationScope.PACKAGE, Pattern.compile(packagePattern));
+        patternMap.put(LocationScope.CLASS, Pattern.compile(classPattern));
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/CoverageScope.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/CoverageScope.java
new file mode 100644
index 0000000..ebc36bc
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/CoverageScope.java
@@ -0,0 +1,66 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.scope;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+
+import java.io.Serializable;
+import java.util.regex.Pattern;
+
+/**
+ * Specification for how to aggregate CoverageRecords into a sensibly
+ * sized scope, typically used for generating reports or validation criteria.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public interface CoverageScope extends Serializable, Comparable<CoverageScope> {
+
+    /**
+     * Path element separator.
+     */
+    String SEPARATOR = "/";
+
+    /**
+     * Retrieves a Pattern for the supplied LocationScope; the Pattern is used
+     * to identify all SourceLocations within this CoverageScope.
+     *
+     * @param scope The LocationScope for which the identifying Pattern should be acquired.
+     * @return an identifying Pattern for the supplied LocationScope, or {@code null} if no
+     * Pattern was found for this CoverageScope.
+     */
+    Pattern get(LocationScope scope);
+
+    /**
+     * Retrieves the LocationScope of this CoverageScope, implying the smallest
+     * syntactic scope for which this CoverageScope has Pattern definitions.
+     * As an example, if a CoverageScope is of scope {@code LocationScope.CLASS},
+     * then the {@code getPatterns() } method must have non-null Pattern values for
+     * all LocationScopes down to the LocationScope.CLASS.
+     *
+     * @return The lowest scope for which this CoverageScope has a pattern definition.
+     */
+    LocationScope getLowestScope();
+
+    /**
+     * @return The human-readable name for this CoverageScope, such as the
+     * fully qualified package or class name.
+     */
+    String getName();
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/MethodCoverageScope.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/MethodCoverageScope.java
new file mode 100644
index 0000000..5103c08
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/MethodCoverageScope.java
@@ -0,0 +1,76 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.scope;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+
+import java.lang.reflect.Method;
+import java.util.EnumMap;
+import java.util.regex.Pattern;
+
+/**
+ * CoverageScope implementation for a single Method.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class MethodCoverageScope extends AbstractCoverageScope {
+
+    // Internal state
+    private transient Method theMethod;
+
+    /**
+     * JAXB-friendly constructor.
+     */
+    public MethodCoverageScope() {
+    }
+
+    /**
+     * Compound constructor invoked by subclasses.
+     * The constructor will, in turn, call the template setup method {@code setupPatternMap} to configure
+     * the patternMap.
+     *
+     * @param method The method which constitutes the CoverageScope.
+     * @throws IllegalStateException if the patternMap, populated from the {@code setupPatternMap} method
+     *                               held null patterns.
+     */
+    public MethodCoverageScope(final Method method) throws IllegalStateException {
+        super(method.toGenericString());
+
+        // Assign internal state
+        theMethod = method;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void setupPatternMap(final EnumMap<LocationScope, Pattern> patternMap) {
+
+        final Class<?> theClass = theMethod.getDeclaringClass();
+        final String packagePattern = theClass.getPackage().getName().replaceAll("\\.", "\\\\.");
+        final String classPattern = theClass.getSimpleName();
+
+        patternMap.put(LocationScope.PACKAGE, Pattern.compile(packagePattern));
+        patternMap.put(LocationScope.CLASS, Pattern.compile(classPattern));
+
+        // TODO: Update to handle overloaded methods
+        patternMap.put(LocationScope.METHOD, Pattern.compile(theMethod.getName()));
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/PackageCoverageScope.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/PackageCoverageScope.java
new file mode 100644
index 0000000..7afc93d
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/PackageCoverageScope.java
@@ -0,0 +1,59 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.scope;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+
+import java.util.EnumMap;
+import java.util.regex.Pattern;
+
+/**
+ * CoverageScope implementation for a single Package (without any subpackages included).
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class PackageCoverageScope extends AbstractCoverageScope {
+
+    /**
+     * JAXB-friendly constructor.
+     */
+    public PackageCoverageScope() {
+    }
+
+    /**
+     * Compound constructor, creating a CoverageScope for a singular Package
+     * (i.e. not including subpackages).
+     *
+     * @param scopePackage The package which should constitute this PackageCoverageScope.
+     * @throws IllegalStateException if the patternMap, populated from the {@code setupPatternMap} method
+     *                                         held null patterns.
+     */
+    public PackageCoverageScope(final Package scopePackage) throws IllegalStateException {
+        super(scopePackage.getName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void setupPatternMap(final EnumMap<LocationScope, Pattern> patternMap) {
+        patternMap.put(LocationScope.PACKAGE, Pattern.compile(getName().replaceAll("\\.", "\\\\.")));
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/ProjectCoverageScope.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/ProjectCoverageScope.java
new file mode 100644
index 0000000..93584d6
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/coverage/scope/ProjectCoverageScope.java
@@ -0,0 +1,61 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage.scope;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+
+import java.util.EnumMap;
+import java.util.regex.Pattern;
+
+/**
+ * CoverageScope implementation for Projects, sporting only a project name.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class ProjectCoverageScope extends AbstractCoverageScope {
+
+    /**
+     * JAXB-friendly constructor.
+     */
+    public ProjectCoverageScope() {
+        super();
+    }
+
+    /**
+     * Compound constructor invoked by subclasses.
+     * The constructor will, in turn, call the template setup method {@code setupPatternMap} to configure
+     * the patternMap.
+     *
+     * @param projectName The human-readable project name.
+     * @throws IllegalStateException if the patternMap, populated from the {@code setupPatternMap} method
+     *                               held null patterns.
+     */
+    public ProjectCoverageScope(final String projectName) throws IllegalStateException {
+        super(projectName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void setupPatternMap(final EnumMap<LocationScope, Pattern> patternMap) {
+        // Do nothing; the default setup for the patternMap works well in this case
+    }
+}
diff --git a/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/location/SourceLocation.java b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/location/SourceLocation.java
new file mode 100644
index 0000000..5f00ec0
--- /dev/null
+++ b/metrics/metrics-model/src/main/java/net/sourceforge/cobertura/metrics/model/location/SourceLocation.java
@@ -0,0 +1,290 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.location;
+
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+import net.sourceforge.cobertura.metrics.model.Namespace;
+import org.apache.commons.lang3.Validate;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
+/**
+ * Simple Source code Location definition, refraining from using java reflection
+ * types to reduce class loading requirements.
+ *
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+ at XmlType(namespace = Namespace.COBERTURA_NAMESPACE,
+        propOrder = {"packageName", "className", "methodName", "lineNumber", "branchSegment"})
+ at XmlAccessorType(XmlAccessType.FIELD)
+public class SourceLocation implements Serializable, Comparable<SourceLocation> {
+
+    private static final long serialVersionUID = 0xC0BE001;
+
+    // Internal state
+    @XmlElement(required = true, nillable = false)
+    private String packageName;
+
+    @XmlElement(required = true, nillable = false)
+    private String className;
+
+    @XmlElement(required = true, nillable = false)
+    private String methodName;
+
+    @XmlAttribute(required = true)
+    private int lineNumber;
+
+    @XmlAttribute(required = false)
+    private int branchSegment;
+
+    /**
+     * JAXB-friendly constructor.
+     */
+    public SourceLocation() {
+    }
+
+    /**
+     * Compound constructor, wrapping the supplied data.
+     *
+     * @param packageName   The name of the package containing this SourceLocation, corresponding
+     *                      to {@code Package.getName() }.
+     * @param className     The simple name of the class containing this SourceLocation,
+     *                      corresponding to {@code Class.getSimpleName() }.
+     * @param methodName    The name of the method containing this SourceLocation, corresponding to
+     *                      {@code Method.getName() }.
+     * @param lineNumber    The line number in the class containing this SourceLocation.
+     * @param branchSegment The branch segment on the lineNumber in the class containing this SourceLocation.
+     */
+    public SourceLocation(final String packageName,
+                          final String className,
+                          final String methodName,
+                          final int lineNumber,
+                          final int branchSegment) {
+
+        // Check sanity
+        Validate.notEmpty(packageName, "Cannot handle null or empty packageName argument.");
+        Validate.notEmpty(className, "Cannot handle null or empty className argument.");
+        Validate.notEmpty(methodName, "Cannot handle null or empty methodName argument.");
+        Validate.isTrue(lineNumber >= 0, "Cannot handle negative lineNumber argument.");
+        Validate.isTrue(branchSegment >= 0, "Cannot handle negative branchSegment argument.");
+
+        // Assign internal state
+        this.packageName = packageName;
+        this.className = className;
+        this.methodName = methodName;
+        this.lineNumber = lineNumber;
+        this.branchSegment = branchSegment;
+    }
+
+    /**
+     * Convenience constructor, wrapping the supplied data and assigning a branchSegment of 0,
+     * indicating the first (only?) branchSegment on the supplied code line.
+     *
+     * @param packageName The name of the package containing this SourceLocation, corresponding
+     *                    to {@code Package.getName() }.
+     * @param className   The simple name of the class containing this SourceLocation,
+     *                    corresponding to {@code Class.getSimpleName() }.
+     * @param methodName  The name of the method containing this SourceLocation, corresponding to
+     *                    {@code Method.getName() }.
+     * @param lineNumber  The line number in the class containing this SourceLocation.
+     */
+    public SourceLocation(final String packageName,
+                          final String className,
+                          final String methodName,
+                          final int lineNumber) {
+
+        // Delegate
+        this(packageName, className, methodName, lineNumber, 0);
+    }
+
+    /**
+     * Convenience constructor digging out package class and method names from
+     * the supplied Method object.
+     *
+     * @param method        The non-null Method object holding package, class and method names.
+     * @param lineNumber    The line number in the class containing this SourceLocation.
+     * @param branchSegment The branch segment on the lineNumber in the class containing this SourceLocation.
+     */
+    public SourceLocation(final Method method,
+                          final int lineNumber,
+                          final int branchSegment) {
+        // Delegate
+        this(method.getDeclaringClass().getPackage().getName(),
+                method.getDeclaringClass().getSimpleName(),
+                method.getName(),
+                lineNumber,
+                branchSegment);
+    }
+
+    /**
+     * Convenience constructor digging out package class and method names from
+     * the supplied Method object and using a default branchSegment of 0, implying the
+     * first (only?) branch on the given line.
+     *
+     * @param method     The non-null Method object holding package, class and method names.
+     * @param lineNumber The line number in the class containing this SourceLocation.
+     */
+    public SourceLocation(final Method method,
+                          final int lineNumber) {
+        // Delegate
+        this(method, lineNumber, 0);
+    }
+
+    /**
+     * @return The name of the package containing this SourceLocation, corresponding
+     * to {@code Package.getName() }.
+     */
+    public String getPackageName() {
+        return packageName;
+    }
+
+    /**
+     * @return The simple name of the class containing this SourceLocation,
+     * corresponding to {@code Class.getSimpleName() }.
+     */
+    public String getClassName() {
+        return className;
+    }
+
+    /**
+     * @return The name of the method containing this SourceLocation, corresponding to
+     * {@code Method.getName() }.
+     */
+    public String getMethodName() {
+        return methodName;
+    }
+
+    /**
+     * @return The line number in the class containing this SourceLocation.
+     */
+    public int getLineNumber() {
+        return lineNumber;
+    }
+
+    /**
+     * Retrieves the branch segment for this SourceLocation.
+     * The branch segment is 0 for a line holding only one statement, and
+     * increases by 1 for each additional segment introduced.
+     * A new branch segment is introduced whenever an additional branch can
+     * be reached within this SourceLocation.
+     *
+     * @return The branch segment on the lineNumber in the class containing this SourceLocation.
+     */
+    public int getBranchSegment() {
+        return branchSegment;
+    }
+
+    /**
+     * Alternate accessor method, which delegates the actual accessing to the
+     * appropriate getter.
+     *
+     * @param scope The scope for which the SourceLocation value should be retrieved.
+     *              Cannot be null or {@code LocationScope.PROJECT } (which does not make sense).
+     * @return A String for package, class or method name and an Integer for line number and branch segment.
+     */
+    public Object get(final LocationScope scope) {
+
+        // Check sanity
+        Validate.notNull(scope, "Cannot handle null scope argument.");
+        Validate.isTrue(scope != LocationScope.PROJECT, "'PROJECT' scope argument does not make sense.");
+
+        Object toReturn = null;
+        switch (scope) {
+            case PACKAGE:
+                toReturn = getPackageName();
+                break;
+            case CLASS:
+                toReturn = getClassName();
+                break;
+            case METHOD:
+                toReturn = getMethodName();
+                break;
+            case LINE:
+                toReturn = getLineNumber();
+                break;
+            case SEGMENT:
+                toReturn = getBranchSegment();
+                break;
+        }
+
+        // All done.
+        return toReturn;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compareTo(final SourceLocation that) {
+
+        // Check sanity
+        if (that == null) {
+            return Integer.MIN_VALUE;
+        }
+        if (that == this) {
+            return 0;
+        }
+
+        // All done.
+        return toString().compareTo(that.toString());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return getPackageName() + "." + getClassName() + "::" + getMethodName() + ",line:" + getLineNumber()
+                + ",segment:" + getBranchSegment();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        return getPackageName().hashCode()
+                + getClassName().hashCode()
+                + getMethodName().hashCode()
+                + getLineNumber()
+                + getBranchSegment();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(final Object obj) {
+
+        // Check sanity
+        if (obj == null) {
+            return false;
+        }
+
+        // All done.
+        return (obj instanceof SourceLocation) && (hashCode() == obj.hashCode());
+    }
+}
diff --git a/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/JaxbUtils.java b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/JaxbUtils.java
new file mode 100644
index 0000000..d33da73
--- /dev/null
+++ b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/JaxbUtils.java
@@ -0,0 +1,141 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model;
+
+import se.jguru.nazgul.core.xmlbinding.spi.jaxb.helper.JaxbNamespacePrefixResolver;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
+import javax.xml.transform.stream.StreamSource;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public final class JaxbUtils {
+
+    // Internal state
+    private static final JaxbNamespacePrefixResolver namespacePrefixMapper = new JaxbNamespacePrefixResolver();
+
+    static {
+        namespacePrefixMapper.put(Namespace.COBERTURA_NAMESPACE, "cobertura");
+    }
+
+    /*
+     * Hide constructors for utility classes.
+     */
+    private JaxbUtils() {
+    }
+
+    /**
+     * Retrieves a JAXB Marshaller which can marshal the supplied, JAXB-annotated types.
+     *
+     * @param jaxbAnnotatedTypes Types to be marshalled by the retrieved Marshaller. All types must be JAXB-annotated.
+     * @return a JAXB Marshaller which can marshal the supplied, JAXB-annotated types,
+     * and which will produce human-readable (rather than compressed) XML.
+     */
+    public static Marshaller getHumanReadableMarshallerFor(final Class... jaxbAnnotatedTypes) {
+
+        try {
+            final JAXBContext ctx = JAXBContext.newInstance(jaxbAnnotatedTypes);
+            return se.jguru.nazgul.core.xmlbinding.spi.jaxb.helper.JaxbUtils.getHumanReadableStandardMarshaller(
+                    ctx, namespacePrefixMapper, false);
+        } catch (JAXBException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Creates a DocumentRoot-worthy JAXBElement holding the supplied single object
+     * and sporting the supplied QName namespaceURI, localPart and prefix.
+     *
+     * @param object       The JAXB-annotated object to wrap in a JAXBElement.
+     * @param namespaceURI The XML namespace URI.
+     * @param localPart    The XML localPart of the returned JAXBElement.
+     * @param prefix       The XML namespace prefix of the returned JAXBElement.
+     * @param <T>          The type of the object.
+     * @return a DocumentRoot-worthy JAXBElement holding the supplied single object.
+     */
+    public static <T> JAXBElement<T> getDocumentRoot(final T object,
+                                                     final String namespaceURI,
+                                                     final String localPart,
+                                                     final String prefix) {
+
+        final QName qName = new QName(namespaceURI, localPart, prefix);
+        return new JAXBElement<T>(qName, (Class<T>) object.getClass(), object);
+    }
+
+    /**
+     * Creates a DocumentRoot-worthy JAXBElement holding the supplied single object
+     * and sporting the standard cobertura XML namespace URI, and the given localPart.
+     *
+     * @param object       The JAXB-annotated object to wrap in a JAXBElement.
+     * @param localPart    The XML localPart of the returned JAXBElement.
+     * @param <T>          The type of the object.
+     * @return a DocumentRoot-worthy JAXBElement holding the supplied single object.
+     */
+    public static <T> JAXBElement<T> getDocumentRoot(final T object,
+                                                     final String localPart) {
+        return getDocumentRoot(object, Namespace.COBERTURA_NAMESPACE, localPart, "unused");
+    }
+
+    public static <T> String marshal(final T toMarshal, final String elementName) {
+
+        StringWriter result;
+        try {
+            Marshaller marshaller = JaxbUtils.getHumanReadableMarshallerFor(toMarshal.getClass());
+            JAXBElement<T> rootElement = JaxbUtils.getDocumentRoot(toMarshal, elementName);
+
+            result = new StringWriter();
+            marshaller.marshal(rootElement, result);
+
+            // All Done
+            return result.toString();
+
+        } catch (JAXBException e) {
+            throw new RuntimeException("Could not marshal [" + elementName + "]", e);
+        }
+    }
+
+    public static <T> T unmarshalInstance(final String data, final Class<T> expectedType) {
+
+        try {
+            // Assume we should only unmarshal a single type.
+            final JAXBContext ctx = JAXBContext.newInstance(expectedType);
+            final Unmarshaller unmarshaller = ctx.createUnmarshaller();
+
+            // To ignore the namespace and xml element localPart,
+            // unmarshal the instance as a JAXBElement.
+            final StreamSource streamSource = new StreamSource(new StringReader(data));
+            final JAXBElement<T> jaxbElement = unmarshaller.unmarshal(streamSource, expectedType);
+
+            // All done.
+            return jaxbElement.getValue();
+
+        } catch (JAXBException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/coverage/CoverageRecordTest.java b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/coverage/CoverageRecordTest.java
new file mode 100644
index 0000000..826a6af
--- /dev/null
+++ b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/coverage/CoverageRecordTest.java
@@ -0,0 +1,164 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage;
+
+import net.sourceforge.cobertura.metrics.model.JaxbUtils;
+import net.sourceforge.cobertura.metrics.model.location.SourceLocation;
+import org.custommonkey.xmlunit.DetailedDiff;
+import org.custommonkey.xmlunit.Diff;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import se.jguru.nazgul.test.xmlbinding.XmlTestUtils;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class CoverageRecordTest {
+
+    // Shared state
+    private SourceLocation location1;
+    private SourceLocation location2;
+
+    @Before
+    public void setupSharedState() {
+
+        try {
+            location1 = getLocation(Rate.class.getMethod("toString", null), 122);
+            location2 = getLocation(SourceLocation.class.getMethod("toString", null), 145);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException("Could not create SourceLocations", e);
+        }
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+     public void validateExceptionOnNegativeLineNumber() {
+
+        // Act & Assert
+        new CoverageRecord(location1, -1);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void validateExceptionOnNullSourceLocation() {
+
+        // Act & Assert
+        new CoverageRecord(null, 145);
+    }
+
+    @Test
+    public void validateComparisonAndEquality() {
+
+        // Assemble
+        final CoverageRecord c1 = new CoverageRecord(location1, 5);
+        final CoverageRecord c2 = new CoverageRecord(location1, 5);
+        final CoverageRecord c3 = new CoverageRecord(location2, 3);
+        
+        // Act & Assert
+        Assert.assertNotEquals(c1, c3);
+        Assert.assertNotEquals(c1, c2);
+        Assert.assertNotSame(c1, c2);
+        Assert.assertEquals(0, c1.compareTo(c2));
+
+        Assert.assertFalse(c1.equals(null));
+        Assert.assertTrue(c1.equals(c1));
+        Assert.assertFalse(c1.equals(new Rate()));
+
+        Assert.assertEquals(0, c1.compareTo(c1));
+        Assert.assertEquals(0, c1.compareTo(c2));
+        Assert.assertEquals(Integer.MIN_VALUE, c1.compareTo(null));
+    }
+
+    @Test
+    public void validateStringForm() {
+
+        // Assemble
+        final String expected = "net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:122,segment:0";
+
+        // Act & Assert
+        Assert.assertEquals(expected, location1.toString());
+    }
+
+    @Test
+    public void validateHitCountArithmetics() {
+
+        // Assemble
+        final CoverageRecord unitUnderTest = new CoverageRecord(location1);
+
+        // Act
+        long hitCount1 = unitUnderTest.getHitCount();
+        unitUnderTest.addHit();
+        long hitCount2 = unitUnderTest.getHitCount();
+        unitUnderTest.addHits(3);
+        long hitCount3 = unitUnderTest.getHitCount();
+
+        // Assert
+        Assert.assertEquals(0, hitCount1);
+        Assert.assertEquals(1, hitCount2);
+        Assert.assertEquals(4, hitCount3);
+    }
+
+    @Test
+    public void validateMarshalling() throws Exception {
+
+        // Assemble
+        final CoverageRecord unitUnderTest = new CoverageRecord(location1, 5);
+        final String expected = XmlTestUtils.readFully("testdata/coverageRecord.xml");
+
+        // Act
+        final String result = JaxbUtils.marshal(unitUnderTest, "coverageRecord");
+        // System.out.println("Got: " + result);
+
+        // Assert
+        final Diff diff = XmlTestUtils.compareXmlIgnoringWhitespace(expected, result);
+        Assert.assertTrue("Detailed Diff: " + new DetailedDiff(diff), diff.identical());
+    }
+
+    @Test
+    public void validateUnmarshalling() throws Exception {
+
+        // Assemble
+        final CoverageRecord expected = new CoverageRecord(location1, 5);
+        final String data = XmlTestUtils.readFully("testdata/coverageRecord.xml");
+
+        // Act
+        final CoverageRecord unmarshalled = JaxbUtils.unmarshalInstance(data, CoverageRecord.class);
+
+        // Assert
+        Assert.assertNotNull(unmarshalled);
+        Assert.assertEquals(expected.toString(), unmarshalled.toString());
+        Assert.assertEquals(0, expected.compareTo(unmarshalled));
+    }
+
+    //
+    // Private helpers
+    //
+
+    private SourceLocation getLocation(final Method method, final int lineNumber) {
+
+        final String methodName = method.getName();
+        final String className = method.getDeclaringClass().getSimpleName();
+        final String packageName = method.getDeclaringClass().getPackage().getName();
+
+        // All Done.
+        return new SourceLocation(packageName, className, methodName, lineNumber, 0);
+    }
+}
diff --git a/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/coverage/RateTest.java b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/coverage/RateTest.java
new file mode 100644
index 0000000..3331b47
--- /dev/null
+++ b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/coverage/RateTest.java
@@ -0,0 +1,126 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.coverage;
+
+import net.sourceforge.cobertura.metrics.model.JaxbUtils;
+import org.custommonkey.xmlunit.DetailedDiff;
+import org.custommonkey.xmlunit.Diff;
+import org.junit.Assert;
+import org.junit.Test;
+import se.jguru.nazgul.test.xmlbinding.XmlTestUtils;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class RateTest {
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnEmptyType() {
+
+        // Act & Assert
+        new Rate(100, 10, "");
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void validateExceptionOnNullType() {
+
+        // Act & Assert
+        new Rate(100, 10, null);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnNegativeActual() {
+
+        // Act & Assert
+        new Rate(100, -10, "line_coverage");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnNegativeMax() {
+
+        // Act & Assert
+        new Rate(-100, 10, "line_coverage");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnMaxLesserThanActual() {
+
+        // Act & Assert
+        new Rate(5, 10, "line_coverage");
+    }
+
+    @Test
+    public void validateComparisonAndEquality() {
+
+        // Assemble
+        final int maximum = 100;
+        final int actual = 10;
+        final String type = "line_coverage";
+
+        final Rate rate1 = new Rate(maximum, actual, type);
+        final Rate rate2 = new Rate(maximum, actual, type);
+
+        // Act & Assert
+        Assert.assertEquals(rate1, rate2);
+        Assert.assertNotSame(rate1, rate2);
+        Assert.assertEquals(0, rate1.compareTo(rate2));
+
+        Assert.assertFalse(rate1.equals(null));
+        Assert.assertTrue(rate1.equals(rate1));
+        Assert.assertTrue(rate1.equals(rate2));
+        Assert.assertFalse(rate1.equals(new Rate()));
+
+        Assert.assertEquals(0, rate1.compareTo(rate1));
+        Assert.assertEquals(0, rate1.compareTo(rate2));
+        Assert.assertEquals(Integer.MIN_VALUE, rate1.compareTo(null));
+
+        Assert.assertEquals(rate1.hashCode(), rate2.hashCode());
+    }
+
+    @Test
+    public void validateStringForm() {
+
+        // Assemble
+        final int maximum = 100;
+        final int actual = 10;
+        final String type = "line_coverage";
+        final String expected = "Rate (" + type + "): [" + actual + "/" + maximum + "]";
+
+        final Rate rate1 = new Rate(maximum, actual, type);
+
+        // Act & Assert
+        Assert.assertEquals(expected, rate1.toString());
+    }
+
+    @Test
+    public void validateMarshalling() throws Exception {
+
+        // Assemble
+        final Rate unitUnderTest = new Rate(100, 10, "line_coverage");
+        final String expected = XmlTestUtils.readFully("testdata/rate.xml");
+
+        // Act
+        final String result = JaxbUtils.marshal(unitUnderTest, "rate");
+
+        // Assert
+        final Diff diff = XmlTestUtils.compareXmlIgnoringWhitespace(expected, result);
+        Assert.assertTrue("Detailed Diff: " + new DetailedDiff(diff), diff.identical());
+    }
+}
diff --git a/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/location/SourceLocationTest.java b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/location/SourceLocationTest.java
new file mode 100644
index 0000000..ba62ea1
--- /dev/null
+++ b/metrics/metrics-model/src/test/java/net/sourceforge/cobertura/metrics/model/location/SourceLocationTest.java
@@ -0,0 +1,164 @@
+/*
+ * #%L
+ * cobertura-metrics-model
+ * %%
+ * Copyright (C) 2013 Cobertura
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package net.sourceforge.cobertura.metrics.model.location;
+
+import net.sourceforge.cobertura.metrics.model.JaxbUtils;
+import net.sourceforge.cobertura.metrics.model.LocationScope;
+import net.sourceforge.cobertura.metrics.model.coverage.Rate;
+import org.custommonkey.xmlunit.DetailedDiff;
+import org.custommonkey.xmlunit.Diff;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import se.jguru.nazgul.test.xmlbinding.XmlTestUtils;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author <a href="mailto:lj at jguru.se">Lennart Jörelid</a>, jGuru Europe AB
+ */
+public class SourceLocationTest {
+
+    // Shared state
+    private String packageName;
+    private String className;
+    private String methodName;
+    private int lineNumber;
+    private int branchSegment;
+
+    @Before
+    public void setupSharedState() {
+
+        Method toStringMethod = null;
+        try {
+            toStringMethod = Rate.class.getMethod("toString", null);
+        } catch (NoSuchMethodException e) {
+            throw new IllegalStateException("Could not find toString() method in Rate class.", e);
+        }
+
+        methodName = toStringMethod.getName();
+        className = toStringMethod.getDeclaringClass().getSimpleName();
+        packageName = toStringMethod.getDeclaringClass().getPackage().getName();
+        lineNumber = 122;
+        branchSegment = 0;
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnEmptyPackageName() {
+
+        // Act & Assert
+        new SourceLocation("", className, methodName, lineNumber, branchSegment);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void validateExceptionOnNullPackageName() {
+
+        // Act & Assert
+        new SourceLocation(null, className, methodName, lineNumber, branchSegment);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnEmptyMethodName() {
+
+        // Act & Assert
+        new SourceLocation(packageName, className, "", lineNumber, branchSegment);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnNegativeLineNumber() {
+
+        // Act & Assert
+        new SourceLocation(packageName, className, methodName, -42, branchSegment);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validateExceptionOnNegativeBranchSegment() {
+
+        // Act & Assert
+        new SourceLocation(packageName, className, methodName, lineNumber, -4);
+    }
+
+    @Test
+    public void validateComparisonAndEquality() {
+
+        // Assemble
+        final SourceLocation sl1 = new SourceLocation(packageName, className, methodName, lineNumber, branchSegment);
+        final SourceLocation sl2 = new SourceLocation(packageName, className, methodName, lineNumber, branchSegment);
+
+        // Act & Assert
+        Assert.assertEquals(sl1, sl2);
+        Assert.assertNotSame(sl1, sl2);
+        Assert.assertEquals(0, sl1.compareTo(sl2));
+
+        Assert.assertFalse(sl1.equals(null));
+        Assert.assertTrue(sl1.equals(sl1));
+        Assert.assertTrue(sl1.equals(sl2));
+        Assert.assertFalse(sl1.equals(new Rate()));
+
+        Assert.assertEquals(0, sl1.compareTo(sl1));
+        Assert.assertEquals(0, sl1.compareTo(sl2));
+        Assert.assertEquals(Integer.MIN_VALUE, sl1.compareTo(null));
+
+        Assert.assertEquals(sl1.hashCode(), sl2.hashCode());
+    }
+
+    @Test
+    public void validateLocationScopeAddressing() {
+
+        // Assemble
+        final SourceLocation unitUnderTest = new SourceLocation(
+                packageName, className, methodName, lineNumber, branchSegment);
+
+        // Act & Assert
+        Assert.assertEquals(packageName, unitUnderTest.get(LocationScope.PACKAGE));
+        Assert.assertEquals(className, unitUnderTest.get(LocationScope.CLASS));
+        Assert.assertEquals(methodName, unitUnderTest.get(LocationScope.METHOD));
+        Assert.assertEquals(lineNumber, unitUnderTest.get(LocationScope.LINE));
+        Assert.assertEquals(branchSegment, unitUnderTest.get(LocationScope.SEGMENT));
+    }
+
+    @Test
+    public void validateStringForm() {
+
+        // Assemble
+        final String expected = "net.sourceforge.cobertura.metrics.model.coverage.Rate::toString,line:122,segment:0";
+        final SourceLocation sl1 = new SourceLocation(packageName, className, methodName, lineNumber, branchSegment);
+
+        // Act & Assert
+        Assert.assertEquals(expected, sl1.toString());
+    }
+
+    @Test
+    public void validateMarshalling() throws Exception {
+
+        // Assemble
+        final SourceLocation unitUnderTest = new SourceLocation(
+                packageName, className, methodName, lineNumber, branchSegment);
+        final String expected = XmlTestUtils.readFully("testdata/sourcelocation.xml");
+
+        // Act
+        final String result = JaxbUtils.marshal(unitUnderTest, "sourceLocation");
+        // System.out.println("Got: " + result);
+
+        // Assert
+        final Diff diff = XmlTestUtils.compareXmlIgnoringWhitespace(expected, result);
+        Assert.assertTrue("Detailed Diff: " + new DetailedDiff(diff), diff.identical());
+    }
+}
diff --git a/metrics/metrics-model/src/test/resources/logback-test.xml b/metrics/metrics-model/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..8fe6afd
--- /dev/null
+++ b/metrics/metrics-model/src/test/resources/logback-test.xml
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+  #%L
+  cobertura-metrics-model
+  %%
+  Copyright (C) 2013 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<configuration>
+
+    <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%c{1}::%M]: %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- By default, make the logging keep quiet -->
+    <root level="DEBUG">
+        <appender-ref ref="Stdout"/>
+    </root>
+
+    <!-- Lower the logging level for relevant classes -->
+    <logger name="net.sourceforge.cobertura" level="WARN"/>
+    <logger name="net.sourceforge.cobertura.metrics.model" level="DEBUG"/>
+
+    <!-- Make the frameworks shut up. -->
+    <logger name="org.springframework" level="WARN"/>
+
+</configuration>
diff --git a/metrics/metrics-model/src/test/resources/testdata/coverageRecord.xml b/metrics/metrics-model/src/test/resources/testdata/coverageRecord.xml
new file mode 100644
index 0000000..a723afb
--- /dev/null
+++ b/metrics/metrics-model/src/test/resources/testdata/coverageRecord.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  #%L
+  cobertura-metrics-model
+  %%
+  Copyright (C) 2013 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+<cobertura:coverageRecord hitCount="5" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+                          xmlns:core="http://www.jguru.se/nazgul/core" xmlns:cobertura="http://github.com/cobertura"
+                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <location lineNumber="122" branchSegment="0">
+        <packageName>net.sourceforge.cobertura.metrics.model.coverage</packageName>
+        <className>Rate</className>
+        <methodName>toString</methodName>
+    </location>
+</cobertura:coverageRecord>
diff --git a/metrics/metrics-model/src/test/resources/testdata/rate.xml b/metrics/metrics-model/src/test/resources/testdata/rate.xml
new file mode 100644
index 0000000..6eed994
--- /dev/null
+++ b/metrics/metrics-model/src/test/resources/testdata/rate.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  #%L
+  cobertura-metrics-model
+  %%
+  Copyright (C) 2013 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<cobertura:rate maximum="100" actual="10" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+                xmlns:core="http://www.jguru.se/nazgul/core" xmlns:cobertura="http://github.com/cobertura"
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <rateType>line_coverage</rateType>
+</cobertura:rate>
diff --git a/metrics/metrics-model/src/test/resources/testdata/sourcelocation.xml b/metrics/metrics-model/src/test/resources/testdata/sourcelocation.xml
new file mode 100644
index 0000000..e45bde5
--- /dev/null
+++ b/metrics/metrics-model/src/test/resources/testdata/sourcelocation.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  #%L
+  cobertura-metrics-model
+  %%
+  Copyright (C) 2013 Cobertura
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+<cobertura:sourceLocation lineNumber="122" branchSegment="0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+                          xmlns:core="http://www.jguru.se/nazgul/core" xmlns:cobertura="http://github.com/cobertura"
+                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <packageName>net.sourceforge.cobertura.metrics.model.coverage</packageName>
+    <className>Rate</className>
+    <methodName>toString</methodName>
+</cobertura:sourceLocation>
diff --git a/metrics/pom.xml b/metrics/pom.xml
new file mode 100644
index 0000000..7073f7a
--- /dev/null
+++ b/metrics/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>net.sourceforge.cobertura</groupId>
+        <artifactId>cobertura-reactor</artifactId>
+        <version>2.1.1</version>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.metrics</groupId>
+    <artifactId>cobertura-metrics-reactor</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>metrics</path.in.reactor>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Modules
+    ################################################
+    -->
+    <modules>
+        <module>metrics-model</module>
+        <module>metrics-api</module>
+    </modules>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e517a04
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,353 @@
+<?xml version="1.0" ?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>org.sonatype.oss</groupId>
+        <artifactId>oss-parent</artifactId>
+        <version>7</version>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura</groupId>
+    <artifactId>cobertura-reactor</artifactId>
+    <version>2.1.1</version>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+    <description>Cobertura checks and reports on test coverage in your code.</description>
+    <packaging>pom</packaging>
+    <inceptionYear>2013</inceptionYear>
+
+    <prerequisites>
+        <maven>3.0.5</maven>
+    </prerequisites>
+
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <organization>
+        <name>Cobertura</name>
+        <url>https://github.com/cobertura/cobertura</url>
+    </organization>
+
+    <developers>
+        <developer>
+            <id>schristou88</id>
+            <name>Steven Christou</name>
+            <email>schristou88 at gmail.com</email>
+            <roles>
+                <role>Developer</role>
+            </roles>
+            <timezone>+6</timezone>
+        </developer>
+        <developer>
+            <id>lj</id>
+            <name>Lennart Jörelid</name>
+            <email>lj at jguru.se</email>
+            <roles>
+                <role>Developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>dennisl</id>
+            <name>Dennis Lundberg</name>
+            <email>dennisl at apache.org</email>
+            <roles>
+                <role>Developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+    </developers>
+
+    <properties>
+        <!-- Build definition properties -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <jdk.version>1.6</jdk.version>
+
+        <!-- Code style properties -->
+        <wtp.version>2.0</wtp.version>
+        <clean.plugin.version>2.5</clean.plugin.version>
+        <maven-project-info-reports-plugin.version>2.7</maven-project-info-reports-plugin.version>
+
+        <!--
+            Define the URL prefixes for Site Deployment and DistributionManagement.
+            These can be overridden in sub-reactors to tailor releases to other locations.
+        -->
+        <path.in.reactor />
+        <reactor.name>cobertura</reactor.name>
+        <scm.host>github.com</scm.host>
+        <reactor.url.remote.prefix>http://${scm.host}/${reactor.name}</reactor.url.remote.prefix>
+        <site.url.prefix>scp://www-data@angmar/var/www/${reactor.name}</site.url.prefix>
+        <site.staging.localDirectory>/tmp/${reactor.name}</site.staging.localDirectory>
+        <url.prefix>${reactor.url.remote.prefix}/${reactor.name}/${project.version}</url.prefix>
+        <distro.url.prefix>${site.url.prefix}/${reactor.name}/${project.version}</distro.url.prefix>
+        <scm.conn>scm:git:git://${scm.host}/${reactor.name}/${reactor.name}</scm.conn>
+        <scm.devConnection>scm:git:git@${scm.host}:${reactor.name}/${reactor.name}.git</scm.devConnection>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Modules
+    ################################################
+    -->
+    <modules>
+        <module>codestyle</module>
+        <module>poms</module>
+        <module>interaction</module>
+        <module>conversion</module>
+        <module>metrics</module>
+        <module>cobertura</module>
+        <module>cobertura-runtime</module>
+    </modules>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+    <build>
+        <plugins>
+
+            <!--
+                Configures the release plugin.
+
+                Why:  Make the release plugin replace any information received from the Sonatype OSS parent.
+                Used: Release lifecycle, mvn release.
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-release-plugin</artifactId>
+                <version>2.5.1</version>
+                <configuration combine.self="override">
+                    <goals>deploy</goals>
+                    <localCheckout>true</localCheckout>
+                    <mavenExecutorId>forked-path</mavenExecutorId>
+                    <tagNameFormat>${reactor.name}-@{project.version}</tagNameFormat>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.scm</groupId>
+                        <artifactId>maven-scm-provider-hg</artifactId>
+                        <version>1.9.2</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.scm</groupId>
+                        <artifactId>maven-scm-provider-gitexe</artifactId>
+                        <version>1.9.2</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+
+            <!--
+                Configures the site plugin. Its use is further documented in the site documentation itself.
+
+                Why:  Make compile and publish the Nazgul documentation.
+                Used: Site lifecycle, mvn site.
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-site-plugin</artifactId>
+                <version>3.3</version>
+                <executions>
+                    <execution>
+                        <id>attach-descriptor</id>
+                        <goals>
+                            <goal>attach-descriptor</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <topSiteURL>${site.url.prefix}/${reactor.name}</topSiteURL>
+                    <stagingSiteURL>${site.url.prefix}/${reactor.name}</stagingSiteURL>
+                    <stagingDirectory>${site.staging.localDirectory}</stagingDirectory>
+                    <generateSitemap>true</generateSitemap>
+                    <inputEncoding>${project.build.sourceEncoding}</inputEncoding>
+                    <outputEncoding>${project.reporting.outputEncoding}</outputEncoding>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.wagon</groupId>
+                        <artifactId>wagon-ssh</artifactId>
+                        <version>2.4</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.wagon</groupId>
+                        <artifactId>wagon-file</artifactId>
+                        <version>2.4</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.doxia</groupId>
+                        <artifactId>doxia-module-markdown</artifactId>
+                        <version>1.5</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.doxia</groupId>
+                        <artifactId>doxia-module-xhtml</artifactId>
+                        <version>1.5</version>
+                    </dependency>
+                    <!--
+                        Reflow skin and dependencies.
+                    -->
+                    <!-- dependency>
+                        <groupId>lt.velykis.maven.skins</groupId>
+                        <artifactId>reflow-velocity-tools</artifactId>
+                        <version>1.0.0</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.velocity</groupId>
+                        <artifactId>velocity</artifactId>
+                        <version>1.7</version>
+                    </dependency -->
+                </dependencies>
+            </plugin>
+
+            <!--
+                Provides Plantuml integration into site deployments.
+
+                Why:  Convert Plantuml (*.puml) documents to png images, for use in site documentation.
+                Used: Site lifecycle, mvn site.
+            -->
+            <plugin>
+                <groupId>com.github.jeluard</groupId>
+                <artifactId>plantuml-maven-plugin</artifactId>
+                <version>7954</version>
+                <configuration>
+                    <sourceFiles>
+                        <directory>${basedir}</directory>
+                        <includes>
+                            <include>src/site/**/*.puml</include>
+                        </includes>
+                    </sourceFiles>
+                    <outputDirectory>${project.build.directory}/site/images/plantuml</outputDirectory>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>generate-plantuml-diagrams</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <phase>pre-site</phase>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>net.sourceforge.plantuml</groupId>
+                        <artifactId>plantuml</artifactId>
+                        <version>7985</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <excludeDefaults>true</excludeDefaults>
+        <outputDirectory>${project.build.directory}/site</outputDirectory>
+        <plugins>
+
+            <!--
+                Configures the projects-info-reports plugin.
+
+                Why:  Reduce the time consumed considerably by removing the need to acquire
+                      dependency details and locations.
+                Used: Site lifecycle, mvn site.
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+                <version>${maven-project-info-reports-plugin.version}</version>
+                <configuration>
+                    <dependencyDetailsEnabled>false</dependencyDetailsEnabled>
+                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+                </configuration>
+            </plugin>
+        </plugins>
+    </reporting>
+
+    <profiles>
+
+        <!--
+            Use GPG to sign artifacts during release:perform.
+
+            Why:  Makes the releases traceable to their originator. Required by maven central and Sonatype OSS.
+            Used: Standard lifecycle, mvn release.
+        -->
+        <profile>
+            <id>release-sign-artifacts</id>
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.4</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+
+    <!--
+        Define the issue management system.
+    -->
+    <issueManagement>
+        <system>github</system>
+        <url>${reactor.url.remote.prefix}/${reactor.name}/issues</url>
+    </issueManagement>
+
+    <!--
+        Define repository settings for Maven's deploy and release plugins.
+        To comply with Maven standards, the repository definitions should
+        go in the settings.xml file, rather than into the POM.
+
+        This leaves the site URL mechanics in the POM to cater for staging
+        and deploying sites.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+</project>
diff --git a/poms/cobertura-api-parent/pom.xml b/poms/cobertura-api-parent/pom.xml
new file mode 100644
index 0000000..cf0e2f2
--- /dev/null
+++ b/poms/cobertura-api-parent/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>net.sourceforge.cobertura.poms</groupId>
+        <artifactId>cobertura-parent</artifactId>
+        <version>2.1.1</version>
+        <relativePath>../cobertura-parent</relativePath>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.poms</groupId>
+    <artifactId>cobertura-api-parent</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>poms/cobertura-api-parent</path.in.reactor>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Dependency (management) settings
+    ################################################
+    -->
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+    <build>
+        <plugins>
+
+            <!--
+                Ensure that all packages are exported; this is an API project.
+            -->
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Export-Package>{local-packages}</Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+
+    <!--
+        Define repository settings for Maven's deploy and release plugins.
+        To comply with Maven standards, the repository definitions should
+        go in the settings.xml file, rather than into the POM.
+
+        This leaves the site URL mechanics in the POM to cater for staging
+        and deploying sites.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+</project>
diff --git a/poms/cobertura-parent/pom.xml b/poms/cobertura-parent/pom.xml
new file mode 100644
index 0000000..9aaed6b
--- /dev/null
+++ b/poms/cobertura-parent/pom.xml
@@ -0,0 +1,1776 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>org.sonatype.oss</groupId>
+        <artifactId>oss-parent</artifactId>
+        <version>7</version>
+        <relativePath />
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.poms</groupId>
+    <artifactId>cobertura-parent</artifactId>
+    <version>2.1.1</version>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+    <inceptionYear>2013</inceptionYear>
+    <description>Cobertura checks and reports on test coverage in your code.</description>
+
+    <organization>
+        <name>Cobertura</name>
+        <url>https://github.com/cobertura/cobertura</url>
+    </organization>
+
+    <prerequisites>
+        <maven>3.0.5</maven>
+    </prerequisites>
+
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <id>schristou88</id>
+            <name>Steven Christou</name>
+            <email>schristou88 at gmail.com</email>
+            <roles>
+                <role>Developer</role>
+            </roles>
+            <timezone>+6</timezone>
+        </developer>
+        <developer>
+            <id>lj</id>
+            <name>Lennart Jörelid</name>
+            <email>lj at jguru.se</email>
+            <roles>
+                <role>Developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+    </developers>
+
+    <properties>
+        <!-- Build-controlling properties -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <build.number />
+        <artifact.distribution.directory>${project.build.outputDirectory}</artifact.distribution.directory>
+        <check.plugins.phase>package</check.plugins.phase>
+        <jdk.version>1.6</jdk.version>
+
+        <!-- Version number properties -->
+        <maven.version>3.0.4</maven.version>
+        <openjpa.version>2.3.0</openjpa.version>
+        <activemq.version>5.9.0</activemq.version>
+        <maven.release.plugin.version>2.5.1</maven.release.plugin.version>
+        <aspectj.runtime.version>1.7.4</aspectj.runtime.version>
+        <aspectj-maven-plugin.version>1.5</aspectj-maven-plugin.version>
+        <osgiVersion>4.3.1</osgiVersion>
+        <scalaplugin.version>2.15.2</scalaplugin.version>
+        <slf4j.version>1.7.5</slf4j.version>
+        <maven-project-info-reports-plugin.version>2.7</maven-project-info-reports-plugin.version>
+        <dependency.plugin.version>2.8</dependency.plugin.version>
+        <asm.version>4.2</asm.version>
+
+        <!-- Code style properties -->
+        <skip.verify.code>false</skip.verify.code>
+
+        <!-- Enforcer configuration parameters -->
+        <enforcer.includedGroupIdPatterns>^net\\.sourceforge\\.cobertura\\..*</enforcer.includedGroupIdPatterns>
+        <enforcer.excludedGroupIdPatterns>^net\\.sourceforge\\.cobertura\\..*\\.generated\\..*
+        </enforcer.excludedGroupIdPatterns>
+
+        <!-- Checkstyle configuration parameters. -->
+        <checkstyle.plugin.version>2.11</checkstyle.plugin.version>
+        <checkstyle.config.location>codestyle/cobertura/checkstyle.xml</checkstyle.config.location>
+        <checkstyle.suppressions.location>codestyle/cobertura/checkstyle-suppressions.xml
+        </checkstyle.suppressions.location>
+        <checkstyle.violationSeverity>error</checkstyle.violationSeverity>
+
+        <!-- PMD configuration parameters. -->
+        <pmd.plugin.version>3.0.1</pmd.plugin.version>
+        <pmd.ruleset>/codestyle/cobertura/pmd-rules.xml</pmd.ruleset>
+
+        <!-- Findbugs configuration parameters. -->
+        <findbugs.plugin.version>2.5.2</findbugs.plugin.version>
+        <findbugs.only.analyze>net.sourceforge.cobertura.*</findbugs.only.analyze>
+        <findbugs.includeFilterFile>codestyle/cobertura/findbugs.xml</findbugs.includeFilterFile>
+        <findbugs.excludeFilterFile>codestyle/cobertura/findbugs-excludes.xml</findbugs.excludeFilterFile>
+
+        <!-- Surefire configuration parameters. -->
+        <surefire.argLine>-Dfile.encoding=UTF-8 -Xmx1024m -XX:MaxPermSize=512m</surefire.argLine>
+
+        <!-- License plugin configuration parameters. -->
+        <license.id>apache_v2</license.id>
+        <license.licenseResolver>classpath://codestyle/license</license.licenseResolver>
+
+        <!-- Define code-breaking constants -->
+        <breakOnFailure.checkstyle>true</breakOnFailure.checkstyle>
+        <breakOnFailure.pmd>true</breakOnFailure.pmd>
+        <breakOnFailure.enforcer>true</breakOnFailure.enforcer>
+        <breakOnFailure.license>true</breakOnFailure.license>
+
+        <!--
+            Define the URL prefixes for Site Deployment and DistributionManagement.
+            These can be overridden in sub-reactors to tailor releases to other locations.
+        -->
+        <path.in.reactor>poms/cobertura-parent</path.in.reactor>
+        <reactor.name>cobertura</reactor.name>
+        <scm.host>github.com</scm.host>
+        <reactor.url.remote.prefix>http://${scm.host}/${reactor.name}</reactor.url.remote.prefix>
+        <site.url.prefix>scp://www-data@angmar/var/www/${reactor.name}</site.url.prefix>
+        <site.staging.localDirectory>/tmp/${reactor.name}</site.staging.localDirectory>
+        <url.prefix>${reactor.url.remote.prefix}/${reactor.name}/${project.version}</url.prefix>
+        <distro.url.prefix>${site.url.prefix}/${reactor.name}/${project.version}</distro.url.prefix>
+        <scm.conn>scm:git:git://${scm.host}/${reactor.name}/${reactor.name}</scm.conn>
+        <scm.devConnection>scm:git:git@${scm.host}:${reactor.name}/${reactor.name}.git</scm.devConnection>
+        <nazgul-tools.version>2.0.9</nazgul-tools.version>
+        <nazgul-core.version>1.6.0</nazgul-core.version>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Dependency (management) settings
+    ################################################
+    -->
+    <dependencyManagement>
+        <dependencies>
+            <!--
+                Logging dependencies.
+            -->
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-classic</artifactId>
+                <version>1.0.13</version>
+            </dependency>
+
+            <!--
+                ASM dependencies.
+            -->
+            <dependency>
+                <groupId>org.ow2.asm</groupId>
+                <artifactId>asm</artifactId>
+                <version>${asm.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ow2.asm</groupId>
+                <artifactId>asm-tree</artifactId>
+                <version>${asm.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ow2.asm</groupId>
+                <artifactId>asm-commons</artifactId>
+                <version>${asm.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ow2.asm</groupId>
+                <artifactId>asm-util</artifactId>
+                <version>${asm.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ow2.asm</groupId>
+                <artifactId>asm-analysis</artifactId>
+                <version>${asm.version}</version>
+            </dependency>
+
+            <!--
+                Persistence and JPA jars
+            -->
+            <dependency>
+                <groupId>org.apache.geronimo.specs</groupId>
+                <artifactId>geronimo-jpa_2.0_spec</artifactId>
+                <version>1.1</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.openjpa</groupId>
+                <artifactId>openjpa</artifactId>
+                <version>${openjpa.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>se.jguru.nazgul.core.xmlbinding.spi.jaxb</groupId>
+                <artifactId>nazgul-core-xmlbinding-spi-jaxb</artifactId>
+                <version>${nazgul-core.version}</version>
+            </dependency>
+
+            <!--
+                AOP dependencies.
+            -->
+            <dependency>
+                <groupId>org.aspectj</groupId>
+                <artifactId>aspectjrt</artifactId>
+                <version>${aspectj.runtime.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.aspectj</groupId>
+                <artifactId>aspectjtools</artifactId>
+                <version>${aspectj.runtime.version}</version>
+            </dependency>
+
+            <!--
+                Messaging dependencies
+            -->
+            <dependency>
+                <groupId>org.apache.activemq</groupId>
+                <artifactId>activemq-osgi</artifactId>
+                <version>${activemq.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.activemq</groupId>
+                <artifactId>activemq-camel</artifactId>
+                <version>${activemq.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.activemq</groupId>
+                <artifactId>activemq-all</artifactId>
+                <version>${activemq.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.activemq</groupId>
+                <artifactId>activemq-pool</artifactId>
+                <version>${activemq.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.jms</groupId>
+                <artifactId>jms</artifactId>
+                <version>1.1</version>
+            </dependency>
+
+            <!--
+                OSGi dependencies
+            -->
+            <dependency>
+                <groupId>org.osgi</groupId>
+                <artifactId>org.osgi.core</artifactId>
+                <version>${osgiVersion}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.osgi</groupId>
+                <artifactId>org.osgi.compendium</artifactId>
+                <version>${osgiVersion}</version>
+            </dependency>
+
+            <!--
+                Ambiguous dependencies.
+            -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>3.1</version>
+            </dependency>
+            <dependency>
+                <groupId>joda-time</groupId>
+                <artifactId>joda-time</artifactId>
+                <version>2.3</version>
+            </dependency>
+
+            <!--
+               Test framework dependencies
+            -->
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <scope>test</scope>
+                <version>4.11</version>
+            </dependency>
+            <dependency>
+                <groupId>org.dbunit</groupId>
+                <artifactId>dbunit</artifactId>
+                <version>2.4.9</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-all</artifactId>
+                <version>1.9.5</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>se.jguru.nazgul.test.xmlbinding</groupId>
+                <artifactId>nazgul-core-xmlbinding-test</artifactId>
+                <version>${nazgul-core.version}</version>
+                <scope>test</scope>
+            </dependency>
+
+            <!--
+               JEE dependencies
+            -->
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>servlet-api</artifactId>
+                <version>2.5</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>javax.transaction</groupId>
+                <artifactId>transaction-api</artifactId>
+                <version>1.1-rev-1</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>javax.xml.bind</groupId>
+                <artifactId>jaxb-api</artifactId>
+                <version>2.2.11</version>
+            </dependency>
+
+            <!--
+                Algorithm dependencies
+            -->
+            <dependency>
+                <groupId>se.jguru.nazgul.core.algorithms.api</groupId>
+                <artifactId>nazgul-core-algorithms-api</artifactId>
+                <version>${nazgul-core.version}</version>
+            </dependency>
+
+            <!--
+               Adapter dependencies
+            -->
+            <dependency>
+                <groupId>org.apache.axis2</groupId>
+                <artifactId>axis2-kernel</artifactId>
+                <version>1.6.2</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-pool</groupId>
+                <artifactId>commons-pool</artifactId>
+                <version>1.6</version>
+            </dependency>
+            <dependency>
+                <groupId>cglib</groupId>
+                <artifactId>cglib-nodep</artifactId>
+                <version>3.0</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+    <build>
+        <pluginManagement>
+            <plugins>
+
+                <!--
+                    Provides Plantuml integration into site deployments.
+
+                    Why:  Convert Plantuml documents to png images.
+                    Used: Site lifecycle, mvn site.
+                -->
+                <plugin>
+                    <groupId>com.github.jeluard</groupId>
+                    <artifactId>plantuml-maven-plugin</artifactId>
+                    <version>7954</version>
+                    <configuration>
+                        <sourceFiles>
+                            <directory>${basedir}</directory>
+                            <includes>
+                                <include>src/site/**/*.puml</include>
+                            </includes>
+                        </sourceFiles>
+                        <outputDirectory>${project.build.directory}/site/images/plantuml</outputDirectory>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <id>generate-plantuml-diagrams</id>
+                            <goals>
+                                <goal>generate</goal>
+                            </goals>
+                            <phase>pre-site</phase>
+                        </execution>
+                    </executions>
+                    <dependencies>
+                        <dependency>
+                            <groupId>net.sourceforge.plantuml</groupId>
+                            <artifactId>plantuml</artifactId>
+                            <version>7985</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+                <!--
+                    Use the latest maven-clean-plugin.
+
+                    Why:  Override the version in Maven's super pom.xml.
+                    Used: Clean lifecycle
+                -->
+                <plugin>
+                    <artifactId>maven-clean-plugin</artifactId>
+                    <version>2.5</version>
+                    <configuration>
+                        <excludeDefaultDirectories>true</excludeDefaultDirectories>
+                        <filesets>
+                            <fileset>
+                                <directory>${project.build.directory}</directory>
+                                <excludes>
+                                    <exclude>generated-resources/eclipse/**</exclude>
+                                </excludes>
+                            </fileset>
+                        </filesets>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Configure/define a lightweight JPA provider.
+
+                    Why:  Use in production or unit tests.
+                    Used: Standard lifecycle
+                -->
+                <plugin>
+                    <groupId>org.apache.openjpa</groupId>
+                    <artifactId>openjpa-maven-plugin</artifactId>
+                    <version>${openjpa.version}</version>
+                    <configuration>
+                        <includes>no/classes/included/automatically/*.class</includes>
+                        <addDefaultConstructor>true</addDefaultConstructor>
+                        <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
+                        <schemaFile>${project.build.directory}/${project.artifactId}-schema.xml</schemaFile>
+                        <sqlFile>${project.build.directory}/${project.artifactId}-database.sql</sqlFile>
+                    </configuration>
+
+                    <!--
+                        These Executions should not be enabled in this parent pom.
+                        Instead, they are left as examples of copy/paste for when
+                        this definition should be used within poms in subprojects.
+
+                        // Lennart Jorelid, 2010-09-15
+                    -->
+                    <!-- executions>
+                       <execution>
+                           <id>enhance-classes</id>
+                           <phase>process-classes</phase>
+                           <goals>
+                               <goal>enhance</goal>
+                           </goals>
+                       </execution>
+                       <execution>
+                           <id>enhance-test-classes</id>
+                           <phase>process-test-classes</phase>
+                           <goals>
+                               <goal>test-enhance</goal>
+                           </goals>
+                       </execution>
+                       <execution>
+                           <id>build-schema-and-sql-files</id>
+                           <phase>process-classes</phase>
+                           <goals>
+                               <goal>sql</goal>
+                               <goal>schema</goal>
+                           </goals>
+                       </execution>
+                   </executions -->
+
+                    <dependencies>
+                        <dependency>
+                            <groupId>org.apache.openjpa</groupId>
+                            <artifactId>openjpa</artifactId>
+                            <version>${openjpa.version}</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+                <!--
+                    This is not a proper maven plugin configuration, but instead Eclipse metadata for M2E.
+
+                    Why:  Eclipse metadata for M2E lifecycle mappings
+                    Used: Only by Eclipse; neither used by Maven nor any other IDE.
+                -->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.codehaus.mojo</groupId>
+                                        <artifactId>license-maven-plugin</artifactId>
+                                        <goals>
+                                            <goal>check-file-header</goal>
+                                            <goal>update-project-license</goal>
+                                        </goals>
+                                        <versionRange>[1.4,2)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <execute>
+                                            <runOnConfiguration>true</runOnConfiguration>
+                                            <runOnIncremental>false</runOnIncremental>
+                                        </execute>
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-ear-plugin</artifactId>
+                                        <goals>
+                                            <goal>ear</goal>
+                                            <goal>generate-application-xml</goal>
+                                        </goals>
+                                        <versionRange>2.5</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.codehaus.mojo</groupId>
+                                        <artifactId>buildnumber-maven-plugin</artifactId>
+                                        <goals>
+                                            <goal>create-timestamp</goal>
+                                        </goals>
+                                        <versionRange>[0.0,)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.codehaus.mojo</groupId>
+                                        <artifactId>build-helper-maven-plugin</artifactId>
+                                        <versionRange>[1.0,)</versionRange>
+                                        <goals>
+                                            <goal>add-source</goal>
+                                            <goal>add-test-source</goal>
+                                            <goal>add-resource</goal>
+                                            <goal>add-test-resource</goal>
+                                            <goal>maven-version</goal>
+                                            <goal>parse-version</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <execute>
+                                            <runOnConfiguration>true</runOnConfiguration>
+                                            <runOnIncremental>true</runOnIncremental>
+                                        </execute>
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-dependency-plugin</artifactId>
+                                        <goals>
+                                            <goal>list</goal>
+                                            <goal>copy</goal>
+                                            <goal>copy-dependencies</goal>
+                                            <goal>unpack</goal>
+                                        </goals>
+                                        <versionRange>[0.0,)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.zeroturnaround</groupId>
+                                        <artifactId>jrebel-maven-plugin</artifactId>
+                                        <goals>
+                                            <goal>generate</goal>
+                                        </goals>
+                                        <versionRange>[0.0,)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.codehaus.mojo</groupId>
+                                        <artifactId>gwt-maven-plugin</artifactId>
+                                        <goals>
+                                            <goal>resources</goal>
+                                            <goal>compile</goal>
+                                            <goal>i18n</goal>
+                                            <goal>generateAsync</goal>
+                                        </goals>
+                                        <versionRange>[0.0,)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.codehaus.mojo</groupId>
+                                        <artifactId>aspectj-maven-plugin</artifactId>
+                                        <versionRange>[1.0,)</versionRange>
+                                        <goals>
+                                            <goal>test-compile</goal>
+                                            <goal>compile</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <execute />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-war-plugin</artifactId>
+                                        <versionRange>[2.3,)</versionRange>
+                                        <goals>
+                                            <goal>exploded</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <execute />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-enforcer-plugin</artifactId>
+                                        <goals>
+                                            <goal>enforce</goal>
+                                        </goals>
+                                        <versionRange>[1.0.0,)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.servicemix.tooling</groupId>
+                                        <artifactId>depends-maven-plugin</artifactId>
+                                        <goals>
+                                            <goal>generate-depends-file</goal>
+                                        </goals>
+                                        <versionRange>[1.2,)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.openjpa</groupId>
+                                        <artifactId>openjpa-maven-plugin</artifactId>
+                                        <goals>
+                                            <goal>enhance</goal>
+                                            <goal>test-enhance</goal>
+                                        </goals>
+                                        <versionRange>[1.2,)</versionRange>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Define OSGi bundle plugin version.
+
+                    Why:  Plugin used to generate OSGi Manifest headers in JARs.
+                    Used: As included in [sub]projects.
+                -->
+                <plugin>
+                    <groupId>org.apache.felix</groupId>
+                    <artifactId>maven-bundle-plugin</artifactId>
+                    <version>2.4.0</version>
+                    <executions>
+                        <execution>
+                            <id>bundle-manifest</id>
+                            <phase>process-classes</phase>
+                            <goals>
+                                <goal>manifest</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <supportedProjectTypes>
+                            <supportedProjectType>ejb</supportedProjectType>
+                            <supportedProjectType>jar</supportedProjectType>
+                            <supportedProjectType>bundle</supportedProjectType>
+                            <supportedProjectType>war</supportedProjectType>
+                            <supportedProjectType>ear</supportedProjectType>
+                        </supportedProjectTypes>
+                        <instructions>
+                            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        </instructions>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Define JAXB2 plugin version.
+
+                    Why:  Plugin used to handle Java <-> XML <-> XSD production [in Model projects].
+                    Used: As included in entity model [sub]projects.
+                -->
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>jaxb2-maven-plugin</artifactId>
+                    <version>1.5</version>
+                </plugin>
+
+                <!--
+                    Use same release tags for all projects within a release.
+
+                    Why:  Include some DVCS SCM providers, and define some default values for releases.
+                    Used: Standard lifecycle, release process.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>${maven.release.plugin.version}</version>
+                    <configuration combine.self="override">
+                        <goals>deploy</goals>
+                        <localCheckout>true</localCheckout>
+                        <mavenExecutorId>forked-path</mavenExecutorId>
+                        <tagNameFormat>${reactor.name}-@{project.version}</tagNameFormat>
+                    </configuration>
+                    <dependencies>
+                        <dependency>
+                            <groupId>org.apache.maven.scm</groupId>
+                            <artifactId>maven-scm-provider-hg</artifactId>
+                            <version>1.9.2</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+                <!--
+                    Configures the WAR plugin to properly use the generated OSGi-compliant manifest.
+
+                    Why:  Assigns some manifest data within the WARs in WAR projects. Reads bundle-generated manifest.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-war-plugin</artifactId>
+                    <version>2.4</version>
+                    <configuration>
+                        <archive>
+                            <manifest>
+                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                            </manifest>
+                            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+                            <manifestEntries>
+                                <name>${project.name}</name>
+                                <description>${project.description}</description>
+                                <groupId>${project.groupId}</groupId>
+                                <artifactId>${project.artifactId}</artifactId>
+                            </manifestEntries>
+                        </archive>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Configure EAR plugin, directs all normal dependencies in the /lib directory.
+
+                    Why:  Assigns some manifest data within JARs.
+                          Reads bundle-generated manifest. Uses JEE 6 style EARs.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-ear-plugin</artifactId>
+                    <version>2.8</version>
+                    <executions>
+                        <execution>
+                            <id>packageEar</id>
+                            <goals>
+                                <goal>generate-application-xml</goal>
+                                <goal>ear</goal>
+                            </goals>
+                            <configuration>
+                                <defaultJavaBundleDir>lib</defaultJavaBundleDir>
+                                <defaultLibBundleDir>lib</defaultLibBundleDir>
+                                <version>6</version>
+                                <archive>
+                                    <manifest>
+                                        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                                    </manifest>
+                                    <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+                                    <manifestEntries>
+                                        <name>${project.name}</name>
+                                        <description>${project.description}</description>
+                                        <groupId>${project.groupId}</groupId>
+                                        <artifactId>${project.artifactId}</artifactId>
+                                    </manifestEntries>
+                                </archive>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+
+                <!--
+                    Configure EJB plugin, uses EJB version 3.1 by default.
+
+                    Why:  Assigns some manifest data within JARs. Reads bundle-generated manifest.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-ejb-plugin</artifactId>
+                    <version>2.3</version>
+                    <configuration>
+                        <generateClient>false</generateClient>
+                        <ejbVersion>3.1</ejbVersion>
+                        <detail>true</detail>
+                        <archive>
+                            <manifest>
+                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                            </manifest>
+                            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+                            <manifestEntries>
+                                <description>${project.description}</description>
+                                <groupId>${project.groupId}</groupId>
+                                <artifactId>${project.artifactId}</artifactId>
+                            </manifestEntries>
+                        </archive>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Configure JAR plugin.
+
+                    Why:  Assigns some manifest data within JARs. Reads bundle-generated manifest.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>2.4</version>
+                    <configuration>
+                        <archive>
+                            <manifest>
+                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                            </manifest>
+                            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+                            <manifestEntries>
+                                <name>${project.name}</name>
+                                <description>${project.description}</description>
+                                <groupId>${project.groupId}</groupId>
+                                <artifactId>${project.artifactId}</artifactId>
+                            </manifestEntries>
+                        </archive>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Configure Compiler plugin.
+
+                    Why:  Ensures source and target Java versions, as well as source encoding (UTF-8).
+                    Used: Standard lifecycle, mvn compile.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.1</version>
+                    <configuration>
+                        <source>${jdk.version}</source>
+                        <target>${jdk.version}</target>
+                        <showWarnings>true</showWarnings>
+                        <showDeprecation>true</showDeprecation>
+                        <encoding>${project.build.sourceEncoding}</encoding>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Define deploy plugin version.
+
+                    Why:  Version definition only.
+                    Used: Standard lifecycle, mvn deploy
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>2.8.1</version>
+                </plugin>
+
+                <!--
+                    Define project-info-reports plugin version, and reduce the time taken to run it.
+
+                    Why:  Version definition only.
+                    Used: Standard lifecycle, mvn site.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-project-info-reports-plugin</artifactId>
+                    <version>${maven-project-info-reports-plugin.version}</version>
+                    <configuration>
+                        <dependencyDetailsEnabled>false</dependencyDetailsEnabled>
+                        <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Configures the maven resources plugin.
+
+                    Why:  Ensures that all resources are handled using the standard source encoding.
+                    Used: Standard lifecycle, mvn process-resources.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>2.6</version>
+                    <configuration>
+                        <encoding>${project.build.sourceEncoding}</encoding>
+                        <escapeString>\</escapeString>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Analyzes imported dependencies.
+
+                    Why:  Provide warnings when imported dependencies are not used within the project.
+                    Used: Standard lifecycle.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <version>${dependency.plugin.version}</version>
+                </plugin>
+
+                <!--
+                    Configures the maven surefire plugin, which runs the unit tests invoking JUnit.
+                    Surefire's argument line is overridable in subprojects using the property "surefire.argLine".
+
+                    Why:  Supply required encoding (UTF-8), as well as memory sizing definitions.
+                    Used: Standard lifecycle, mvn test.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.16</version>
+                    <configuration>
+                        <argLine>${surefire.argLine}</argLine>
+                        <trimStackTrace>false</trimStackTrace>
+                    </configuration>
+                </plugin>
+
+                <!--
+                    Define source plugin version, which generates source:jars.
+
+                    Why:  Version definition only.
+                    Used: Standard lifecyle, mvn source:jar.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>2.2.1</version>
+                </plugin>
+
+                <!--
+                    Configures the site plugin to properly cope with link relativization, staging and deployment
+                    in a controlled and extensible manner.
+
+                    Why:  Generates site documentation. Adds wagon remote deployment capability.
+                    Used: Standard lifecycle, mvn site, mvn site:stage.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-site-plugin</artifactId>
+                    <version>3.3</version>
+                    <executions>
+                        <execution>
+                            <id>attach-descriptor</id>
+                            <goals>
+                                <goal>attach-descriptor</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <topSiteURL>${site.url.prefix}/${reactor.name}</topSiteURL>
+                        <stagingSiteURL>${site.url.prefix}/${reactor.name}</stagingSiteURL>
+                        <stagingDirectory>${site.staging.localDirectory}</stagingDirectory>
+                        <generateSitemap>true</generateSitemap>
+                        <inputEncoding>${project.build.sourceEncoding}</inputEncoding>
+                        <outputEncoding>${project.reporting.outputEncoding}</outputEncoding>
+                    </configuration>
+                    <dependencies>
+                        <dependency>
+                            <groupId>org.apache.maven.wagon</groupId>
+                            <artifactId>wagon-ssh</artifactId>
+                            <version>2.2</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.apache.maven.wagon</groupId>
+                            <artifactId>wagon-file</artifactId>
+                            <version>2.4</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.apache.maven.doxia</groupId>
+                            <artifactId>doxia-module-confluence</artifactId>
+                            <version>1.5</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.apache.maven.doxia</groupId>
+                            <artifactId>doxia-module-markdown</artifactId>
+                            <version>1.5</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.apache.maven.doxia</groupId>
+                            <artifactId>doxia-module-xhtml</artifactId>
+                            <version>1.5</version>
+                        </dependency>
+                        <!--
+                            Reflow skin and dependencies.
+                        -->
+                        <!-- dependency>
+                            <groupId>lt.velykis.maven.skins</groupId>
+                            <artifactId>reflow-velocity-tools</artifactId>
+                            <version>1.0.0</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.apache.velocity</groupId>
+                            <artifactId>velocity</artifactId>
+                            <version>1.7</version>
+                        </dependency -->
+                    </dependencies>
+                </plugin>
+
+                <!--
+                    Provides PMD code-style checking integration into the project.
+
+                    Why:  Validates the codestyle.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-pmd-plugin</artifactId>
+                    <version>${pmd.plugin.version}</version>
+                    <configuration>
+                        <skip>${skip.verify.code}</skip>
+                        <targetJdk>${jdk.version}</targetJdk>
+                        <rulesets>
+                            <ruleset>${pmd.ruleset}</ruleset>
+                        </rulesets>
+                        <printFailingErrors>true</printFailingErrors>
+                        <failOnViolation>${breakOnFailure.pmd}</failOnViolation>
+                        <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>check</goal>
+                                <goal>cpd-check</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <dependencies>
+                        <dependency>
+                            <groupId>se.jguru.nazgul.tools.codestyle</groupId>
+                            <artifactId>nazgul-codestyle</artifactId>
+                            <version>${nazgul-tools.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>net.sourceforge.cobertura.codestyle</groupId>
+                            <artifactId>cobertura-codestyle</artifactId>
+                            <version>2.1.1</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>log4j</groupId>
+                            <artifactId>log4j</artifactId>
+                            <version>1.2.17</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+                <!--
+                    Enforces the defined code style, as provided within the codestyle project.
+
+                    Why:  Validates the codestyle.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-checkstyle-plugin</artifactId>
+                    <version>${checkstyle.plugin.version}</version>
+                    <configuration>
+                        <skip>${skip.verify.code}</skip>
+                        <configLocation>${checkstyle.config.location}</configLocation>
+                        <suppressionsFile>${checkstyle.suppressions.location}</suppressionsFile>
+                        <failOnViolation>${breakOnFailure.checkstyle}</failOnViolation>
+                        <violationSeverity>${checkstyle.violationSeverity}</violationSeverity>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <id>verify</id>
+                            <phase>${check.plugins.phase}</phase>
+                            <goals>
+                                <goal>check</goal>
+                            </goals>
+                        </execution>
+                        <execution>
+                            <id>report</id>
+                            <goals>
+                                <goal>checkstyle</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <dependencies>
+                        <dependency>
+                            <groupId>se.jguru.nazgul.tools.codestyle</groupId>
+                            <artifactId>nazgul-codestyle</artifactId>
+                            <version>${nazgul-tools.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>net.sourceforge.cobertura.codestyle</groupId>
+                            <artifactId>cobertura-codestyle</artifactId>
+                            <version>2.1.1</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+                <!--
+                    Finds bugs in the code, as configured within the codestyle project.
+
+                    Why:  Finds bugs in the local project.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>findbugs-maven-plugin</artifactId>
+                    <version>${findbugs.plugin.version}</version>
+                    <configuration>
+                        <skip>${skip.verify.code}</skip>
+                        <threshold>High</threshold>
+                        <effort>Default</effort>
+                        <onlyAnalyze>${findbugs.only.analyze}</onlyAnalyze>
+                        <includeFilterFile>${findbugs.includeFilterFile}</includeFilterFile>
+                        <excludeFilterFile>${findbugs.excludeFilterFile}</excludeFilterFile>
+                        <relaxed>false</relaxed>
+                        <findbugsXmlOutput>true</findbugsXmlOutput>
+                        <xmlOutput>true</xmlOutput>
+                    </configuration>
+                    <dependencies>
+                        <dependency>
+                            <groupId>se.jguru.nazgul.tools.codestyle</groupId>
+                            <artifactId>nazgul-codestyle</artifactId>
+                            <version>${nazgul-tools.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>net.sourceforge.cobertura.codestyle</groupId>
+                            <artifactId>cobertura-codestyle</artifactId>
+                            <version>2.1.1</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+                <!--
+                    The license plugin is quite inflexible about the format for the injected/detected file header
+                    in terms of license structure. Use it as intended, but provide a variable
+
+                    Why:  Ensures that all files contain a license header.
+                    Used: Standard lifecycle, mvn package.
+                -->
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>license-maven-plugin</artifactId>
+                    <version>1.5</version>
+                    <configuration>
+                        <failOnMissingHeader>${breakOnFailure.license}</failOnMissingHeader>
+                        <licenseName>${license.id}</licenseName>
+                        <!--
+                            These two configuration parameters are required if we would like to
+                            stash license (template) files in the Cobertura codestyle project.
+                         -->
+                        <!-- licenseResolver>${license.licenseResolver}</licenseResolver -->
+                        <!--
+                            descriptionTemplate>/codestyle/license/${license.id}/
+                            licenseDescriptionTemplate.ftl</descriptionTemplate -->
+                        <canUpdateDescription>true</canUpdateDescription>
+                        <addJavaLicenseAfterPackage>false</addJavaLicenseAfterPackage>
+                        <licenseFile>${project.build.directory}/LICENSE.TXT</licenseFile>
+                        <roots>
+                            <root>${project.basedir}/src/main</root>
+                            <root>${project.basedir}/src/test</root>
+                            <root>${project.basedir}/src/site</root>
+                        </roots>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <id>check-file-header</id>
+                            <phase>process-sources</phase>
+                            <goals>
+                                <goal>check-file-header</goal>
+                            </goals>
+                        </execution>
+                        <execution>
+                            <id>add-license</id>
+                            <phase>generate-sources</phase>
+                            <goals>
+                                <goal>update-project-license</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <dependencies>
+                        <dependency>
+                            <groupId>se.jguru.nazgul.tools.codestyle</groupId>
+                            <artifactId>nazgul-codestyle</artifactId>
+                            <version>${nazgul-tools.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>net.sourceforge.cobertura.codestyle</groupId>
+                            <artifactId>cobertura-codestyle</artifactId>
+                            <version>2.1.1</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+
+            </plugins>
+        </pluginManagement>
+
+        <plugins>
+
+            <!-- Attach a source jar -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>verify</phase>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Check codestyle, part 1: Checkstyle -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>verify</id>
+                        <phase>${check.plugins.phase}</phase>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Check codestyle, part 2: PMD -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-pmd-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>check</goal>
+                            <goal>cpd-check</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Check codestyle, part 3: Findbugs -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>findbugs-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Fix project license documents -->
+            <!-- Disabled until http://jira.codehaus.org/browse/MLICENSE-90 has been resolved -->
+            <!--
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>license-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>check-file-header</id>
+                        <phase>process-sources</phase>
+                        <goals>
+                            <goal>update-file-header</goal>
+                            <goal>update-project-license</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            -->
+
+            <!-- Compile the code -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${jdk.version}</source>
+                    <target>${jdk.version}</target>
+                    <showWarnings>true</showWarnings>
+                    <showDeprecation>true</showDeprecation>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+
+            <!-- Generate maven dependencies listing file -->
+            <plugin>
+                <groupId>org.apache.servicemix.tooling</groupId>
+                <artifactId>depends-maven-plugin</artifactId>
+                <version>1.2</version>
+                <executions>
+                    <execution>
+                        <id>generate-depends-file</id>
+                        <goals>
+                            <goal>generate-depends-file</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Analyze dependencies for usage within the project -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>analyze</id>
+                        <goals>
+                            <goal>analyze-only</goal>
+                        </goals>
+                        <configuration>
+                            <!--
+                                Don't break the build if we have unused dependencies.
+                                Since we cannot exclude the global Aspect libraries from
+                                breaking the build (they should be available as a compile-
+                                scope dependency), we can only provide a warning about
+                                unused dependencies.
+                             -->
+                            <failOnWarning>false</failOnWarning>
+
+                            <!-- Only deal with compile-scope dependencies -->
+                            <ignoreNonCompile>true</ignoreNonCompile>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Produce an OSGi-compliant MANIFEST.MF file. -->
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>bundle-manifest</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>manifest</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- Generate png images from Plantuml source files. -->
+            <plugin>
+                <groupId>com.github.jeluard</groupId>
+                <artifactId>plantuml-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate-plantuml-diagrams</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <phase>pre-site</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <excludeDefaults>true</excludeDefaults>
+        <outputDirectory>${project.build.directory}/site</outputDirectory>
+
+        <plugins>
+
+            <!--
+                 Due to problems in the Maven 3 site plugin you must enter the configuration twice,
+                 once for the pluginManagement section and once for site reporting.
+            -->
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+                <version>${maven-project-info-reports-plugin.version}</version>
+                <configuration>
+                    <dependencyDetailsEnabled>false</dependencyDetailsEnabled>
+                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <configuration>
+                    <stylesheet>java</stylesheet>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jxr-plugin</artifactId>
+                <version>2.3</version>
+            </plugin>
+
+            <!--
+                 Due to problems in the Maven 3 site plugin you must enter the configuration twice,
+                 once for the pluginManagement section and once for the site, see
+                 http://jira.codehaus.org/browse/MSITE-516 and http://jira.codehaus.org/browse/MSITE-523
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-pmd-plugin</artifactId>
+                <version>${pmd.plugin.version}</version>
+                <reportSets>
+                    <reportSet>
+                        <reports>
+                            <report>pmd</report>
+                            <report>cpd</report>
+                        </reports>
+                    </reportSet>
+                </reportSets>
+                <configuration>
+                    <rulesets>
+                        <ruleset>${pmd.ruleset}</ruleset>
+                    </rulesets>
+                    <targetJdk>${jdk.version}</targetJdk>
+                    <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
+                </configuration>
+            </plugin>
+
+            <!--
+                 Due to problems in the Maven 3 site plugin you must enter the configuration twice,
+                 once for the pluginManagement section and once for the site, see
+                 http://jira.codehaus.org/browse/MSITE-516 and http://jira.codehaus.org/browse/MSITE-523
+            -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <version>${checkstyle.plugin.version}</version>
+                <configuration>
+                    <configLocation>${checkstyle.config.location}</configLocation>
+                    <suppressionsFile>${checkstyle.suppressions.location}</suppressionsFile>
+                    <failOnViolation>${breakOnFailure.checkstyle}</failOnViolation>
+                    <violationSeverity>${checkstyle.violationSeverity}</violationSeverity>
+                </configuration>
+                <reportSets>
+                    <reportSet>
+                        <reports>
+                            <report>checkstyle</report>
+                        </reports>
+                    </reportSet>
+                </reportSets>
+            </plugin>
+
+            <!--
+                 Due to problems in the Maven 3 site plugin you must enter the configuration twice,
+                 once for the pluginManagement section and once for the site, see
+                 http://jira.codehaus.org/browse/MSITE-516 and http://jira.codehaus.org/browse/MSITE-523
+            -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>findbugs-maven-plugin</artifactId>
+                <version>${findbugs.plugin.version}</version>
+                <configuration>
+                    <threshold>High</threshold>
+                    <effort>Default</effort>
+                    <onlyAnalyze>${findbugs.only.analyze}</onlyAnalyze>
+                    <includeFilterFile>${findbugs.includeFilterFile}</includeFilterFile>
+                    <excludeFilterFile>${findbugs.excludeFilterFile}</excludeFilterFile>
+                    <relaxed>false</relaxed>
+                    <findbugsXmlOutput>true</findbugsXmlOutput>
+                    <xmlOutput>true</xmlOutput>
+                </configuration>
+                <reportSets>
+                    <reportSet>
+                        <reports>
+                            <report>findbugs</report>
+                        </reports>
+                    </reportSet>
+                </reportSets>
+            </plugin>
+
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>clirr-maven-plugin</artifactId>
+                <version>2.6</version>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>${dependency.plugin.version}</version>
+                <reportSets>
+                    <reportSet>
+                        <reports>
+                            <report>analyze-report</report>
+                        </reports>
+                    </reportSet>
+                </reportSets>
+            </plugin>
+        </plugins>
+    </reporting>
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+
+    <!--
+        Define the issue management system.
+    -->
+    <issueManagement>
+        <system>github</system>
+        <url>${reactor.url.remote.prefix}/${reactor.name}/issues</url>
+    </issueManagement>
+
+    <!--
+        Define repository settings for Maven's deploy and release plugins.
+        To comply with Maven standards, the repository definitions should
+        go in the settings.xml file, rather than into the POM.
+
+        This leaves the site URL mechanics in the POM to cater for staging
+        and deploying sites.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+    ################################################
+    # Section 5:  Profiles and Reports
+    ################################################
+    -->
+
+    <profiles>
+
+        <!--
+            Moved to a profile, activated by JDK 1.7 or higher, because the Enforcer rules used require Java 1.7.
+            We must use Java 1.6 when doing a release.
+        -->
+        <profile>
+            <id>enforce-imports</id>
+            <activation>
+                <jdk>[1.7,)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <!-- Enforce not importing incorrect projects. -->
+                    <plugin>
+                        <artifactId>maven-enforcer-plugin</artifactId>
+                        <version>1.3.1</version>
+                        <executions>
+                            <execution>
+                                <id>enforce-imports</id>
+                                <goals>
+                                    <goal>enforce</goal>
+                                </goals>
+                                <configuration>
+                                    <fail>${breakOnFailure.enforcer}</fail>
+                                    <rules>
+                                        <requireMavenVersion>
+                                            <version>[3.0.5,)</version>
+                                        </requireMavenVersion>
+                                        <requireJavaVersion>
+                                            <version>${jdk.version}</version>
+                                        </requireJavaVersion>
+                                        <requireUpperBoundDeps />
+
+                                        <!--
+                                            Enforce the ProjectType structure, implying that all projects
+                                            must comply with the project template definitions.
+                                        -->
+                                        <validateProjectTypes implementation="se.jguru.nazgul.tools.codestyle.enforcer.rules.ValidateProjectType" />
+
+                                        <!--
+                                            Enforce the implementation rules for dependencies, to enforce that
+                                            the level of dependency tanglement is not increased. This implies that
+                                            implementation projects cannot import other implementation projects (but
+                                            instead should import APIs).
+
+                                            While the configuration below reflect the default settings, it is
+                                            reproduced her to serve as an example of how to configure this enforcement rule
+                                            in child reactors - where needs are likely different than here.
+                                        -->
+                                        <restrictImplDependencies implementation="se.jguru.nazgul.tools.codestyle.enforcer.rules.RestrictImplDependencies">
+                                            <includedGroupIdPatterns>${enforcer.includedGroupIdPatterns}
+                                            </includedGroupIdPatterns>
+                                            <excludedGroupIdPatterns>${enforcer.excludedGroupIdPatterns}
+                                            </excludedGroupIdPatterns>
+                                        </restrictImplDependencies>
+
+                                        <!--
+                                            Enforce using correct packages for classes within a NSC project.
+                                            The root package of any project should be identical to its groupId.
+                                            Any package below the root package can safely be used - so ...
+
+                                            if the groupId of a project is "com.acme.foobar",
+                                            then all code within that project must reside within the "com.acme.foobar" package,
+                                            or in any subpackage thereof.
+                                        -->
+                                        <correctPackaging implementation="se.jguru.nazgul.tools.codestyle.enforcer.rules.CorrectPackagingRule" />
+                                    </rules>
+                                </configuration>
+                            </execution>
+                        </executions>
+                        <dependencies>
+                            <dependency>
+                                <groupId>se.jguru.nazgul.tools.codestyle</groupId>
+                                <artifactId>nazgul-codestyle</artifactId>
+                                <version>${nazgul-tools.version}</version>
+                            </dependency>
+                            <dependency>
+                                <groupId>net.sourceforge.cobertura.codestyle</groupId>
+                                <artifactId>cobertura-codestyle</artifactId>
+                                <version>2.1.1</version>
+                            </dependency>
+                        </dependencies>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <!--
+            Purpose: Use GPG to sign artifacts during release:perform.
+        -->
+        <profile>
+            <id>release-sign-artifacts</id>
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.4</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <!--
+            Purpose:    Skip deploy step for dryRun
+        -->
+        <profile>
+            <id>release.dryRun</id>
+            <activation>
+                <property>
+                    <name>dryRun</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-release-plugin</artifactId>
+                        <version>${maven.release.plugin.version}</version>
+                        <configuration>
+                            <goals>deploy</goals>
+                            <mavenExecutorId>forked-path</mavenExecutorId>
+                            <preparationGoals>-B clean install</preparationGoals>
+                            <localCheckout>true</localCheckout>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <!--
+            Purpose:    Create Eclipse workspace including all dependencies
+                        from the checked-out mercurial repository.
+        -->
+        <profile>
+            <id>setupEclipseProfile</id>
+            <build>
+                <defaultGoal>clean</defaultGoal>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-eclipse-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>setup.eclipse.project</id>
+                                <phase>clean</phase>
+                                <goals>
+                                    <goal>clean</goal>
+                                    <goal>eclipse</goal>
+                                </goals>
+                                <configuration>
+                                    <addGroupIdToProjectName>true</addGroupIdToProjectName>
+                                    <addVersionToProjectName>true</addVersionToProjectName>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>
diff --git a/poms/pom.xml b/poms/pom.xml
new file mode 100644
index 0000000..b208e62
--- /dev/null
+++ b/poms/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--
+    ################################################
+    # Section 1:  Project information
+    ################################################
+    -->
+    <parent>
+        <groupId>net.sourceforge.cobertura</groupId>
+        <artifactId>cobertura-reactor</artifactId>
+        <version>2.1.1</version>
+    </parent>
+
+    <groupId>net.sourceforge.cobertura.poms</groupId>
+    <artifactId>cobertura-poms-reactor</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    <url>${url.prefix}/${path.in.reactor}</url>
+
+    <properties>
+        <path.in.reactor>poms</path.in.reactor>
+    </properties>
+
+    <!--
+    ################################################
+    # Section 2:  Modules
+    ################################################
+    -->
+    <modules>
+        <module>cobertura-parent</module>
+        <module>cobertura-api-parent</module>
+    </modules>
+
+    <!--
+    ################################################
+    # Section 3:  Build settings
+    ################################################
+    -->
+
+    <!--
+    ################################################
+    # Section 4:  External systems
+    ################################################
+    -->
+
+    <!--
+        Define settings for Maven's site plugin.
+    -->
+    <distributionManagement>
+        <site>
+            <id>coberturaSite</id>
+            <name>coberturaSite</name>
+            <url>${distro.url.prefix}/${path.in.reactor}</url>
+        </site>
+    </distributionManagement>
+
+    <!--
+       Define Maven's Git integration.
+    -->
+    <scm>
+        <connection>${scm.conn}</connection>
+        <developerConnection>${scm.devConnection}</developerConnection>
+        <url>${reactor.url.remote.prefix}/${reactor.name}</url>
+        <tag>cobertura-2.1.1</tag>
+    </scm>
+</project>
diff --git a/src-2/someotherpackage/SomeOtherClass.java b/src-2/someotherpackage/SomeOtherClass.java
deleted file mode 100644
index 53951bc..0000000
--- a/src-2/someotherpackage/SomeOtherClass.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Jeremy Thomerson
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package someotherpackage;
-
-/**
- * This class is only for testing that stuff from multiple source
- * directories works properly.
- *  
- * @author Jeremy Thomerson
- */
-public class SomeOtherClass {
-	
-	private int counter;
-
-	public SomeOtherClass() {
-		// no-op
-	}
-
-	public int incrementCounter() {
-		return ++counter;
-	}
-	
-	public int decrementCounter() {
-		return --counter;
-	}
-	
-	public int getCounter() {
-		return counter;
-	}
-	
-	/**
-	 * Don't call this method.  It is one that is supposed to not be called
-	 * by the unit tests so that we can verify that everything is being
-	 * recorded properly. 
-	 */
-	public void neverCallThisMethod() {
-		throw new UnsupportedOperationException("You weren't supposed to call this method.");
-	}
-}
diff --git a/src/net/sourceforge/cobertura/ant/package.html b/src/net/sourceforge/cobertura/ant/package.html
deleted file mode 100644
index f41f60d..0000000
--- a/src/net/sourceforge/cobertura/ant/package.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<body>
-
-<p>
-The ant tasks for Cobertura and assorted helper classes.
-</p>
-
-<p>
-The license for the ant tasks is different than the license for the 
-rest of Cobertura (Apache Software License version 1.1 v. GPL 
-version 2).  The GPL prohibits linking GPL-licensed code with code 
-licensed under a GPL-incompatible license such as the Apache Software 
-License version 1.1.  For this reason, the Cobertura ant tasks do not 
-directly invoke the Cobertura classes.  Rather, they invoke a JVM which 
-runs the Cobertura classes.
-</p>
-
-</body>
diff --git a/src/net/sourceforge/cobertura/check/Main.java b/src/net/sourceforge/cobertura/check/Main.java
deleted file mode 100644
index c31b4ad..0000000
--- a/src/net/sourceforge/cobertura/check/Main.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Nathan Wilson
- * Copyright (C) 2009 Charlie Squires
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.check;
-
-import java.io.File;
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.util.Header;
-
-import org.apache.log4j.Logger;
-import org.apache.oro.text.regex.MalformedPatternException;
-import org.apache.oro.text.regex.Pattern;
-import org.apache.oro.text.regex.Perl5Compiler;
-import org.apache.oro.text.regex.Perl5Matcher;
-
-public class Main
-{
-
-	private static final Logger logger = Logger.getLogger(Main.class);
-
-	final Perl5Matcher pm = new Perl5Matcher();
-
-	final Perl5Compiler pc = new Perl5Compiler();
-
-	/**
-	 * The default CoverageRate needed for a class to pass the check.
-	 */
-	CoverageRate minimumCoverageRate;
-
-	/**
-	 * The keys of this map contain regular expression Patterns that
-	 * match against classes.  The values of this map contain
-	 * CoverageRate objects that specify the minimum coverage rates
-	 * needed for a class that matches the pattern.
-	 */
-	Map minimumCoverageRates = new HashMap();
-
-	/**
-	 * The keys of this map contain package names. The values of this 
-	 * map contain PackageCoverage objects that track the line and
-	 * branch coverage values for a package.
-	 */
-	Map packageCoverageMap = new HashMap();
-
-	double inRangeAndDivideByOneHundred(String coverageRateAsPercentage)
-	{
-		return inRangeAndDivideByOneHundred(Integer.valueOf(
-				coverageRateAsPercentage).intValue());
-	}
-
-	double inRangeAndDivideByOneHundred(int coverageRateAsPercentage)
-	{
-		if ((coverageRateAsPercentage >= 0)
-				&& (coverageRateAsPercentage <= 100))
-		{
-			return (double)coverageRateAsPercentage / 100;
-		}
-		throw new IllegalArgumentException("The value "
-				+ coverageRateAsPercentage
-				+ "% is invalid.  Percentages must be between 0 and 100.");
-	}
-
-	void setMinimumCoverageRate(String minimumCoverageRate)
-			throws MalformedPatternException
-	{
-		StringTokenizer tokenizer = new StringTokenizer(minimumCoverageRate,
-				":");
-		this.minimumCoverageRates.put(pc.compile(tokenizer.nextToken()),
-				new CoverageRate(inRangeAndDivideByOneHundred(tokenizer
-						.nextToken()), inRangeAndDivideByOneHundred(tokenizer
-						.nextToken())));
-	}
-
-	/**
-	 * This method returns the CoverageRate object that
-	 * applies to the given class.  If checks if there is a
-	 * pattern that matches the class name, and returns that
-	 * if it finds one.  Otherwise it uses the global minimum
-	 * rates that were passed in.
-	 */
-	CoverageRate findMinimumCoverageRate(String classname)
-	{
-		Iterator iter = this.minimumCoverageRates.entrySet().iterator();
-		while (iter.hasNext())
-		{
-			Map.Entry entry = (Map.Entry)iter.next();
-
-			if (pm.matches(classname, (Pattern)entry.getKey()))
-			{
-				return (CoverageRate)entry.getValue();
-			}
-		}
-		return this.minimumCoverageRate;
-	}
-
-	public Main(String[] args) throws MalformedPatternException
-	{
-		int exitStatus = 0;
-
-		Header.print(System.out);
-
-		File dataFile = CoverageDataFileHandler.getDefaultDataFile();
-		double branchCoverageRate = -1.0;
-		double lineCoverageRate = -1.0;
-		double packageBranchCoverageRate = -1.0;
-		double packageLineCoverageRate = -1.0;
-		double totalBranchCoverageRate = -1.0;
-		double totalLineCoverageRate = -1.0;
-
-		for (int i = 0; i < args.length; i++)
-		{
-			if (args[i].equals("--branch"))
-			{
-				branchCoverageRate = inRangeAndDivideByOneHundred(args[++i]);
-			}
-			else if (args[i].equals("--datafile"))
-			{
-				dataFile = new File(args[++i]);
-			}
-			else if (args[i].equals("--line"))
-			{
-				lineCoverageRate = inRangeAndDivideByOneHundred(args[++i]);
-			}
-			else if (args[i].equals("--regex"))
-			{
-				setMinimumCoverageRate(args[++i]);
-			}
-			else if (args[i].equals("--packagebranch"))
-			{
-				packageBranchCoverageRate = inRangeAndDivideByOneHundred(args[++i]);
-			}
-			else if (args[i].equals("--packageline"))
-			{
-				packageLineCoverageRate = inRangeAndDivideByOneHundred(args[++i]);
-			}
-			else if (args[i].equals("--totalbranch"))
-			{
-				totalBranchCoverageRate = inRangeAndDivideByOneHundred(args[++i]);
-			}
-			else if (args[i].equals("--totalline"))
-			{
-				totalLineCoverageRate = inRangeAndDivideByOneHundred(args[++i]);
-			}
-		}
-
-		ProjectData projectData = CoverageDataFileHandler
-				.loadCoverageData(dataFile);
-
-		if (projectData == null)
-		{
-			System.err.println("Error: Unable to read from data file "
-					+ dataFile.getAbsolutePath());
-			System.exit(1);
-		}
-
-		// If they didn't specify any thresholds, then use some defaults
-		if ((branchCoverageRate == -1.0) && (lineCoverageRate == -1.0)
-				&& (packageLineCoverageRate == -1.0)
-				&& (packageBranchCoverageRate == -1.0)
-				&& (totalLineCoverageRate == -1.0)
-				&& (totalBranchCoverageRate == -1.0)
-				&& (this.minimumCoverageRates.size() == 0))
-		{
-			branchCoverageRate = 0.5;
-			lineCoverageRate = 0.5;
-			packageBranchCoverageRate = 0.5;
-			packageLineCoverageRate = 0.5;
-			totalBranchCoverageRate = 0.5;
-			totalLineCoverageRate = 0.5;
-		}
-		// If they specified one or more thresholds, default everything else to 0
-		else
-		{
-			if (branchCoverageRate == -1.0)
-				branchCoverageRate = 0.0;
-			if (lineCoverageRate == -1.0)
-				lineCoverageRate = 0.0;
-			if (packageLineCoverageRate == -1.0)
-				packageLineCoverageRate = 0.0;
-			if (packageBranchCoverageRate == -1.0)
-				packageBranchCoverageRate = 0.0;
-			if (totalLineCoverageRate == -1.0)
-				totalLineCoverageRate = 0.0;
-			if (totalBranchCoverageRate == -1.0)
-				totalBranchCoverageRate = 0.0;
-		}
-
-		this.minimumCoverageRate = new CoverageRate(lineCoverageRate,
-				branchCoverageRate);
-
-		double totalLines = 0;
-		double totalLinesCovered = 0;
-		double totalBranches = 0;
-		double totalBranchesCovered = 0;
-
-		Iterator iter = projectData.getClasses().iterator();
-		while (iter.hasNext())
-		{
-			ClassData classData = (ClassData)iter.next();
-			CoverageRate coverageRate = findMinimumCoverageRate(classData
-					.getName());
-
-			if (totalBranchCoverageRate > 0.0)
-			{
-				totalBranches += classData.getNumberOfValidBranches();
-				totalBranchesCovered += classData.getNumberOfCoveredBranches();
-			}
-
-			if (totalLineCoverageRate > 0.0)
-			{
-				totalLines += classData.getNumberOfValidLines();
-				totalLinesCovered += classData.getNumberOfCoveredLines();
-			}
-
-			PackageCoverage packageCoverage = getPackageCoverage(classData
-					.getPackageName());
-			if (packageBranchCoverageRate > 0.0)
-			{
-				packageCoverage.addBranchCount(classData
-						.getNumberOfValidBranches());
-				packageCoverage.addBranchCoverage(classData
-						.getNumberOfCoveredBranches());
-			}
-
-			if (packageLineCoverageRate > 0.0)
-			{
-				packageCoverage.addLineCount(classData.getNumberOfValidLines());
-				packageCoverage.addLineCoverage(classData
-						.getNumberOfCoveredLines());
-			}
-
-			logger.debug("Class " + classData.getName()
-					+ ", line coverage rate: "
-					+ percentage(classData.getLineCoverageRate())
-					+ "%, branch coverage rate: "
-					+ percentage(classData.getBranchCoverageRate()) + "%");
-
-			if (classData.getBranchCoverageRate() < coverageRate
-					.getBranchCoverageRate())
-			{
-				System.err.println(classData.getName()
-						+ " failed check. Branch coverage rate of "
-						+ percentage(classData.getBranchCoverageRate())
-						+ "% is below "
-						+ percentage(coverageRate.getBranchCoverageRate())
-						+ "%");
-				exitStatus |= 2;
-			}
-
-			if (classData.getLineCoverageRate() < coverageRate
-					.getLineCoverageRate())
-			{
-				System.err.println(classData.getName()
-						+ " failed check. Line coverage rate of "
-						+ percentage(classData.getLineCoverageRate())
-						+ "% is below "
-						+ percentage(coverageRate.getLineCoverageRate()) + "%");
-				exitStatus |= 4;
-			}
-		}
-
-		exitStatus |= checkPackageCoverageLevels(packageBranchCoverageRate,
-				packageLineCoverageRate);
-
-		// Check the rates for the overall project
-		if ((totalBranches > 0)
-				&& (totalBranchCoverageRate > (totalBranchesCovered / totalBranches)))
-		{
-			System.err
-					.println("Project failed check. "
-							+ "Total branch coverage rate of "
-							+ percentage(totalBranchesCovered / totalBranches)
-							+ "% is below "
-							+ percentage(totalBranchCoverageRate) + "%");
-			exitStatus |= 8;
-		}
-
-		if ((totalLines > 0)
-				&& (totalLineCoverageRate > (totalLinesCovered / totalLines)))
-		{
-			System.err.println("Project failed check. "
-					+ "Total line coverage rate of "
-					+ percentage(totalLinesCovered / totalLines)
-					+ "% is below " + percentage(totalLineCoverageRate) + "%");
-			exitStatus |= 16;
-		}
-
-		System.exit(exitStatus);
-	}
-
-	private PackageCoverage getPackageCoverage(String packageName)
-	{
-		PackageCoverage packageCoverage = (PackageCoverage)packageCoverageMap
-				.get(packageName);
-		if (packageCoverage == null)
-		{
-			packageCoverage = new PackageCoverage();
-			packageCoverageMap.put(packageName, packageCoverage);
-		}
-		return packageCoverage;
-	}
-
-	private int checkPackageCoverageLevels(double packageBranchCoverageRate,
-			double packageLineCoverageRate)
-	{
-		int exitStatus = 0;
-		Iterator iter = packageCoverageMap.entrySet().iterator();
-		while (iter.hasNext())
-		{
-			Map.Entry entry = (Map.Entry)iter.next();
-			String packageName = (String)entry.getKey();
-			PackageCoverage packageCoverage = (PackageCoverage)entry.getValue();
-
-			exitStatus |= checkPackageCoverage(packageBranchCoverageRate,
-					packageLineCoverageRate, packageName, packageCoverage);
-		}
-		return exitStatus;
-	}
-
-	private int checkPackageCoverage(double packageBranchCoverageRate,
-			double packageLineCoverageRate, String packageName,
-			PackageCoverage packageCoverage)
-	{
-		int exitStatus = 0;
-		double branchCoverage = packageCoverage.getBranchCoverage()
-				/ packageCoverage.getBranchCount();
-		if ((packageCoverage.getBranchCount() > 0)
-				&& (packageBranchCoverageRate > branchCoverage))
-		{
-			System.err.println("Package " + packageName
-					+ " failed check. Package branch coverage rate of "
-					+ percentage(branchCoverage) + "% is below "
-					+ percentage(packageBranchCoverageRate) + "%");
-			exitStatus |= 32;
-		}
-
-		double lineCoverage = packageCoverage.getLineCoverage()
-				/ packageCoverage.getLineCount();
-		if ((packageCoverage.getLineCount() > 0)
-				&& (packageLineCoverageRate > lineCoverage))
-		{
-			System.err.println("Package " + packageName
-					+ " failed check. Package line coverage rate of "
-					+ percentage(lineCoverage) + "% is below "
-					+ percentage(packageLineCoverageRate) + "%");
-			exitStatus |= 64;
-		}
-
-		return exitStatus;
-	}
-
-	private String percentage(double coverateRate)
-	{
-		BigDecimal decimal = new BigDecimal(coverateRate * 100);
-		return decimal.setScale(1, BigDecimal.ROUND_DOWN).toString();
-	}
-
-	public static void main(String[] args) throws MalformedPatternException
-	{
-		new Main(args);
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandler.java b/src/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandler.java
deleted file mode 100644
index 372891d..0000000
--- a/src/net/sourceforge/cobertura/coveragedata/CoverageDataFileHandler.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2007 Joakim Erdfelt
- * Copyright (C) 2007 Ignat Zapolsky
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import net.sourceforge.cobertura.util.ConfigurationUtil;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-
-/**
- * This contains methods used for reading and writing the
- * "cobertura.ser" file.
- */
-public abstract class CoverageDataFileHandler implements HasBeenInstrumented
-{
-	private static File defaultFile = null;
-
-	public static File getDefaultDataFile()
-	{
-		// return cached defaultFile
-		if (defaultFile != null) 
-		{
-			return defaultFile;
-		}
-
-		// load and cache datafile configuration
-		ConfigurationUtil config = new ConfigurationUtil();
-		defaultFile = new File(config.getDatafile());
-        
-		return defaultFile;
-	}
-
-	public static ProjectData loadCoverageData(File dataFile)
-	{
-		InputStream is = null;
-
-		//System.out.println("Cobertura: Loading coverage data from " + dataFile.getAbsolutePath());
-		try
-		{
-			is = new BufferedInputStream(new FileInputStream(dataFile), 16384);
-			return loadCoverageData(is);
-		}
-		catch (IOException e)
-		{
-			System.err.println("Cobertura: Error reading file "
-					+ dataFile.getAbsolutePath() + ": "
-					+ e.getLocalizedMessage());
-			return null;
-		}
-		finally
-		{
-			if (is != null)
-				try
-				{
-					is.close();
-				}
-				catch (IOException e)
-				{
-					System.err.println("Cobertura: Error closing file "
-							+ dataFile.getAbsolutePath() + ": "
-							+ e.getLocalizedMessage());
-				}
-		}
-	}
-
-	private static ProjectData loadCoverageData(InputStream dataFile) throws IOException
-	{
-		ObjectInputStream objects = null;
-
-		try
-		{
-			objects = new ObjectInputStream(dataFile);
-			ProjectData projectData = (ProjectData)objects.readObject();
-			System.out.println("Cobertura: Loaded information on "
-					+ projectData.getNumberOfClasses() + " classes.");
-			return projectData;
-		}
-		catch (IOException e) {
-			throw e;
-		}
-		catch (Exception e)
-		{
-			System.err.println("Cobertura: Error reading from object stream.");
-			e.printStackTrace();
-			return null;
-		}
-		finally
-		{
-			if (objects != null)
-			{
-				try
-				{
-					objects.close();
-				}
-				catch (IOException e)
-				{
-					System.err
-							.println("Cobertura: Error closing object stream.");
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-
-	public static void saveCoverageData(ProjectData projectData,
-			File dataFile)
-	{
-		FileOutputStream os = null;
-
-		//System.out.println("Cobertura: Saving coverage data to " + dataFile.getAbsolutePath());
-		try
-		{
-			File dataDir = dataFile.getParentFile();
-			if( (dataDir != null) && !dataDir.exists() )
-			{
-				dataDir.mkdirs();
-			}
-			os = new FileOutputStream(dataFile);
-			saveCoverageData(projectData, os);
-		}
-		catch (IOException e)
-		{
-			System.err.println("Cobertura: Error writing file "
-					+ dataFile.getAbsolutePath());
-			e.printStackTrace();
-		}
-		finally
-		{
-			if (os != null)
-			{
-				try
-				{
-					os.close();
-				}
-				catch (IOException e)
-				{
-					System.err.println("Cobertura: Error closing file "
-							+ dataFile.getAbsolutePath());
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-
-	private static void saveCoverageData(ProjectData projectData,
-			OutputStream dataFile)
-	{
-		ObjectOutputStream objects = null;
-        
-		try
-		{
-			objects = new ObjectOutputStream(dataFile);
-			objects.writeObject(projectData);
-			System.out.println("Cobertura: Saved information on " + projectData.getNumberOfClasses() + " classes.");
-		}
-		catch (IOException e)
-		{
-			System.err.println("Cobertura: Error writing to object stream.");
-			e.printStackTrace();
-		}
-		finally
-		{
-			if (objects != null)
-			{
-				try
-				{
-					objects.close();
-				}
-				catch (IOException e)
-				{
-					System.err
-							.println("Cobertura: Error closing object stream.");
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/coveragedata/LineData.java b/src/net/sourceforge/cobertura/coveragedata/LineData.java
deleted file mode 100644
index c02e174..0000000
--- a/src/net/sourceforge/cobertura/coveragedata/LineData.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Mark Sinke
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import net.sourceforge.cobertura.util.StringUtil;
-
-/**
- * <p>
- * This class implements HasBeenInstrumented so that when cobertura
- * instruments itself, it will omit this class.  It does this to
- * avoid an infinite recursion problem because instrumented classes
- * make use of this class.
- * </p>
- */
-public class LineData
-		implements Comparable, CoverageData, HasBeenInstrumented, Serializable
-{
-	private static final long serialVersionUID = 4;
-
-	private transient Lock lock;
-
-	private long hits;
-	private List jumps;
-	private List switches;
-	private final int lineNumber;
-	private String methodDescriptor;
-	private String methodName;
-
-	LineData(int lineNumber)
-	{
-		this(lineNumber, null, null);
-	}
-
-	LineData(int lineNumber, String methodName, String methodDescriptor)
-	{
-		this.hits = 0;
-		this.jumps = null;
-		this.lineNumber = lineNumber;
-		this.methodName = methodName;
-		this.methodDescriptor = methodDescriptor;
-		initLock();
-	}
-	
-	private void initLock()
-	{
-		 lock = new ReentrantLock();
-	}
-
-	/**
-	 * This is required because we implement Comparable.
-	 */
-	public int compareTo(Object o)
-	{
-		if (!o.getClass().equals(LineData.class))
-			return Integer.MAX_VALUE;
-		return this.lineNumber - ((LineData)o).lineNumber;
-	}
-
-	public boolean equals(Object obj)
-	{
-		if (this == obj)
-			return true;
-		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
-			return false;
-
-		LineData lineData = (LineData)obj;
-		getBothLocks(lineData);
-		try
-		{
-			return (this.hits == lineData.hits)
-					&& ((this.jumps == lineData.jumps) || ((this.jumps != null) && (this.jumps.equals(lineData.jumps))))
-					&& ((this.switches == lineData.switches) || ((this.switches != null) && (this.switches.equals(lineData.switches))))
-					&& (this.lineNumber == lineData.lineNumber)
-					&& (this.methodDescriptor.equals(lineData.methodDescriptor))
-					&& (this.methodName.equals(lineData.methodName));
-		}
-		finally
-		{
-			lock.unlock();
-			lineData.lock.unlock();
-		}
-	}
-
-	public double getBranchCoverageRate()
-	{
-		if (getNumberOfValidBranches() == 0)
-			return 1d;
-		lock.lock();
-		try
-		{
-			return ((double) getNumberOfCoveredBranches()) / getNumberOfValidBranches();
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public String getConditionCoverage()
-	{
-		StringBuffer ret = new StringBuffer();
-		if (getNumberOfValidBranches() == 0)
-		{
-			ret.append(StringUtil.getPercentValue(1.0));
-		}
-		else
-		{
-			lock.lock();
-			try
-			{
-				ret.append(StringUtil.getPercentValue(getBranchCoverageRate()));
-				ret.append(" (").append(getNumberOfCoveredBranches()).append("/").append(getNumberOfValidBranches()).append(")");
-			}
-			finally
-			{
-				lock.unlock();
-			}
-		}
-		return ret.toString();
-	}
-	
-	public long getHits()
-	{
-		lock.lock();
-		try
-		{
-			return hits;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public boolean isCovered()
-	{
-		lock.lock();
-		try
-		{
-			return (getHits() > 0) && ((getNumberOfValidBranches() == 0) || ((1.0 - getBranchCoverageRate()) < 0.0001));
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-	
-	public double getLineCoverageRate()
-	{
-		return (getHits() > 0) ? 1 : 0;
-	}
-
-	public int getLineNumber()
-	{
-		return lineNumber;
-	}
-
-	public String getMethodDescriptor()
-	{
-		lock.lock();
-		try
-		{
-			return methodDescriptor;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public String getMethodName()
-	{
-		lock.lock();
-		try
-		{
-			return methodName;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	/**
-	 * @see net.sourceforge.cobertura.coveragedata.CoverageData#getNumberOfCoveredBranches()
-	 */
-	/*public int getNumberOfCoveredBranches()
-	{
-		if (this.branches == null) 
-			return 0;
-		int covered = 0;
-		for (Iterator i = this.branches.iterator(); i.hasNext(); covered += ((BranchData) i.next()).getNumberOfCoveredBranches());
-		return covered;
-	}*/
-
-	public int getNumberOfCoveredLines()
-	{
-		return (getHits() > 0) ? 1 : 0;
-	}
-
-	public int getNumberOfValidBranches()
-	{
-		int ret = 0;
-		lock.lock();
-		try
-		{
-			if (jumps != null)
-				for (int i = jumps.size() - 1; i >= 0; i--)
-					ret += ((JumpData) jumps.get(i)).getNumberOfValidBranches();
-			if (switches != null)
-				for (int i = switches.size() - 1; i >= 0; i--)
-					ret += ((SwitchData) switches.get(i)).getNumberOfValidBranches();
-			return ret;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-	
-	public int getNumberOfCoveredBranches()
-	{
-		int ret = 0;
-		lock.lock();
-		try
-		{
-			if (jumps != null)
-				for (int i = jumps.size() - 1; i >= 0; i--)
-					ret += ((JumpData) jumps.get(i)).getNumberOfCoveredBranches();
-			if (switches != null)
-				for (int i = switches.size() - 1; i >= 0; i--)
-					ret += ((SwitchData) switches.get(i)).getNumberOfCoveredBranches();
-			return ret;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int getNumberOfValidLines()
-	{
-		return 1;
-	}
-
-	public int hashCode()
-	{
-		return this.lineNumber;
-	}
-
-	public boolean hasBranch()
-	{
-		lock.lock();
-		try
-		{
-			return (jumps != null) || (switches != null);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public void merge(CoverageData coverageData)
-	{
-		LineData lineData = (LineData)coverageData;
-		getBothLocks(lineData);
-		try
-		{
-			this.hits += lineData.hits;
-			if (lineData.jumps != null)
-				if (this.jumps == null) 
-					this.jumps = lineData.jumps;
-				else
-				{
-					for (int i = Math.min(this.jumps.size(), lineData.jumps.size()) - 1; i >= 0; i--)
-						((JumpData) this.jumps.get(i)).merge((JumpData) lineData.jumps.get(i));
-					for (int i = Math.min(this.jumps.size(), lineData.jumps.size()); i < lineData.jumps.size(); i++) 
-						this.jumps.add(lineData.jumps.get(i));
-				}
-			if (lineData.switches != null)
-				if (this.switches == null) 
-					this.switches = lineData.switches;
-				else
-				{
-					for (int i = Math.min(this.switches.size(), lineData.switches.size()) - 1; i >= 0; i--)
-						((SwitchData) this.switches.get(i)).merge((SwitchData) lineData.switches.get(i));
-					for (int i = Math.min(this.switches.size(), lineData.switches.size()); i < lineData.switches.size(); i++) 
-						this.switches.add(lineData.switches.get(i));
-				}
-			if (lineData.methodName != null)
-				this.methodName = lineData.methodName;
-			if (lineData.methodDescriptor != null)
-				this.methodDescriptor = lineData.methodDescriptor;
-		}
-		finally
-		{
-			lock.unlock();
-			lineData.lock.unlock();
-		}
-	}
-
-	void addJump(int jumpNumber)
-	{
-		getJumpData(jumpNumber);
-	}
-
-	void addSwitch(int switchNumber, int[] keys)
-	{
-		getSwitchData(switchNumber, new SwitchData(switchNumber, keys));
-	}
-
-	void addSwitch(int switchNumber, int min, int max)
-	{
-		getSwitchData(switchNumber, new SwitchData(switchNumber, min, max));
-	}
-
-	void setMethodNameAndDescriptor(String name, String descriptor)
-	{
-		lock.lock();
-		try
-		{
-			this.methodName = name;
-			this.methodDescriptor = descriptor;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	void touch(int new_hits)
-	{
-		lock.lock();
-		try
-		{
-			this.hits+=new_hits;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-	
-	void touchJump(int jumpNumber, boolean branch,int hits) 
-	{
-		getJumpData(jumpNumber).touchBranch(branch,hits);
-	}
-	
-	void touchSwitch(int switchNumber, int branch,int hits) 
-	{
-		getSwitchData(switchNumber, null).touchBranch(branch,hits);
-	}
-	
-	public int getConditionSize() {
-		lock.lock();
-		try
-		{
-			return ((jumps == null) ? 0 : jumps.size()) + ((switches == null) ? 0 :switches.size());
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-	
-	public Object getConditionData(int index)
-	{
-		Object branchData = null;
-		lock.lock();
-		try
-		{
-			int jumpsSize = (jumps == null) ? 0 : jumps.size();
-			int switchesSize = (switches == null) ? 0 :switches.size();
-			if (index < jumpsSize) 
-			{
-				branchData = jumps.get(index);
-			}
-			else if (index < jumpsSize + switchesSize)
-			{
-				branchData = switches.get(index - jumpsSize);
-			}
-			return branchData;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-	
-	public String getConditionCoverage(int index) {
-		Object branchData = getConditionData(index);
-		if (branchData == null)
-		{
-			return StringUtil.getPercentValue(1.0);
-		} 
-		else if (branchData instanceof JumpData) 
-		{
-			JumpData jumpData = (JumpData) branchData;
-			return StringUtil.getPercentValue(jumpData.getBranchCoverageRate());
-		}
-		else
-		{
-			SwitchData switchData = (SwitchData) branchData;
-			return StringUtil.getPercentValue(switchData.getBranchCoverageRate());
-
-		}
-	}
-	
-	JumpData getJumpData(int jumpNumber) 
-	{
-		lock.lock();
-		try
-		{
-			if (jumps == null) 
-			{
-				jumps = new ArrayList();
-			}
-			if (jumps.size() <= jumpNumber) 
-			{
-				for (int i = jumps.size(); i <= jumpNumber; jumps.add(new JumpData(i++)));
-			}
-			return (JumpData) jumps.get(jumpNumber);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-	
-	SwitchData getSwitchData(int switchNumber, SwitchData data) 
-	{
-		lock.lock();
-		try
-		{
-			if (switches == null) 
-			{
-				switches = new ArrayList();
-			}
-			if (switches.size() < switchNumber) 
-			{
-				for (int i = switches.size(); i < switchNumber; switches.add(new SwitchData(i++)));
-			}
-			if (switches.size() == switchNumber) 
-				if (data != null)
-					switches.add(data);
-				else
-					switches.add(new SwitchData(switchNumber));
-			return (SwitchData) switches.get(switchNumber);
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	private void getBothLocks(LineData other) {
-		/*
-		 * To prevent deadlock, we need to get both locks or none at all.
-		 * 
-		 * When this method returns, the thread will have both locks.
-		 * Make sure you unlock them!
-		 */
-		boolean myLock = false;
-		boolean otherLock = false;
-		while ((!myLock) || (!otherLock))
-		{
-			try
-			{
-				myLock = lock.tryLock();
-				otherLock = other.lock.tryLock();
-			}
-			finally
-			{
-				if ((!myLock) || (!otherLock))
-				{
-					//could not obtain both locks - so unlock the one we got.
-					if (myLock)
-					{
-						lock.unlock();
-					}
-					if (otherLock)
-					{
-						other.lock.unlock();
-					}
-					//do a yield so the other threads will get to work.
-					Thread.yield();
-				}
-			}
-		}
-	}
-
-	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
-	{
-		in.defaultReadObject();
-		initLock();
-	}
-}
diff --git a/src/net/sourceforge/cobertura/coveragedata/SwitchData.java b/src/net/sourceforge/cobertura/coveragedata/SwitchData.java
deleted file mode 100644
index cf95dfe..0000000
--- a/src/net/sourceforge/cobertura/coveragedata/SwitchData.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * <p>
- * This class implements HasBeenInstrumented so that when cobertura instruments
- * itself, it will omit this class. It does this to avoid an infinite recursion
- * problem because instrumented classes make use of this class.
- * </p>
- */
-public class SwitchData implements BranchCoverageData, Comparable, Serializable,
-		HasBeenInstrumented
-{
-	private static final long serialVersionUID = 9;
-
-	private transient Lock lock;
-
-	private int switchNumber;
-	
-	private long defaultHits;
-
-	private long[] hits;
-	
-	private int[] keys;
-
-	public SwitchData(int switchNumber, int[] keys)
-	{
-		super();
-		this.switchNumber = switchNumber;
-		defaultHits = 0;
-		hits = new long[keys.length];
-		Arrays.fill(hits, 0);
-		this.keys = new int[keys.length];
-		System.arraycopy(keys, 0, this.keys, 0, keys.length);
-		initLock();
-	}
-
-	public SwitchData(int switchNumber, int min, int max)
-	{
-		super();
-		this.switchNumber = switchNumber;
-		defaultHits = 0;
-		hits = new long[max - min + 1];
-		Arrays.fill(hits, 0);
-		this.keys = new int[max - min + 1];
-		for (int i = 0; min <= max; keys[i++] = min++);
-		initLock();
-	}
-
-	public SwitchData(int switchNumber)
-	{
-		this(switchNumber, new int[0]);
-	}
-	
-	private void initLock()
-	{
-		 lock = new ReentrantLock();
-	}
-
-	public int compareTo(Object o)
-	{
-		if (!o.getClass().equals(SwitchData.class))
-			return Integer.MAX_VALUE;
-		return this.switchNumber - ((SwitchData) o).switchNumber;
-	}
-	
-	void touchBranch(int branch,int new_hits) 
-	{
-		lock.lock();
-		try
-		{
-			if (branch == -1)
-				defaultHits++;
-			else 
-			{
-				if (hits.length <= branch)
-				{
-					long[] old = hits;
-					hits = new long[branch + 1];
-					System.arraycopy(old, 0, hits, 0, old.length);
-					Arrays.fill(hits, old.length, hits.length - 1, 0);
-				}
-				hits[branch]+=new_hits;
-			}
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-	
-	public int getSwitchNumber()
-	{
-		return this.switchNumber;
-	}
-
-	public long getHits(int branch)
-	{
-		lock.lock();
-		try
-		{
-			if (hits.length > branch)
-				return hits[branch];
-			return -1;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public long getDefaultHits()
-	{
-		lock.lock();
-		try
-		{
-			return defaultHits;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public double getBranchCoverageRate()
-	{
-		lock.lock();
-		try
-		{
-			int branches = hits.length + 1;
-			int hit = (defaultHits > 0) ? 1 : 0;
-			for (int i = hits.length - 1; i >= 0; hit += ((hits[i--] > 0) ? 1 : 0));
-			return ((double) hit) / branches;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public boolean equals(Object obj)
-	{
-		if (this == obj)
-			return true;
-		if ((obj == null) || !(obj.getClass().equals(this.getClass())))
-			return false;
-
-		SwitchData switchData = (SwitchData) obj;
-		getBothLocks(switchData);
-		try
-		{
-			return (this.defaultHits == switchData.defaultHits)
-					&& (Arrays.equals(this.hits, switchData.hits))
-					&& (this.switchNumber == switchData.switchNumber);
-		}
-		finally
-		{
-			lock.unlock();
-			switchData.lock.unlock();
-		}
-	}
-
-	public int hashCode()
-	{
-		return this.switchNumber;
-	}
-
-	public int getNumberOfCoveredBranches()
-	{
-		lock.lock();
-		try
-		{
-			int ret = (defaultHits > 0) ? 1 : 0;
-			for (int i = hits.length -1; i >= 0;i--) 
-			{
-				if (hits[i] > 0) ret++;
-			}
-			return ret;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public int getNumberOfValidBranches()
-	{
-		lock.lock();
-		try
-		{
-			return hits.length + 1;
-		}
-		finally
-		{
-			lock.unlock();
-		}
-	}
-
-	public void merge(BranchCoverageData coverageData)
-	{
-		SwitchData switchData = (SwitchData) coverageData;
-		getBothLocks(switchData);
-		try
-		{
-			defaultHits += switchData.defaultHits;
-			for (int i = Math.min(hits.length, switchData.hits.length) - 1; i >= 0; i--)
-				hits[i] += switchData.hits[i];
-			if (switchData.hits.length > hits.length)
-			{
-				long[] old = hits;
-				hits = new long[switchData.hits.length];
-				System.arraycopy(old, 0, hits, 0, old.length);
-				System.arraycopy(switchData.hits, old.length, hits, old.length, hits.length - old.length);
-			}
-			if ((this.keys.length == 0) && (switchData.keys.length > 0))
-				this.keys = switchData.keys;
-		}
-		finally
-		{
-			lock.unlock();
-			switchData.lock.unlock();
-		}
-
-	}
-
-	private void getBothLocks(SwitchData other) {
-		/*
-		 * To prevent deadlock, we need to get both locks or none at all.
-		 * 
-		 * When this method returns, the thread will have both locks.
-		 * Make sure you unlock them!
-		 */
-		boolean myLock = false;
-		boolean otherLock = false;
-		while ((!myLock) || (!otherLock))
-		{
-			try
-			{
-				myLock = lock.tryLock();
-				otherLock = other.lock.tryLock();
-			}
-			finally
-			{
-				if ((!myLock) || (!otherLock))
-				{
-					//could not obtain both locks - so unlock the one we got.
-					if (myLock)
-					{
-						lock.unlock();
-					}
-					if (otherLock)
-					{
-						other.lock.unlock();
-					}
-					//do a yield so the other threads will get to work.
-					Thread.yield();
-				}
-			}
-		}
-	}
-
-	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
-	{
-		in.defaultReadObject();
-		initLock();
-	}
-}
diff --git a/src/net/sourceforge/cobertura/coveragedata/TouchCollector.java b/src/net/sourceforge/cobertura/coveragedata/TouchCollector.java
deleted file mode 100644
index b7b10b5..0000000
--- a/src/net/sourceforge/cobertura/coveragedata/TouchCollector.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2010 Piotr Tabor
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import net.sourceforge.cobertura.coveragedata.countermaps.AtomicCounterMap;
-import net.sourceforge.cobertura.coveragedata.countermaps.CounterMap;
-
-public class TouchCollector implements HasBeenInstrumented{
-	
-	private static final CounterMap<LineTouchData> touchedLines=new AtomicCounterMap<LineTouchData>();	
-	private static final CounterMap<SwitchTouchData> switchTouchData=new AtomicCounterMap<SwitchTouchData>();	
-	private static final CounterMap<JumpTouchData> jumpTouchData=new AtomicCounterMap<JumpTouchData>();
-	
-	private static AtomicInteger lastClassId=new AtomicInteger(1);
-	private static final Map<String,Integer> class2classId=new ConcurrentHashMap<String, Integer>();
-	private static final Map<Integer,String> classId2class=new ConcurrentHashMap<Integer,String>();
-
-	static{
-		ProjectData.initialize();
-	}
-	
-	private static final int registerClassData(String name){		
-		Integer res=class2classId.get(name);
-		if (res==null){
-			int new_id=lastClassId.incrementAndGet();
-			class2classId.put(name, new_id);
-			classId2class.put(new_id, name);
-			return new_id;
-		}
-		return res;
-	}
-	
-	/**
-	 * This method is only called by code that has been instrumented.  It
-	 * is not called by any of the Cobertura code or ant tasks.
-	 */
-	public static final void touchSwitch(String classId,int lineNumber, int switchNumber, int branch) {
-		switchTouchData.incrementValue(new SwitchTouchData(registerClassData(classId),lineNumber, switchNumber, branch));
-	}
-	
-	/**
-	 * This method is only called by code that has been instrumented.  It
-	 * is not called by any of the Cobertura code or ant tasks.
-	 */
-	public static final void touch(String classId,int lineNumber) {
-		touchedLines.incrementValue(new LineTouchData(registerClassData(classId), lineNumber));
-	}
-	
-	/**
-	 * This method is only called by code that has been instrumented.  It
-	 * is not called by any of the Cobertura code or ant tasks.
-	 */
-	public static final void touchJump(String classId,int lineNumber, int branchNumber, boolean branch) {
-		jumpTouchData.incrementValue(new JumpTouchData(registerClassData(classId),lineNumber, branchNumber, branch));
-	}	
-
-	private static class LineTouchData implements HasBeenInstrumented{
-		int classId,lineNumber;
-		public LineTouchData(int classId,int lineNumber) {
-			this.classId=classId;
-			this.lineNumber=lineNumber;
-		}
-		@Override
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + classId;
-			result = prime * result + lineNumber;
-			return result;
-		}
-		@Override
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			LineTouchData other = (LineTouchData) obj;
-			if (classId != other.classId)
-				return false;
-			if (lineNumber != other.lineNumber)
-				return false;
-			return true;
-		}		
-	}
-	
-	private static class SwitchTouchData extends LineTouchData implements HasBeenInstrumented{
-		int switchNumber, branch;
-		
-		public SwitchTouchData(int classId,int lineNumber, int switchNumber, int branch) {
-			super(classId,lineNumber);
-			this.switchNumber=switchNumber;
-			this.branch=branch;
-		}
-
-		@Override
-		public int hashCode() {
-			final int prime = 31;
-			int result = super.hashCode();
-			result = prime * result + branch;
-			result = prime * result + switchNumber;
-			return result;
-		}
-
-		@Override
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (!super.equals(obj))
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			SwitchTouchData other = (SwitchTouchData) obj;
-			if (branch != other.branch)
-				return false;
-			if (switchNumber != other.switchNumber)
-				return false;
-			return true;
-		}	
-	}
-	
-	private static class JumpTouchData extends LineTouchData implements HasBeenInstrumented{
-		int branchNumber;
-		boolean branch;
-		public JumpTouchData(int classId,int lineNumber, int branchNumber, boolean branch) {
-			super(classId, lineNumber);
-			this.branchNumber=branchNumber;
-			this.branch=branch;
-		}
-		@Override
-		public int hashCode() {
-			final int prime = 31;
-			int result = super.hashCode();
-			result = prime * result + (branch ? 1231 : 1237);
-			result = prime * result + branchNumber;
-			return result;
-		}
-		@Override
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (!super.equals(obj))
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			JumpTouchData other = (JumpTouchData) obj;
-			if (branch != other.branch)
-				return false;
-			if (branchNumber != other.branchNumber)
-				return false;
-			return true;
-		}		
-	}	
-	
-	
-	public static synchronized void applyTouchesOnProjectData(ProjectData projectData){
-		System.out.println("Flushing results...");
-		Map<LineTouchData,Integer> touches=touchedLines.getFinalStateAndCleanIt();
-		for(Entry<LineTouchData, Integer> touch:touches.entrySet()){
-			if(touch.getValue()>0){				
-				getClassFor(touch.getKey(),projectData).touch(touch.getKey().lineNumber,touch.getValue());
-			}
-		}
-		
-		Map<SwitchTouchData,Integer> switchTouches=switchTouchData.getFinalStateAndCleanIt();
-		for(Entry<SwitchTouchData, Integer> touch:switchTouches.entrySet()){
-			if(touch.getValue()>0){
-				getClassFor(touch.getKey(),projectData).touchSwitch(
-						touch.getKey().lineNumber,
-						touch.getKey().switchNumber,
-						touch.getKey().branch,touch.getValue());
-			}
-		}
-		
-		Map<JumpTouchData,Integer> jumpTouches=jumpTouchData.getFinalStateAndCleanIt();
-		for(Entry<JumpTouchData, Integer> touch:jumpTouches.entrySet()){
-			if(touch.getValue()>0){
-				getClassFor(touch.getKey(),projectData).touchJump(
-						touch.getKey().lineNumber,
-						touch.getKey().branchNumber,
-						touch.getKey().branch,touch.getValue());
-			}
-		}
-		System.out.println("Flushing results done");
-	}
-
-	private static ClassData getClassFor(LineTouchData key,ProjectData projectData) {
-//		System.out.println("\nLooking for:"+key.classId+"\n");
-		return projectData.getOrCreateClassData(classId2class.get(key.classId));
-	}
-		
-}
diff --git a/src/net/sourceforge/cobertura/coveragedata/countermaps/AtomicCounterMap.java b/src/net/sourceforge/cobertura/coveragedata/countermaps/AtomicCounterMap.java
deleted file mode 100644
index 2eab783..0000000
--- a/src/net/sourceforge/cobertura/coveragedata/countermaps/AtomicCounterMap.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2010 Piotr Tabor
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata.countermaps;
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import net.sourceforge.cobertura.coveragedata.HasBeenInstrumented;
-
-/**
- * Thread-safe implementation of map that counts number of keys (like multi-set)
- * @author ptab
- *
- * @param <T>
- */
-public class AtomicCounterMap<T> implements CounterMap<T>,HasBeenInstrumented{
-	private final ConcurrentMap<T, AtomicInteger> counters=new ConcurrentHashMap<T, AtomicInteger>();
-	
-	public final void incrementValue(T key, int inc){
-		AtomicInteger v=counters.get(key);
-		if(v!=null){
-			v.addAndGet(inc);
-		}else{
-			v=counters.putIfAbsent(key, new AtomicInteger(inc));
-			if(v!=null)v.addAndGet(inc);			
-		}
-	}
-	
-	public final void incrementValue(T key){
-		//AtomicInteger v=counters.putIfAbsent(key, new AtomicInteger(1));
-		//return (v!=null)?v.incrementAndGet():1;
-		AtomicInteger v=counters.get(key);
-		if(v!=null){
-			v.incrementAndGet();			
-		}else{
-			v=counters.putIfAbsent(key, new AtomicInteger(1));
-			if(v!=null)v.incrementAndGet();
-		}
-	}	
-	
-	public final int getValue(T key){
-		AtomicInteger v=counters.get(key);
-		return v==null?0:v.get();
-	}
-	
-	
-	public synchronized  Map<T,Integer> getFinalStateAndCleanIt(){		
-		Map<T,Integer> res=new LinkedHashMap<T, Integer>();
-		Iterator<Map.Entry<T, AtomicInteger>> iterator=counters.entrySet().iterator();
-		while (iterator.hasNext()) {
-			Map.Entry<T, AtomicInteger> entry=iterator.next();
-			T key=entry.getKey();
-			int old=entry.getValue().get();
-			iterator.remove();
-			if(old>0){
-				res.put(key, old);
-			}
-		}		
-		return res;		
-	}
-	
-	public int getSize(){
-		return counters.size();
-	}
-}
diff --git a/src/net/sourceforge/cobertura/coveragedata/package.html b/src/net/sourceforge/cobertura/coveragedata/package.html
deleted file mode 100644
index 58f2ac3..0000000
--- a/src/net/sourceforge/cobertura/coveragedata/package.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<body>
-
-<p>
-A hierarchy of classes used for storing metadata about each of your
-classes.  A ProjectData object contains PackageData objects which
-contain ClassData objects
-which contain LineData objects.  Or, in bad ASCII art:
-</p>
-
-<p>
-ProjectData <--> PackageData <--> ClassData <--> LineData
-</p>
-
-<p>
-The SourceFileData class is not used during instrumention or
-testing.  It is a only used when generating the reports.  Basically
-it's used to lump a set of classes together when those classes come
-from the same file.  This is needed because the HTML reporting
-displays an entire file at a time, instead of displaying a single
-class at a time.
-</p>
-
-</body>
diff --git a/src/net/sourceforge/cobertura/instrument/ClassInstrumenter.java b/src/net/sourceforge/cobertura/instrument/ClassInstrumenter.java
deleted file mode 100644
index b80d516..0000000
--- a/src/net/sourceforge/cobertura/instrument/ClassInstrumenter.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner 
- * Copyright (C) 2006 Jiri Mares 
- * 
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import java.util.Collection;
-
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-
-import org.apache.log4j.Logger;
-import org.objectweb.asm.ClassAdapter;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-class ClassInstrumenter extends ClassAdapter
-{
-
-	private static final Logger logger = Logger
-			.getLogger(ClassInstrumenter.class);
-
-	private final static String hasBeenInstrumented = "net/sourceforge/cobertura/coveragedata/HasBeenInstrumented";
-
-	private Collection ignoreRegexs;
-
-	private Collection ignoreBranchesRegexs;
-
-	private ProjectData projectData;
-
-	private ClassData classData;
-
-	private String myName;
-
-	private boolean instrument = false;
-
-	public String getClassName()
-	{
-		return this.myName;
-	}
-
-	public boolean isInstrumented()
-	{
-		return instrument;
-	}
-
-	public ClassInstrumenter(ProjectData projectData, final ClassVisitor cv,
-			final Collection ignoreRegexs, final Collection ignoreBranchesRegexes)
-	{
-		super(cv);
-		this.projectData = projectData;
-		this.ignoreRegexs = ignoreRegexs;
-		this.ignoreBranchesRegexs = ignoreBranchesRegexs;
-	}
-
-	private boolean arrayContains(Object[] array, Object key)
-	{
-		for (int i = 0; i < array.length; i++)
-		{
-			if (array[i].equals(key))
-				return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * @param name In the format
-	 *             "net/sourceforge/cobertura/coverage/ClassInstrumenter"
-	 */
-	public void visit(int version, int access, String name, String signature,
-			String superName, String[] interfaces)
-	{
-		this.myName = name.replace('/', '.');
-		this.classData = this.projectData.getOrCreateClassData(this.myName);
-		this.classData.setContainsInstrumentationInfo();
-
-		// Do not attempt to instrument interfaces or classes that
-		// have already been instrumented
-		if (((access & Opcodes.ACC_INTERFACE) != 0)
-				|| arrayContains(interfaces, hasBeenInstrumented))
-		{
-			super.visit(version, access, name, signature, superName,
-							interfaces);
-		}
-		else
-		{
-			instrument = true;
-
-			// Flag this class as having been instrumented
-			String[] newInterfaces = new String[interfaces.length + 1];
-			System.arraycopy(interfaces, 0, newInterfaces, 0,
-							interfaces.length);
-			newInterfaces[newInterfaces.length - 1] = hasBeenInstrumented;
-
-			super.visit(version, access, name, signature, superName,
-					newInterfaces);
-		}
-	}
-
-	/**
-	 * @param source In the format "ClassInstrumenter.java"
-	 */
-	public void visitSource(String source, String debug)
-	{
-		super.visitSource(source, debug);
-		classData.setSourceFileName(source);
-	}
-
-	public MethodVisitor visitMethod(final int access, final String name,
-			final String desc, final String signature,
-			final String[] exceptions)
-	{
-		MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
-				exceptions);
-
-		if (!instrument)
-			return mv;
-
-		return mv == null ? null : new FirstPassMethodInstrumenter(classData, mv,
-				this.myName, access, name, desc, signature, exceptions, ignoreRegexs, 
-				ignoreBranchesRegexs);
-	}
-
-	public void visitEnd()
-	{
-		if (instrument && classData.getNumberOfValidLines() == 0)
-			logger.warn("No line number information found for class "
-					+ this.myName
-					+ ".  Perhaps you need to compile with debug=true?");
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/instrument/FirstPassMethodInstrumenter.java b/src/net/sourceforge/cobertura/instrument/FirstPassMethodInstrumenter.java
deleted file mode 100644
index 1a7258c..0000000
--- a/src/net/sourceforge/cobertura/instrument/FirstPassMethodInstrumenter.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.util.RegexUtil;
-
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodAdapter;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.MethodNode;
-
-public class FirstPassMethodInstrumenter extends MethodAdapter implements Opcodes
-{
-
-	private final String ownerClass;
-
-	private String myName;
-
-	private String myDescriptor;
-
-	private int myAccess;
-   
-	private Collection ignoreRegexs;
-   
-	private Collection ignoreBranchesRegexs;
-
-	private ClassData classData;
-
-	private int currentLine;
-   
-	private int currentJump;
-   
-	private int currentSwitch;
-	
-	private Map jumpTargetLabels;
-
-	private Map switchTargetLabels;
-   
-	private Map lineLabels;
-   
-	private MethodVisitor writerMethodVisitor;
-   
-	private MethodNode methodNode;
-
-	public FirstPassMethodInstrumenter(ClassData classData, final MethodVisitor mv,
-			final String owner, final int access, final String name, final String desc, 
-			final String signature, final String[] exceptions, final Collection ignoreRegexs,
-			final Collection ignoreBranchesRegexs)
-	{
-		super(new MethodNode(access, name, desc, signature, exceptions));
-		writerMethodVisitor = mv;
-		this.ownerClass = owner;
-		this.methodNode = (MethodNode) this.mv;
-		this.classData = classData;
-		this.myAccess = access;
-		this.myName = name;
-		this.myDescriptor = desc;
-		this.ignoreRegexs = ignoreRegexs;
-		this.ignoreBranchesRegexs = ignoreBranchesRegexs;
-		this.jumpTargetLabels = new HashMap();
-		this.switchTargetLabels = new HashMap();
-		this.lineLabels = new HashMap();
-		this.currentLine = 0;
-	}
-
-	public void visitEnd() {
-		super.visitEnd();
-
-		methodNode.accept(lineLabels.isEmpty() ? writerMethodVisitor : new SecondPassMethodInstrumenter(this)); //when there is no line number info -> no instrumentation
-	}
-
-	public void visitJumpInsn(int opcode, Label label)
-	{
-		// Ignore any jump instructions in the "class init" method.
-		// When initializing static variables, the JVM first checks
-		// that the variable is null before attempting to set it.
-		// This check contains an IFNONNULL jump instruction which
-		// would confuse people if it showed up in the reports.
-		if ((opcode != GOTO) && (opcode != JSR) && (currentLine != 0)
-				&& (!this.myName.equals("<clinit>")))
-		{
-			classData.addLineJump(currentLine, currentJump);
-			jumpTargetLabels.put(label, new JumpHolder(currentLine, currentJump++));
-		}
-		
-		super.visitJumpInsn(opcode, label);
-	}
-
-	public void visitLineNumber(int line, Label start)
-	{
-		// Record initial information about this line of code
-		currentLine = line;
-		classData.addLine(currentLine, myName, myDescriptor);
-		currentJump = 0;
-		currentSwitch = 0;
-      
-		lineLabels.put(start, new Integer(line));
-
-		//removed because the MethodNode doesn't reproduce visitLineNumber where they are but at the end of the file :-(( 
-		//therefore we don't need them
-		//We can directly instrument the visit line number here, but it is better to leave all instrumentation in the second pass
-		//therefore we just collects what label is the line ...
-		//super.visitLineNumber(line, start);
-	}
-
-	public void visitMethodInsn(int opcode, String owner, String name,
-			String desc)
-	{
-		super.visitMethodInsn(opcode, owner, name, desc);
-
-		// If any of the ignore patterns match this line
-		// then remove it from our data
-		if (RegexUtil.matches(ignoreRegexs, owner)) 
-		{
-			classData.removeLine(currentLine);
-		}
-	}
-
-	public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels)
-	{
-		super.visitLookupSwitchInsn(dflt, keys, labels);
-      
-		if (currentLine != 0)
-		{
-			switchTargetLabels.put(dflt, new SwitchHolder(currentLine, currentSwitch, -1)); 
-			for (int i = labels.length -1; i >=0; i--)
-				switchTargetLabels.put(labels[i], new SwitchHolder(currentLine, currentSwitch, i));
-			classData.addLineSwitch(currentLine, currentSwitch++, keys);
-		}
-	}
-
-	public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels)
-	{
-		super.visitTableSwitchInsn(min, max, dflt, labels);
-      
-		if (currentLine != 0)
-		{
-			switchTargetLabels.put(dflt, new SwitchHolder(currentLine, currentSwitch, -1)); 
-			for (int i = labels.length -1; i >=0; i--)
-				switchTargetLabels.put(labels[i], new SwitchHolder(currentLine, currentSwitch, i));
-			classData.addLineSwitch(currentLine, currentSwitch++, min, max);
-		}
-	}
-
-	protected void removeLine(int lineNumber) 
-	{
-		classData.removeLine(lineNumber);
-	}
-   
-	protected MethodVisitor getWriterMethodVisitor() 
-	{
-		return writerMethodVisitor;
-	}
-
-	protected Collection getIgnoreRegexs() 
-	{
-		return ignoreRegexs;
-	}
-
-	protected Map getJumpTargetLabels() 
-	{
-		return jumpTargetLabels;
-	}
-
-	protected Map getSwitchTargetLabels() 
-	{
-		return switchTargetLabels;
-	}
-
-	protected int getMyAccess() 
-	{
-		return myAccess;
-	}
-
-	protected String getMyDescriptor() 
-	{
-		return myDescriptor;
-	}
-
-	protected String getMyName() 
-	{
-		return myName;
-	}
-
-	protected String getOwnerClass() 
-	{
-		return ownerClass;
-	}
-
-	protected Map getLineLabels() 
-	{
-		return lineLabels;
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/instrument/JumpHolder.java b/src/net/sourceforge/cobertura/instrument/JumpHolder.java
deleted file mode 100644
index d59a223..0000000
--- a/src/net/sourceforge/cobertura/instrument/JumpHolder.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-public class JumpHolder {
-   protected int lineNumber;
-
-   protected int jumpNumber;
-
-   public JumpHolder(int lineNumber, int jumpNumber) {
-      super();
-      this.lineNumber = lineNumber;
-      this.jumpNumber = jumpNumber;
-   }
-
-   public int getJumpNumber() {
-      return jumpNumber;
-   }
-
-   public int getLineNumber() {
-      return lineNumber;
-   }
-
-}
diff --git a/src/net/sourceforge/cobertura/instrument/Main.java b/src/net/sourceforge/cobertura/instrument/Main.java
deleted file mode 100644
index d372e98..0000000
--- a/src/net/sourceforge/cobertura/instrument/Main.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Joakim Erdfelt
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2006 John Lewis
- * Copyright (C) 2006 Jiri Mares 
- * Contact information for the above is given in the COPYRIGHT file.
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-
-import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.util.ArchiveUtil;
-import net.sourceforge.cobertura.util.CommandLineBuilder;
-import net.sourceforge.cobertura.util.Header;
-import net.sourceforge.cobertura.util.IOUtil;
-import net.sourceforge.cobertura.util.RegexUtil;
-
-import org.apache.log4j.Logger;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassWriter;
-
-/**
- * <p>
- * Add coverage instrumentation to existing classes.
- * </p>
- *
- * <h3>What does that mean, exactly?</h3>
- * <p>
- * It means Cobertura will look at each class you give it.  It
- * loads the bytecode into memory.  For each line of source,
- * Cobertura adds a few extra instructions.  These instructions 
- * do the following:
- * </p>
- * 
- * <ol>
- * <li>Get an instance of the ProjectData class.</li>
- * <li>Call a method in this ProjectData class that increments
- * a counter for this line of code.
- * </ol>
- *
- * <p>
- * After every line in a class has been "instrumented," Cobertura
- * edits the bytecode for the class one more time and adds
- * "implements net.sourceforge.cobertura.coveragedata.HasBeenInstrumented" 
- * This is basically just a flag used internally by Cobertura to
- * determine whether a class has been instrumented or not, so
- * as not to instrument the same class twice.
- * </p>
- */
-public class Main
-{
-
-	private static final Logger logger = Logger.getLogger(Main.class);
-
-	private File destinationDirectory = null;
-
-	private Collection ignoreRegexes = new Vector();
-
-	private Collection ignoreBranchesRegexes = new Vector();
-
-	private ClassPattern classPattern = new ClassPattern();
-
-	private ProjectData projectData = null;
-
-	/**
-	 * @param entry A zip entry.
-	 * @return True if the specified entry has "class" as its extension,
-	 * false otherwise.
-	 */
-	private static boolean isClass(ZipEntry entry)
-	{
-		return entry.getName().endsWith(".class");
-	}
-
-	private boolean addInstrumentationToArchive(CoberturaFile file, InputStream archive,
-			OutputStream output) throws Exception
-	{
-		ZipInputStream zis = null;
-		ZipOutputStream zos = null;
-
-		try
-		{
-			zis = new ZipInputStream(archive);
-			zos = new ZipOutputStream(output);
-			return addInstrumentationToArchive(file, zis, zos);
-		}
-		finally
-		{
-			zis = (ZipInputStream)IOUtil.closeInputStream(zis);
-			zos = (ZipOutputStream)IOUtil.closeOutputStream(zos);
-		}
-	}
-
-	private boolean addInstrumentationToArchive(CoberturaFile file, ZipInputStream archive,
-			ZipOutputStream output) throws Exception
-	{
-		/*
-		 * "modified" is returned and indicates that something was instrumented.
-		 * If nothing is instrumented, the original entry will be used by the
-		 * caller of this method.
-		 */
-		boolean modified = false;
-		ZipEntry entry;
-		while ((entry = archive.getNextEntry()) != null)
-		{
-			try
-			{
-				String entryName = entry.getName();
-
-				/*
-				 * If this is a signature file then don't copy it,
-				 * but don't set modified to true.  If the only
-				 * thing we do is strip the signature, just use
-				 * the original entry.
-				 */
-				if (ArchiveUtil.isSignatureFile(entry.getName()))
-				{
-					continue;
-				}
-				ZipEntry outputEntry = new ZipEntry(entry.getName());
-				outputEntry.setComment(entry.getComment());
-				outputEntry.setExtra(entry.getExtra());
-				outputEntry.setTime(entry.getTime());
-				output.putNextEntry(outputEntry);
-
-				// Read current entry
-				byte[] entryBytes = IOUtil
-						.createByteArrayFromInputStream(archive);
-
-				// Instrument embedded archives if a classPattern has been specified
-				if ((classPattern.isSpecified()) && ArchiveUtil.isArchive(entryName))
-				{
-					Archive archiveObj = new Archive(file, entryBytes);
-					addInstrumentationToArchive(archiveObj);
-					if (archiveObj.isModified())
-					{
-						modified = true;
-						entryBytes = archiveObj.getBytes();
-						outputEntry.setTime(System.currentTimeMillis());
-					}
-				}
-				else if (isClass(entry) && classPattern.matches(entryName))
-				{
-					try
-					{
-						// Instrument class
-						ClassReader cr = new ClassReader(entryBytes);
-						ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-						ClassInstrumenter cv = new ClassInstrumenter(projectData,
-								cw, ignoreRegexes, ignoreBranchesRegexes);
-						cr.accept(cv, 0);
-	
-						// If class was instrumented, get bytes that define the
-						// class
-						if (cv.isInstrumented())
-						{
-							logger.debug("Putting instrumented entry: "
-									+ entry.getName());
-							entryBytes = cw.toByteArray();
-							modified = true;
-							outputEntry.setTime(System.currentTimeMillis());
-						}
-					}
-					catch (Throwable t)
-					{
-						if (entry.getName().endsWith("_Stub.class"))
-						{
-							//no big deal - it is probably an RMI stub, and they don't need to be instrumented
-							logger.debug("Problems instrumenting archive entry: " + entry.getName(), t);
-						}
-						else
-						{
-							logger.warn("Problems instrumenting archive entry: " + entry.getName(), t);
-						}
-					}
-				}
-
-				// Add entry to the output
-				output.write(entryBytes);
-				output.closeEntry();
-				archive.closeEntry();
-			}
-			catch (Exception e)
-			{
-				logger.warn("Problems with archive entry: " + entry.getName(), e);
-			}
-			catch (Throwable t)
-			{
-				logger.warn("Problems with archive entry: " + entry.getName(), t);
-			}
-			output.flush();
-		}
-		return modified;
-	}
-
-	private void addInstrumentationToArchive(Archive archive) throws Exception
-	{
-		InputStream in = null;
-		ByteArrayOutputStream out = null;
-		try
-		{
-			in = archive.getInputStream();
-			out = new ByteArrayOutputStream();
-			boolean modified = addInstrumentationToArchive(archive.getCoberturaFile(), in, out);
-
-			if (modified)
-			{
-				out.flush();
-				byte[] bytes = out.toByteArray();
-				archive.setModifiedBytes(bytes);
-			}
-		}
-		finally
-		{
-			in = IOUtil.closeInputStream(in);
-			out = (ByteArrayOutputStream)IOUtil.closeOutputStream(out);
-		}
-	}
-
-	private void addInstrumentationToArchive(CoberturaFile archive)
-	{
-		logger.debug("Instrumenting archive " + archive.getAbsolutePath());
-
-		File outputFile = null;
-		ZipInputStream input = null;
-		ZipOutputStream output = null;
-		boolean modified = false;
-		try
-		{
-			// Open archive
-			try
-			{
-				input = new ZipInputStream(new FileInputStream(archive));
-			}
-			catch (FileNotFoundException e)
-			{
-				logger.warn("Cannot open archive file: "
-						+ archive.getAbsolutePath(), e);
-				return;
-			}
-
-			// Open output archive
-			try
-			{
-				// check if destination folder is set
-				if (destinationDirectory != null)
-				{
-					// if so, create output file in it
-					outputFile = new File(destinationDirectory, archive.getPathname());
-				}
-				else
-				{
-					// otherwise create output file in temporary location
-					outputFile = File.createTempFile(
-							"CoberturaInstrumentedArchive", "jar");
-					outputFile.deleteOnExit();
-				}
-				output = new ZipOutputStream(new FileOutputStream(outputFile));
-			}
-			catch (IOException e)
-			{
-				logger.warn("Cannot open file for instrumented archive: "
-						+ archive.getAbsolutePath(), e);
-				return;
-			}
-
-			// Instrument classes in archive
-			try
-			{
-				modified = addInstrumentationToArchive(archive, input, output);
-			}
-			catch (Throwable e)
-			{
-				logger.warn("Cannot instrument archive: "
-						+ archive.getAbsolutePath(), e);
-				return;
-			}
-		}
-		finally
-		{
-			input = (ZipInputStream)IOUtil.closeInputStream(input);
-			output = (ZipOutputStream)IOUtil.closeOutputStream(output);
-		}
-
-		// If destination folder was not set, overwrite orginal archive with
-		// instrumented one
-		if (modified && (destinationDirectory == null))
-		{
-			try
-			{
-				logger.debug("Moving " + outputFile.getAbsolutePath() + " to "
-						+ archive.getAbsolutePath());
-				IOUtil.moveFile(outputFile, archive);
-			}
-			catch (IOException e)
-			{
-				logger.warn("Cannot instrument archive: "
-						+ archive.getAbsolutePath(), e);
-				return;
-			}
-		}
-		if ((destinationDirectory != null) && (!modified))
-		{
-			outputFile.delete();
-		}
-	}
-
-	private void addInstrumentationToSingleClass(File file)
-	{
-		logger.debug("Instrumenting class " + file.getAbsolutePath());
-
-		InputStream inputStream = null;
-		ClassWriter cw;
-		ClassInstrumenter cv;
-		try
-		{
-			inputStream = new FileInputStream(file);
-			ClassReader cr = new ClassReader(inputStream);
-			cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-			cv = new ClassInstrumenter(projectData, cw, ignoreRegexes, ignoreBranchesRegexes);
-			cr.accept(cv, 0);
-		}
-		catch (Throwable t)
-		{
-			logger.warn("Unable to instrument file " + file.getAbsolutePath(),
-					t);
-			return;
-		}
-		finally
-		{
-			inputStream = IOUtil.closeInputStream(inputStream);
-		}
-
-		OutputStream outputStream = null;
-		try
-		{
-			if (cv.isInstrumented())
-			{
-				// If destinationDirectory is null, then overwrite
-				// the original, uninstrumented file.
-				File outputFile;
-				if (destinationDirectory == null)
-					outputFile = file;
-				else
-					outputFile = new File(destinationDirectory, cv
-							.getClassName().replace('.', File.separatorChar)
-							+ ".class");
-
-				File parentFile = outputFile.getParentFile();
-				if (parentFile != null)
-				{
-					parentFile.mkdirs();
-				}
-
-				byte[] instrumentedClass = cw.toByteArray();
-				outputStream = new FileOutputStream(outputFile);
-				outputStream.write(instrumentedClass);
-			}
-		}
-		catch (Throwable t)
-		{
-			logger.warn("Unable to instrument file " + file.getAbsolutePath(),
-					t);
-			return;
-		}
-		finally
-		{
-			outputStream = IOUtil.closeOutputStream(outputStream);
-		}
-	}
-
-	// TODO: Don't attempt to instrument a file if the outputFile already
-	//       exists and is newer than the input file, and the output and
-	//       input file are in different locations?
-	private void addInstrumentation(CoberturaFile coberturaFile)
-	{
-		if (coberturaFile.isClass() && classPattern.matches(coberturaFile.getPathname()))
-		{
-			addInstrumentationToSingleClass(coberturaFile);
-		}
-		else if (coberturaFile.isDirectory())
-		{
-			String[] contents = coberturaFile.list();
-			for (int i = 0; i < contents.length; i++)
-			{
-				File relativeFile = new File(coberturaFile.getPathname(), contents[i]);
-				CoberturaFile relativeCoberturaFile = new CoberturaFile(coberturaFile.getBaseDir(),
-						relativeFile.toString());
-				//recursion!
-				addInstrumentation(relativeCoberturaFile);
-			}
-		}
-	}
-
-	private void parseArguments(String[] args)
-	{
-		File dataFile = CoverageDataFileHandler.getDefaultDataFile();
-
-		// Parse our parameters
-		List filePaths = new ArrayList();
-		String baseDir = null;
-		for (int i = 0; i < args.length; i++)
-		{
-			if (args[i].equals("--basedir"))
-				baseDir = args[++i];
-			else if (args[i].equals("--datafile"))
-				dataFile = new File(args[++i]);
-			else if (args[i].equals("--destination"))
-				destinationDirectory = new File(args[++i]);
-			else if (args[i].equals("--ignore"))
-			{
-				RegexUtil.addRegex(ignoreRegexes, args[++i]);
-			}
-			else if (args[i].equals("--ignoreBranches"))
-			{
-				RegexUtil.addRegex(ignoreBranchesRegexes, args[++i]);
-			}
-			else if (args[i].equals("--includeClasses"))
-			{
-				classPattern.addIncludeClassesRegex(args[++i]);
-			}
-			else if (args[i].equals("--excludeClasses"))
-			{
-				classPattern.addExcludeClassesRegex(args[++i]);
-			}
-			else
-			{
-				CoberturaFile coberturaFile = new CoberturaFile(baseDir, args[i]);
-				filePaths.add(coberturaFile);
-			}
-		}
-
-		// Load coverage data
-		if (dataFile.isFile())
-			projectData = CoverageDataFileHandler.loadCoverageData(dataFile);
-		if (projectData == null)
-			projectData = new ProjectData();
-		
-		// Instrument classes
-		System.out.println("Instrumenting "	+ filePaths.size() + " "
-				+ (filePaths.size() == 1 ? "file" : "files")
-				+ (destinationDirectory != null ? " to "
-						+ destinationDirectory.getAbsoluteFile() : ""));
-
-		Iterator iter = filePaths.iterator();
-		while (iter.hasNext())
-		{
-			CoberturaFile coberturaFile = (CoberturaFile)iter.next();
-			if (coberturaFile.isArchive())
-			{
-				addInstrumentationToArchive(coberturaFile);
-			}
-			else
-			{
-				addInstrumentation(coberturaFile);
-			}
-		}
-
-		// Save coverage data
-		CoverageDataFileHandler.saveCoverageData(projectData, dataFile);
-	}
-
-	public static void main(String[] args)
-	{
-		Header.print(System.out);
-
-		long startTime = System.currentTimeMillis();
-
-		Main main = new Main();
-
-		try {
-			args = CommandLineBuilder.preprocessCommandLineArguments( args);
-		} catch( Exception ex) {
-			System.err.println( "Error: Cannot process arguments: " + ex.getMessage());
-			System.exit(1);
-		}
-		main.parseArguments(args);
-
-		long stopTime = System.currentTimeMillis();
-		System.out.println("Instrument time: " + (stopTime - startTime) + "ms");
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/instrument/NewLocalVariableMethodAdapter.java b/src/net/sourceforge/cobertura/instrument/NewLocalVariableMethodAdapter.java
deleted file mode 100644
index 5f4a9dd..0000000
--- a/src/net/sourceforge/cobertura/instrument/NewLocalVariableMethodAdapter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodAdapter;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-
-/**
- * Expects that the visitMaxs is calculated for me .... 
- */
-public class NewLocalVariableMethodAdapter extends MethodAdapter implements Opcodes
-{
-	protected int firstStackVariable;
-	protected int addedStackWords;
-
-	public NewLocalVariableMethodAdapter(MethodVisitor mv, int access, String desc, int addedStackWords)
-	{
-		super(mv);
-		Type[] args = Type.getArgumentTypes(desc);
-		firstStackVariable = ((ACC_STATIC & access) != 0) ? 0 : 1;
-		for (int i = 0; i < args.length; i++) {
-			firstStackVariable += args[i].getSize();
-		}
-		this.addedStackWords = addedStackWords;
-	}
-	
-	public void visitVarInsn(int opcode, int var) 
-	{
-		mv.visitVarInsn(opcode, (var >= firstStackVariable) ? var + addedStackWords : var);
-	}
-
-	public void visitIincInsn(int var, int increment) {
-		mv.visitIincInsn((var >= firstStackVariable) ? var + addedStackWords : var, increment);
-	}
-
-	public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index)
-	{
-		mv.visitLocalVariable(name, desc, signature, start, end, (index >= firstStackVariable) ? index + addedStackWords : index);
-	}
-
-	public int getAddedStackWords()
-	{
-		return addedStackWords;
-	}
-
-	public int getFirstStackVariable()
-	{
-		return firstStackVariable;
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/instrument/SecondPassMethodInstrumenter.java b/src/net/sourceforge/cobertura/instrument/SecondPassMethodInstrumenter.java
deleted file mode 100644
index a7d106b..0000000
--- a/src/net/sourceforge/cobertura/instrument/SecondPassMethodInstrumenter.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2006 Jiri Mares
- * Copyright (C) 2010 Piotr Tabor
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-import net.sourceforge.cobertura.util.RegexUtil;
-
-import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
-
-/*
- * TODO: If class is abstract then do not count the "public abstract class bleh" line as a SLOC.
- */
-public class SecondPassMethodInstrumenter extends NewLocalVariableMethodAdapter implements Opcodes
-{
-	private String TOUCH_COLLECTOR_CLASS="net/sourceforge/cobertura/coveragedata/TouchCollector";
-	
-	private int currentLine;
-   
-	private int currentJump;
-	
-	private boolean methodStarted;
-	
-	private int myVariableIndex;
-
-	private Label startLabel;
-	
-	private Label endLabel;
-	
-	private JumpHolder lastJump;
-   
-	private FirstPassMethodInstrumenter firstPass;
-	
-	private static final int BOOLEAN_TRUE = ICONST_0;
-	private static final int BOOLEAN_FALSE = ICONST_1;
-
-	public SecondPassMethodInstrumenter(FirstPassMethodInstrumenter firstPass)
-	{
-		super(firstPass.getWriterMethodVisitor(), firstPass.getMyAccess(), firstPass.getMyDescriptor(), 2);
-		this.firstPass = firstPass;
-		this.currentLine = 0;
-	}
-
-	public void visitJumpInsn(int opcode, Label label)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		// Ignore any jump instructions in the "class init" method.
-		// When initializing static variables, the JVM first checks
-		// that the variable is null before attempting to set it.
-		// This check contains an IFNONNULL jump instruction which
-		// would confuse people if it showed up in the reports.
-		if ((opcode != GOTO) && (opcode != JSR) && (currentLine != 0)
-				&& (!this.firstPass.getMyName().equals("<clinit>")))
-		{
-			lastJump = new JumpHolder(currentLine, currentJump++); 
-			mv.visitIntInsn(SIPUSH, currentLine);
-			mv.visitVarInsn(ISTORE, myVariableIndex);
-			mv.visitIntInsn(SIPUSH, lastJump.getJumpNumber());
-			mv.visitVarInsn(ISTORE, myVariableIndex + 1);
-		}
-		
-		super.visitJumpInsn(opcode, label);
-	}
-
-	public void visitLineNumber(int line, Label start)
-	{
-		// Record initial information about this line of code
-		currentLine = line;
-		currentJump = 0;
-
-		instrumentOwnerClass();
-
-		// Mark the current line number as covered:
-		// classData.touch(line)
-		mv.visitIntInsn(SIPUSH, line);
-		mv.visitMethodInsn(INVOKESTATIC,
-				TOUCH_COLLECTOR_CLASS, "touch",
-				"(Ljava/lang/String;I)V");
-
-		super.visitLineNumber(line, start);
-	}
-
-	public void visitMethodInsn(int opcode, String owner, String name,
-			String desc)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitMethodInsn(opcode, owner, name, desc);
-
-		// If any of the ignore patterns match this line
-		// then remove it from our data
-		if (RegexUtil.matches(firstPass.getIgnoreRegexs(), owner)) 
-		{
-			firstPass.removeLine(currentLine);
-		}
-	}
-
-	public void visitFieldInsn(int opcode, String owner, String name, String desc)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitFieldInsn(opcode, owner, name, desc);
-	}
-
-	public void visitIincInsn(int var, int increment)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitIincInsn(var, increment);
-	}
-
-	public void visitInsn(int opcode)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitInsn(opcode);
-	}
-
-	public void visitIntInsn(int opcode, int operand)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitIntInsn(opcode, operand);
-	}
-
-	public void visitLabel(Label label)
-	{
-		//When this is the first method's label ... create the 2 new local variables (lineNumber and branchNumber)
-		if (methodStarted) 
-		{
-			methodStarted = false;
-			myVariableIndex = getFirstStackVariable();
-			mv.visitInsn(ICONST_0);
-			mv.visitVarInsn(ISTORE, myVariableIndex);
-			mv.visitIntInsn(SIPUSH, -1); 
-			mv.visitVarInsn(ISTORE, myVariableIndex + 1);
-			startLabel = label;
-		}
-		//to have the last label for visitLocalVariable
-		endLabel = label;
-		
-		super.visitLabel(label);
-		
-		//instrument the branch coverage collection
-		if (firstPass.getJumpTargetLabels().keySet().contains(label)) 
-		{ //this label is the true branch label
-			if (lastJump != null) 
-			{ //this is also label after jump - we have to check the branch number whether this is the true or false branch
-				Label newLabelX = instrumentIsLastJump();
-				instrumentOwnerClass();
-				instrumentPutLineAndBranchNumbers();
-				mv.visitInsn(BOOLEAN_FALSE);
-				instrumentInvokeTouchJump();
-				Label newLabelY = new Label();
-				mv.visitJumpInsn(GOTO, newLabelY);
-				mv.visitLabel(newLabelX);
-				mv.visitVarInsn(ILOAD, myVariableIndex + 1);
-				mv.visitJumpInsn(IFLT, newLabelY);
-				instrumentOwnerClass();
-				instrumentPutLineAndBranchNumbers();
-				mv.visitInsn(BOOLEAN_TRUE);
-				instrumentInvokeTouchJump();
-				mv.visitLabel(newLabelY);
-			}
-			else
-			{ //just hit te true branch
-				//just check whether the jump has been invoked or the label has been touched other way 
-				mv.visitVarInsn(ILOAD, myVariableIndex + 1);
-				Label newLabelX = new Label();
-				mv.visitJumpInsn(IFLT, newLabelX);
-				instrumentJumpHit(true);
-				mv.visitLabel(newLabelX);
-			}
-		} 
-		else if (lastJump != null) 
-		{ //this is "only" after jump label, hit the false branch only if the lastJump is same as stored stack lineNumber and jumpNumber
-			Label newLabelX = instrumentIsLastJump();
-			instrumentJumpHit(false); 
-			mv.visitLabel(newLabelX);
-		}
-		lastJump = null;
-		
-		SwitchHolder sh = (SwitchHolder) firstPass.getSwitchTargetLabels().get(label);
-		if (sh != null)
-		{
-			instrumentSwitchHit(sh.getLineNumber(), sh.getSwitchNumber(), sh.getBranch());
-		}
-		
-		//we have to manually invoke the visitLineNumber because of not correct MedthodNode's handling
-		Integer line = (Integer) firstPass.getLineLabels().get(label);
-		if (line != null) {
-			visitLineNumber(line.intValue(), label);
-		}
-	}
-
-	public void visitLdcInsn(Object cst)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitLdcInsn(cst);
-	}
-
-	public void visitMultiANewArrayInsn(String desc, int dims)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitMultiANewArrayInsn(desc, dims);
-	}
-
-	public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitLookupSwitchInsn(dflt, keys, labels);
-	}
-
-	public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitTableSwitchInsn(min, max, dflt, labels);
-	}
-
-	public void visitTryCatchBlock(Label start, Label end, Label handler, String type)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitTryCatchBlock(start, end, handler, type);
-	}
-
-	public void visitTypeInsn(int opcode, String desc)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		super.visitTypeInsn(opcode, desc);
-	}
-
-	public void visitVarInsn(int opcode, int var)
-	{
-		//to touch the previous branch (when there is such)
-		touchBranchFalse();
-		
-		//this is to change the variable instructions to conform to 2 new variables
-		super.visitVarInsn(opcode, var);
-	}
-
-	public void visitCode()
-	{
-		methodStarted = true;
-		super.visitCode();
-	}
-	
-	private void touchBranchFalse() {
-		if (lastJump != null) {
-			lastJump = null;
-			instrumentJumpHit(false);
-		}
-	}
-
-	private void instrumentOwnerClass()
-	{
-		// OwnerClass is the name of the class being instrumented
-		mv.visitLdcInsn(firstPass.getOwnerClass());
-	}
-	
-	private void instrumentSwitchHit(int lineNumber, int switchNumber, int branch)
-	{
-		instrumentOwnerClass();
-		
-		//Invoke the touchSwitch(lineNumber, switchNumber, branch)
-		mv.visitIntInsn(SIPUSH, lineNumber);
-		mv.visitIntInsn(SIPUSH, switchNumber);
-		mv.visitIntInsn(SIPUSH, branch);
-		instrumentInvokeTouchSwitch();
-	}
-	
-	private void instrumentJumpHit(boolean branch)
-	{
-		instrumentOwnerClass();
-		
-		//Invoke the touchJump(lineNumber, branchNumber, branch)
-		instrumentPutLineAndBranchNumbers();
-		mv.visitInsn(branch ? BOOLEAN_TRUE : BOOLEAN_FALSE);
-		instrumentInvokeTouchJump();
-	}
-
-	private void instrumentInvokeTouchJump()
-	{
-		mv.visitMethodInsn(INVOKESTATIC, TOUCH_COLLECTOR_CLASS, "touchJump", "(Ljava/lang/String;IIZ)V");
-		mv.visitIntInsn(SIPUSH, -1); //is important to reset current branch, because we have to know that the branch info on stack has already been used and can't be used
-		mv.visitVarInsn(ISTORE, myVariableIndex + 1);
-	}
-
-	private void instrumentInvokeTouchSwitch()
-	{
-		mv.visitMethodInsn(INVOKESTATIC, TOUCH_COLLECTOR_CLASS, "touchSwitch", "(Ljava/lang/String;III)V");
-	}
-
-	private void instrumentPutLineAndBranchNumbers()
-	{
-		mv.visitVarInsn(ILOAD, myVariableIndex);
-		mv.visitVarInsn(ILOAD, myVariableIndex + 1);
-	}
-
-	private Label instrumentIsLastJump() {
-		mv.visitVarInsn(ILOAD, myVariableIndex);
-		mv.visitIntInsn(SIPUSH, lastJump.getLineNumber());
-		Label newLabelX = new Label();
-		mv.visitJumpInsn(IF_ICMPNE, newLabelX);
-		mv.visitVarInsn(ILOAD, myVariableIndex + 1);
-		mv.visitIntInsn(SIPUSH, lastJump.getJumpNumber());
-		mv.visitJumpInsn(IF_ICMPNE, newLabelX);
-		return newLabelX;
-	}
-
-	public void visitMaxs(int maxStack, int maxLocals)
-	{
-		mv.visitLocalVariable("__cobertura__line__number__", "I", null, startLabel, endLabel, myVariableIndex);
-		mv.visitLocalVariable("__cobertura__branch__number__", "I", null, startLabel, endLabel, myVariableIndex + 1);
-		super.visitMaxs(maxStack, maxLocals);
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/instrument/SwitchHolder.java b/src/net/sourceforge/cobertura/instrument/SwitchHolder.java
deleted file mode 100644
index 03d8cdf..0000000
--- a/src/net/sourceforge/cobertura/instrument/SwitchHolder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.instrument;
-
-public class SwitchHolder extends JumpHolder {
-   protected int branch;
-
-   public SwitchHolder(int lineNumber, int switchNumber, int branch) {
-      super(lineNumber, switchNumber);
-      this.branch = branch;
-   }
-
-   public int getSwitchNumber() {
-      return jumpNumber;
-   }
-
-   public int getBranch() {
-      return branch;
-   }
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/FunctionMetric.java b/src/net/sourceforge/cobertura/javancss/FunctionMetric.java
deleted file mode 100644
index a0df0b3..0000000
--- a/src/net/sourceforge/cobertura/javancss/FunctionMetric.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/*
-Copyright (C) 2000 Chr. Clemens Lee <clemens at kclee.com>.
-
-This file is part of JavaNCSS
-(http://www.kclee.com/clemens/java/javancss/).
-
-JavaNCSS 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 2, or (at your option) any
-later version.
-
-JavaNCSS 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 JavaNCSS; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-package net.sourceforge.cobertura.javancss;
-
-/**
- * Basic data class to store all metrics attached to a function.
- *
- * @author  Herv� Boutemy
- * @version $Id: FunctionMetric.java 121 2009-01-17 22:19:45Z hboutemy $
- */
-public class FunctionMetric  extends Metric
-{
-    public int ccn = 0;
-
-    public FunctionMetric()
-    {
-        super();
-    }
-
-    public void clear()
-    {
-        super.clear();
-        ccn = 0;
-    }
-}
diff --git a/src/net/sourceforge/cobertura/javancss/Javancss.java b/src/net/sourceforge/cobertura/javancss/Javancss.java
deleted file mode 100644
index 5f8e79f..0000000
--- a/src/net/sourceforge/cobertura/javancss/Javancss.java
+++ /dev/null
@@ -1,579 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-
-package net.sourceforge.cobertura.javancss;
-
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import net.sourceforge.cobertura.javancss.ccl.Exitable;
-import net.sourceforge.cobertura.javancss.ccl.FileUtil;
-import net.sourceforge.cobertura.javancss.ccl.Init;
-import net.sourceforge.cobertura.javancss.ccl.Util;
-
-import net.sourceforge.cobertura.javancss.parser.JavaParser;
-import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
-import net.sourceforge.cobertura.javancss.parser.JavaParserTokenManager;
-import net.sourceforge.cobertura.javancss.parser.ParseException;
-import net.sourceforge.cobertura.javancss.parser.TokenMgrError;
-import net.sourceforge.cobertura.javancss.parser.debug.JavaParserDebug;
-import net.sourceforge.cobertura.javancss.parser.java15.JavaParser15;
-import net.sourceforge.cobertura.javancss.parser.java15.debug.JavaParser15Debug;
-import net.sourceforge.cobertura.javancss.test.JavancssTest;
-
-/**
- * While the Java parser class might be the heart of JavaNCSS,
- * this class is the brain. This class controls input and output and
- * invokes the Java parser.
- *
- * @author    Chr. Clemens Lee <clemens at kclee.com>
- *            , recursive feature by P��k� Hannu
- *            , additional javadoc metrics by Emilio Gongora <emilio at sms.nl>
- *            , and Guillermo Rodriguez <guille at sms.nl>.
- * @version   $Id: Javancss.java 676 2009-09-04 13:42:13Z lewijw $
- */
-public class Javancss implements Exitable
-{
-    private static final String S_INIT__FILE_CONTENT =
-        "[Init]\n" +
-        "Author=Chr. Clemens Lee\n" +
-        "\n" +
-        "[Help]\n"+
-        "; Please do not edit the Help section\n"+
-        "HelpUsage=@srcfiles.txt | *.java | <stdin>\n" +
-        "Options=ncss,package,object,function,all,gui,xml,out,recursive,check,encoding,parser15\n" +
-        "ncss=b,o,Counts the program NCSS (default).\n" +
-        "package=b,o,Assembles a statistic on package level.\n" +
-        "object=b,o,Counts the object NCSS.\n" +
-        "function=b,o,Counts the function NCSS.\n" +
-        "all=b,o,The same as '-function -object -package'.\n" +
-        "gui=b,o,Opens a gui to present the '-all' output in tabbed panels.\n" +
-        "xml=b,o,Output in xml format.\n" +
-        "out=s,o,Output file name. By default output goes to standard out.\n"+
-        "recursive=b,o,Recurse to subdirs.\n" +
-        "check=b,o,Triggers a javancss self test.\n" +
-        "encoding=s,o,Encoding used while reading source files (default: platform encoding).\n" +
-        "parser15=b,o,Use new experimental Java 1.5 parser.\n" +
-        "\n" +
-        "[Colors]\n" +
-        "UseSystemColors=true\n";
-
-    private boolean _bExit = false;
-
-    private List/*<File>*/ _vJavaSourceFiles = null;
-    private String encoding = null;
-
-    private String _sErrorMessage = null;
-    private Throwable _thrwError = null;
-
-    private JavaParserInterface _pJavaParser = null;
-    private int _ncss = 0;
-    private int _loc = 0;
-    private List/*<FunctionMetric>*/ _vFunctionMetrics = new ArrayList();
-    private List/*<ObjectMetric>*/ _vObjectMetrics = new ArrayList();
-    private List/*<PackageMetric>*/ _vPackageMetrics = null;
-    private List _vImports = null;
-    private Map/*<String,PackageMetric>*/ _htPackages = null;
-    private Object[] _aoPackage = null;
-
-    /**
-     * Just used for parseImports.
-     */
-    private File _sJavaSourceFile = null;
-
-    private Reader createSourceReader( File sSourceFile_ )
-    {
-        try
-        {
-            return newReader( sSourceFile_ );
-        }
-        catch ( IOException pIOException )
-        {
-            if ( Util.isEmpty( _sErrorMessage ) )
-            {
-                _sErrorMessage = "";
-            }
-            else
-            {
-                _sErrorMessage += "\n";
-            }
-            _sErrorMessage += "File not found: " + sSourceFile_.getAbsolutePath();
-            _thrwError = pIOException;
-
-            return null;
-        }
-    }
-
-    private void _measureSource( File sSourceFile_ ) throws IOException, Exception, Error
-    {
-        Reader reader = null;
-
-        // opens the file
-        try
-        {
-            reader = newReader( sSourceFile_ );
-        }
-        catch ( IOException pIOException )
-        {
-            if ( Util.isEmpty( _sErrorMessage ) )
-            {
-                _sErrorMessage = "";
-            }
-            else
-            {
-                _sErrorMessage += "\n";
-            }
-            _sErrorMessage += "File not found: " + sSourceFile_.getAbsolutePath();
-            _thrwError = pIOException;
-
-            throw pIOException;
-        }
-
-        String sTempErrorMessage = _sErrorMessage;
-        try
-        {
-            // the same method but with a Reader
-            _measureSource( reader );
-        }
-        catch ( Exception pParseException )
-        {
-            if ( sTempErrorMessage == null )
-            {
-                sTempErrorMessage = "";
-            }
-            sTempErrorMessage += "ParseException in " + sSourceFile_.getAbsolutePath() +
-                   "\nLast useful checkpoint: \"" + _pJavaParser.getLastFunction() + "\"\n";
-            sTempErrorMessage += pParseException.getMessage() + "\n";
-
-            _sErrorMessage = sTempErrorMessage;
-            _thrwError = pParseException;
-
-            throw pParseException;
-        }
-        catch ( Error pTokenMgrError )
-        {
-            if ( sTempErrorMessage == null )
-            {
-                sTempErrorMessage = "";
-            }
-            sTempErrorMessage += "TokenMgrError in " + sSourceFile_.getAbsolutePath() +
-                   "\n" + pTokenMgrError.getMessage() + "\n";
-            _sErrorMessage = sTempErrorMessage;
-            _thrwError = pTokenMgrError;
-
-            throw pTokenMgrError;
-        }
-    }
-
-    private void _measureSource( Reader reader ) throws IOException, Exception, Error
-    {
-      Util.debug( "_measureSource(Reader).ENTER" );
-      //Util.debug( "_measureSource(Reader).parser15: -->" + (_pInit.getOptions().get( "parser15" ) + "<--" );
-      //Util.panicIf( _pInit == null );
-      //Util.panicIf( _pInit.getOptions() == null );
-      Util.debug( "_measureSource(Reader).ENTER2" );
-      try
-      {
-        // create a parser object
-        if ( Util.isDebug() == false )
-        {
-          if ( _pInit == null || _pInit.getOptions() == null || _pInit.getOptions().get( "parser15" ) == null ) {
-            Util.debug( "creating JavaParser" );
-            _pJavaParser = (JavaParserInterface)(new JavaParser( reader ));
-          } else {
-            Util.debug( "creating JavaParser15" );
-            _pJavaParser = (JavaParserInterface)(new JavaParser15( reader ));
-          }
-        } else {
-          if ( _pInit == null || _pInit.getOptions() == null || _pInit.getOptions().get( "parser15" ) == null ) {
-            Util.debug( "creating JavaParserDebug" );
-            Util.println( "creating JavaParserDebug" );
-            _pJavaParser = (JavaParserInterface)(new JavaParserDebug( reader ));
-          } else {
-            Util.debug( "creating JavaParser15Debug" );
-            _pJavaParser = (JavaParserInterface)(new JavaParser15Debug( reader ));
-          }
-        }
-
-            // execute the parser
-            _pJavaParser.parse();
-            Util.debug( "Javancss._measureSource(DataInputStream).SUCCESSFULLY_PARSED" );
-
-            _ncss += _pJavaParser.getNcss(); // increment the ncss
-            _loc += _pJavaParser.getLOC(); // and loc
-            // add new data to global vector
-            _vFunctionMetrics.addAll( _pJavaParser.getFunction() );
-            _vObjectMetrics.addAll( _pJavaParser.getObject() );
-            Map htNewPackages = _pJavaParser.getPackage();
-
-            /* List vNewPackages = new Vector(); */
-            for ( Iterator ePackages = htNewPackages.entrySet().iterator(); ePackages.hasNext(); )
-            {
-                String sPackage = (String) ( (Map.Entry) ePackages.next() ).getKey();
-
-                PackageMetric pckmNext = (PackageMetric) htNewPackages.get( sPackage );
-                pckmNext.name = sPackage;
-
-                PackageMetric pckmPrevious = (PackageMetric) _htPackages.get( sPackage );
-                pckmNext.add( pckmPrevious );
-
-                _htPackages.put( sPackage, pckmNext );
-            }
-        }
-        catch ( Exception pParseException )
-        {
-            if ( _sErrorMessage == null )
-            {
-                _sErrorMessage = "";
-            }
-            _sErrorMessage += "ParseException in STDIN";
-            if ( _pJavaParser != null )
-            {
-                _sErrorMessage += "\nLast useful checkpoint: \"" + _pJavaParser.getLastFunction() + "\"\n";
-            }
-            _sErrorMessage += pParseException.getMessage() + "\n";
-            _thrwError = pParseException;
-
-            throw pParseException;
-        }
-        catch ( Error pTokenMgrError )
-        {
-            if ( _sErrorMessage == null )
-            {
-                _sErrorMessage = "";
-            }
-            _sErrorMessage += "TokenMgrError in STDIN\n";
-            _sErrorMessage += pTokenMgrError.getMessage() + "\n";
-            _thrwError = pTokenMgrError;
-
-            throw pTokenMgrError;
-        }
-    }
-
-    private void _measureFiles( List/*<File>*/ vJavaSourceFiles_ ) throws IOException, ParseException, TokenMgrError
-    {
-        // for each file
-        for ( Iterator e = vJavaSourceFiles_.iterator(); e.hasNext(); )
-        {
-            File file = (File) e.next();
-
-            try
-            {
-                _measureSource( file );
-            }
-            catch ( Throwable pThrowable )
-            {
-                // hmm, do nothing? Use getLastError() or so to check for details.
-            }
-        }
-    }
-
-    /**
-     * If arguments were provided, they are used, otherwise
-     * the input stream is used.
-     */
-    private void _measureRoot( Reader reader ) throws IOException, Exception, Error
-    {
-        _htPackages = new HashMap();
-
-        // either there are argument files, or stdin is used
-        if ( _vJavaSourceFiles == null )
-        {
-            _measureSource( reader );
-        }
-        else
-        {
-            // the collection of files get measured
-            _measureFiles( _vJavaSourceFiles );
-        }
-
-        _vPackageMetrics = new ArrayList();
-        for ( Iterator ePackages = _htPackages.keySet().iterator(); ePackages.hasNext(); )
-        {
-            String sPackage = (String) ePackages.next();
-
-            PackageMetric pckmNext = (PackageMetric) _htPackages.get( sPackage );
-            _vPackageMetrics.add( pckmNext );
-        }
-    }
-
-    public List getImports() {
-        return _vImports;
-    }
-
-    /**
-     * Return info about package statement.
-     * First element has name of package,
-     * then begin of line, etc.
-     */
-    public Object[] getPackage() {
-        return _aoPackage;
-    }
-
-    /**
-     * The same as getFunctionMetrics?!
-     */
-    public List/*<FunctionMetric>*/ getFunctions() {
-        return _vFunctionMetrics;
-    }
-
-    public Javancss( List/*<File>*/ vJavaSourceFiles_ )
-    {
-        _vJavaSourceFiles = vJavaSourceFiles_;
-        try {
-            _measureRoot(newReader(System.in));
-        } catch(Exception e) {
-            e.printStackTrace();
-        } catch(TokenMgrError pError) {
-            pError.printStackTrace();
-        }
-    }
-
-    public Javancss( File sJavaSourceFile_ )
-    {
-        Util.debug( "Javancss.<init>(String).sJavaSourceFile_: " + sJavaSourceFile_ );
-        _sErrorMessage = null;
-        _vJavaSourceFiles = new ArrayList();
-        _vJavaSourceFiles.add(sJavaSourceFile_);
-        try {
-            _measureRoot(newReader(System.in));
-        } catch(Exception e) {
-        	Util.debug( "Javancss.<init>(String).e: " + e );
-            e.printStackTrace();
-        } catch(TokenMgrError pError) {
-        	Util.debug( "Javancss.<init>(String).pError: " + pError );
-            pError.printStackTrace();
-        }
-    }
-
-    /*
-     * cobertura:  add this next constructor so any input stream can be used.
-     * 
-     * It should be a copy of the Javancss(String) constructor, but just
-     * make sure _vJavaSourceFiles is null.   _measureRoot will
-     * use the input stream if it is null.
-     */
-    public Javancss(InputStream isJavaSource_) {
-        Util.debug( "Javancss.<init>(InputStream).sJavaSourceFile_: " + isJavaSource_ );
-        _sErrorMessage = null;
-        _vJavaSourceFiles = null;
-
-        try {
-            _measureRoot(newReader(isJavaSource_));
-        } catch(Exception e) {
-        	Util.debug( "Javancss.<init>(InputStream).e: " + e );
-            e.printStackTrace();
-        } catch(TokenMgrError pError) {
-        	Util.debug( "Javancss.<init>(InputStream).pError: " + pError );
-            pError.printStackTrace();
-        }
-    }
-
-    /**
-     * Only way to create object that does not immediately
-     * start to parse.
-     */
-    public Javancss() {
-        super();
-
-        _sErrorMessage = null;
-        _thrwError = null;
-    }
-
-    public boolean parseImports() {
-        if ( _sJavaSourceFile == null ) {
-        	Util.debug( "Javancss.parseImports().NO_FILE" );
-
-            return true;
-        }
-        Reader reader = createSourceReader( _sJavaSourceFile );
-        if ( reader == null ) {
-        	Util.debug( "Javancss.parseImports().NO_DIS" );
-
-            return true;
-        }
-
-        try {
-            Util.debug( "Javancss.parseImports().START_PARSING" );
-            if ( Util.isDebug() == false ) {
-              _pJavaParser = (JavaParserInterface)(new JavaParser(reader));
-            } else {
-              _pJavaParser = (JavaParserInterface)(new JavaParserDebug(reader));
-            }
-            _pJavaParser.parseImportUnit();
-            _vImports = _pJavaParser.getImports();
-            _aoPackage = _pJavaParser.getPackageObjects();
-            Util.debug( "Javancss.parseImports().END_PARSING" );
-        } catch(Exception pParseException) {
-        	Util.debug( "Javancss.parseImports().PARSE_EXCEPTION" );
-            if (_sErrorMessage == null) {
-                _sErrorMessage = "";
-            }
-            _sErrorMessage += "ParseException in STDIN";
-            if (_pJavaParser != null) {
-                _sErrorMessage += "\nLast useful checkpoint: \"" + _pJavaParser.getLastFunction() + "\"\n";
-            }
-            _sErrorMessage += pParseException.getMessage() + "\n";
-            _thrwError = pParseException;
-
-            return true;
-        } catch(Error pTokenMgrError) {
-        	Util.debug( "Javancss.parseImports().TOKEN_ERROR" );
-            if (_sErrorMessage == null) {
-                _sErrorMessage = "";
-            }
-            _sErrorMessage += "TokenMgrError in STDIN\n";
-            _sErrorMessage += pTokenMgrError.getMessage() + "\n";
-            _thrwError = pTokenMgrError;
-
-            return true;
-        }
-
-        return false;
-    }
-
-    public void setSourceFile( File javaSourceFile_ ) {
-        _sJavaSourceFile = javaSourceFile_;
-        _vJavaSourceFiles = new ArrayList();
-        _vJavaSourceFiles.add(javaSourceFile_);
-    }
-    private Init _pInit = null;
-    public int getNcss() {
-        return _ncss;
-    }
-
-    public int getLOC() {
-        return _loc;
-    }
-
-    // added by SMS
-    public int getJvdc() {
-        return _pJavaParser.getJvdc();
-    }
-
-    /**
-     * JDCL stands for javadoc comment lines (while jvdc stands
-     * for number of javadoc comments).
-     */
-    public int getJdcl() {
-        return JavaParserTokenManager._iFormalComments;
-    }
-
-    public int getSl() {
-        return JavaParserTokenManager._iSingleComments;
-    }
-
-    public int getMl() {
-        return JavaParserTokenManager._iMultiComments;
-    }
-    //
-
-    public List getFunctionMetrics() {
-        return(_vFunctionMetrics);
-    }
-
-    public List/*<ObjectMetric>*/ getObjectMetrics() {
-        return(_vObjectMetrics);
-    }
-
-    /**
-     * Returns list of packages in the form
-     * PackageMetric objects.
-     */
-    public List getPackageMetrics() {
-        return(_vPackageMetrics);
-    }
-
-    public String getLastErrorMessage() {
-        if (_sErrorMessage == null) {
-            return null;
-        }
-        return _sErrorMessage;
-    }
-
-    public Throwable getLastError() {
-        return _thrwError;
-    }
-
-    public void setExit() {
-        _bExit = true;
-    }
-
-
-    public String getEncoding()
-    {
-        return encoding;
-    }
-
-    public void setEncoding( String encoding )
-    {
-        this.encoding = encoding;
-    }
-
-    private Reader newReader( InputStream stream ) throws UnsupportedEncodingException
-    {
-        return ( encoding == null ) ? new InputStreamReader( stream ) : new InputStreamReader( stream, encoding );
-    }
-
-    private Reader newReader( File file ) throws FileNotFoundException, UnsupportedEncodingException
-    {
-        return newReader( new FileInputStream( file ) );
-    }
-}
diff --git a/src/net/sourceforge/cobertura/javancss/Metric.java b/src/net/sourceforge/cobertura/javancss/Metric.java
deleted file mode 100644
index 0e73447..0000000
--- a/src/net/sourceforge/cobertura/javancss/Metric.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/*
-Copyright (C) 2000 Chr. Clemens Lee <clemens at kclee.com>.
-
-This file is part of JavaNCSS
-(http://www.kclee.com/clemens/java/javancss/).
-
-JavaNCSS 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 2, or (at your option) any
-later version.
-
-JavaNCSS 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 JavaNCSS; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-package net.sourceforge.cobertura.javancss;
-
-/**
- * Base data class to store all metrics common to packages, objects and functions.
- *
- * @author  Herv� Boutemy
- * @version $Id: Metric.java 121 2009-01-17 22:19:45Z hboutemy $
- */
-public abstract class Metric implements Comparable
-{
-    public String name = ".";
-    /** Non Commenting Source Statements (NCSS). */
-    public int ncss = 0;
-    public int javadocs = 0;
-    public int javadocsLn = 0;
-    public int singleLn = 0;
-    public int multiLn = 0;
-
-    public Metric()
-    {
-        super();
-    }
-
-    public void clear()
-    {
-        name = ".";
-        ncss = 0;
-        javadocs = 0;
-        javadocsLn = 0;
-        singleLn = 0;
-        multiLn = 0;
-    }
-
-    public String toString() {
-        return name;
-    }
-
-    public int compareTo( Object o )
-    {
-        return name.compareTo( ((Metric)o).name );
-    }
-
-    public boolean equals( Object o )
-    {
-        return compareTo( o ) == 0;
-    }
-
-    public int hashCode()
-    {
-        return name.hashCode();
-    }
-}
diff --git a/src/net/sourceforge/cobertura/javancss/ObjectMetric.java b/src/net/sourceforge/cobertura/javancss/ObjectMetric.java
deleted file mode 100644
index ea2ff26..0000000
--- a/src/net/sourceforge/cobertura/javancss/ObjectMetric.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/*
-Copyright (C) 2000 Chr. Clemens Lee <clemens at kclee.com>.
-
-This file is part of JavaNCSS
-(http://www.kclee.com/clemens/java/javancss/).
-
-JavaNCSS 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 2, or (at your option) any
-later version.
-
-JavaNCSS 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 JavaNCSS; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-package net.sourceforge.cobertura.javancss;
-
-/**
- * Basic data class to store all metrics attached to an object.
- *
- * @author  Herv� Boutemy
- * @version $Id: ObjectMetric.java 121 2009-01-17 22:19:45Z hboutemy $
- */
-public class ObjectMetric extends Metric
-{
-    /** Cyclomatic Complexity Number (McCabe metric) */
-    public int ccn = 0;
-    public int functions = 0;
-    public int classes = 0;
-
-    public ObjectMetric()
-    {
-        super();
-    }
-
-    public void clear()
-    {
-        super.clear();
-        ccn = 0;
-        functions = 0;
-        classes = 0;
-    }
-}
diff --git a/src/net/sourceforge/cobertura/javancss/PackageMetric.java b/src/net/sourceforge/cobertura/javancss/PackageMetric.java
deleted file mode 100644
index 525ab4a..0000000
--- a/src/net/sourceforge/cobertura/javancss/PackageMetric.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-package net.sourceforge.cobertura.javancss;
-
-/**
- * Basic data class to store all metrics attached to a package.
- *
- * @author  Chr. Clemens Lee <clemens at kclee.com>
- * @version $Id: PackageMetric.java 121 2009-01-17 22:19:45Z hboutemy $
- */
-public class PackageMetric extends Metric
-{
-    public int classes    = 0;
-    public int functions  = 0;
-
-    public PackageMetric()
-    {
-        super();
-    }
-
-    public void clear()
-    {
-        super.clear();
-        classes   = 0;
-        functions = 0;
-    }
-
-    public void add(PackageMetric pPackageMetric_) {
-        if (pPackageMetric_ == null) {
-            return;
-        }
-        classes    += pPackageMetric_.classes;
-        functions  += pPackageMetric_.functions;
-        ncss       += pPackageMetric_.ncss;
-
-        javadocs   += pPackageMetric_.javadocs;
-        javadocsLn += pPackageMetric_.javadocsLn;
-        singleLn   += pPackageMetric_.singleLn;
-        multiLn    += pPackageMetric_.multiLn;
-    }
-}
diff --git a/src/net/sourceforge/cobertura/javancss/coberturaREADME.txt b/src/net/sourceforge/cobertura/javancss/coberturaREADME.txt
deleted file mode 100644
index 9bd2694..0000000
--- a/src/net/sourceforge/cobertura/javancss/coberturaREADME.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-The files in this directory should not be modified directly.
-
-Instead the files in the javancss directory at the root of the cobertura project should be modified.
-
-See the coberturaREADME.txt file located in that directory.
\ No newline at end of file
diff --git a/src/net/sourceforge/cobertura/javancss/parser/JavaCharStream.java b/src/net/sourceforge/cobertura/javancss/parser/JavaCharStream.java
deleted file mode 100644
index 16fd28b..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/JavaCharStream.java
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 4.1 */
-/* JavaCCOptions:STATIC=false */
-package net.sourceforge.cobertura.javancss.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (with java-like unicode escape processing).
- */
-
-public class JavaCharStream
-{
-/** Whether parser is static. */
-  public static final boolean staticFlag = false;
-  static final int hexval(char c) throws java.io.IOException {
-    switch(c)
-    {
-       case '0' :
-          return 0;
-       case '1' :
-          return 1;
-       case '2' :
-          return 2;
-       case '3' :
-          return 3;
-       case '4' :
-          return 4;
-       case '5' :
-          return 5;
-       case '6' :
-          return 6;
-       case '7' :
-          return 7;
-       case '8' :
-          return 8;
-       case '9' :
-          return 9;
-
-       case 'a' :
-       case 'A' :
-          return 10;
-       case 'b' :
-       case 'B' :
-          return 11;
-       case 'c' :
-       case 'C' :
-          return 12;
-       case 'd' :
-       case 'D' :
-          return 13;
-       case 'e' :
-       case 'E' :
-          return 14;
-       case 'f' :
-       case 'F' :
-          return 15;
-    }
-
-    throw new java.io.IOException(); // Should never come here
-  }
-
-/** Position in buffer. */
-  public int bufpos = -1;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] nextCharBuf;
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int nextCharInd = -1;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-     char[] newbuffer = new char[bufsize + 2048];
-     int newbufline[] = new int[bufsize + 2048];
-     int newbufcolumn[] = new int[bufsize + 2048];
-
-     try
-     {
-        if (wrapAround)
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           System.arraycopy(buffer, 0, newbuffer,
-                                             bufsize - tokenBegin, bufpos);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-           bufcolumn = newbufcolumn;
-
-           bufpos += (bufsize - tokenBegin);
-        }
-        else
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           bufcolumn = newbufcolumn;
-
-           bufpos -= tokenBegin;
-        }
-     }
-     catch (Throwable t)
-     {
-        throw new Error(t.getMessage());
-     }
-
-     available = (bufsize += 2048);
-     tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-     int i;
-     if (maxNextCharInd == 4096)
-        maxNextCharInd = nextCharInd = 0;
-
-     try {
-        if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
-                                            4096 - maxNextCharInd)) == -1)
-        {
-           inputStream.close();
-           throw new java.io.IOException();
-        }
-        else
-           maxNextCharInd += i;
-        return;
-     }
-     catch(java.io.IOException e) {
-        if (bufpos != 0)
-        {
-           --bufpos;
-           backup(0);
-        }
-        else
-        {
-           bufline[bufpos] = line;
-           bufcolumn[bufpos] = column;
-        }
-        throw e;
-     }
-  }
-
-  protected char ReadByte() throws java.io.IOException
-  {
-     if (++nextCharInd >= maxNextCharInd)
-        FillBuff();
-
-     return nextCharBuf[nextCharInd];
-  }
-
-/** @return starting character for token. */
-  public char BeginToken() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        tokenBegin = bufpos;
-        return buffer[bufpos];
-     }
-
-     tokenBegin = 0;
-     bufpos = -1;
-
-     return readChar();
-  }
-
-  protected void AdjustBuffSize()
-  {
-     if (available == bufsize)
-     {
-        if (tokenBegin > 2048)
-        {
-           bufpos = 0;
-           available = tokenBegin;
-        }
-        else
-           ExpandBuff(false);
-     }
-     else if (available > tokenBegin)
-        available = bufsize;
-     else if ((tokenBegin - available) < 2048)
-        ExpandBuff(true);
-     else
-        available = tokenBegin;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-     column++;
-
-     if (prevCharIsLF)
-     {
-        prevCharIsLF = false;
-        line += (column = 1);
-     }
-     else if (prevCharIsCR)
-     {
-        prevCharIsCR = false;
-        if (c == '\n')
-        {
-           prevCharIsLF = true;
-        }
-        else
-           line += (column = 1);
-     }
-
-     switch (c)
-     {
-        case '\r' :
-           prevCharIsCR = true;
-           break;
-        case '\n' :
-           prevCharIsLF = true;
-           break;
-        case '\t' :
-           column--;
-           column += (tabSize - (column % tabSize));
-           break;
-        default :
-           break;
-     }
-
-     bufline[bufpos] = line;
-     bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        return buffer[bufpos];
-     }
-
-     char c;
-
-     if (++bufpos == available)
-        AdjustBuffSize();
-
-     if ((buffer[bufpos] = c = ReadByte()) == '\\')
-     {
-        UpdateLineColumn(c);
-
-        int backSlashCnt = 1;
-
-        for (;;) // Read all the backslashes
-        {
-           if (++bufpos == available)
-              AdjustBuffSize();
-
-           try
-           {
-              if ((buffer[bufpos] = c = ReadByte()) != '\\')
-              {
-                 UpdateLineColumn(c);
-                 // found a non-backslash char.
-                 if ((c == 'u') && ((backSlashCnt & 1) == 1))
-                 {
-                    if (--bufpos < 0)
-                       bufpos = bufsize - 1;
-
-                    break;
-                 }
-
-                 backup(backSlashCnt);
-                 return '\\';
-              }
-           }
-           catch(java.io.IOException e)
-           {
-              if (backSlashCnt > 1)
-                 backup(backSlashCnt-1);
-
-              return '\\';
-           }
-
-           UpdateLineColumn(c);
-           backSlashCnt++;
-        }
-
-        // Here, we have seen an odd number of backslash's followed by a 'u'
-        try
-        {
-           while ((c = ReadByte()) == 'u')
-              ++column;
-
-           buffer[bufpos] = c = (char)(hexval(c) << 12 |
-                                       hexval(ReadByte()) << 8 |
-                                       hexval(ReadByte()) << 4 |
-                                       hexval(ReadByte()));
-
-           column += 4;
-        }
-        catch(java.io.IOException e)
-        {
-           throw new Error("Invalid escape character at line " + line +
-                                         " column " + column + ".");
-        }
-
-        if (backSlashCnt == 1)
-           return c;
-        else
-        {
-           backup(backSlashCnt - 1);
-           return '\\';
-        }
-     }
-     else
-     {
-        UpdateLineColumn(c);
-        return c;
-     }
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-  public int getColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-  public int getLine() {
-     return bufline[bufpos];
-  }
-
-/** Get end column. */
-  public int getEndColumn() {
-     return bufcolumn[bufpos];
-  }
-
-/** Get end line. */
-  public int getEndLine() {
-     return bufline[bufpos];
-  }
-
-/** @return column of token start */
-  public int getBeginColumn() {
-     return bufcolumn[tokenBegin];
-  }
-
-/** @return line number of token start */
-  public int getBeginLine() {
-     return bufline[tokenBegin];
-  }
-
-/** Retreat. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-       bufpos += bufsize;
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-    nextCharBuf = new char[4096];
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-      nextCharBuf = new char[4096];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    nextCharInd = bufpos = -1;
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-                        int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-                        int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-
-  /** @return token image as String */
-  public String GetImage()
-  {
-     if (bufpos >= tokenBegin)
-        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-     else
-        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  /** @return suffix */
-  public char[] GetSuffix(int len)
-  {
-     char[] ret = new char[len];
-
-     if ((bufpos + 1) >= len)
-        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-     else
-     {
-        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                          len - bufpos - 1);
-        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-     }
-
-     return ret;
-  }
-
-  /** Set buffers back to null when finished. */
-  public void Done()
-  {
-     nextCharBuf = null;
-     buffer = null;
-     bufline = null;
-     bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-     int start = tokenBegin;
-     int len;
-
-     if (bufpos >= tokenBegin)
-     {
-        len = bufpos - tokenBegin + inBuf + 1;
-     }
-     else
-     {
-        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-     }
-
-     int i = 0, j = 0, k = 0;
-     int nextColDiff = 0, columnDiff = 0;
-
-     while (i < len &&
-            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-     {
-        bufline[j] = newLine;
-        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-        bufcolumn[j] = newCol + columnDiff;
-        columnDiff = nextColDiff;
-        i++;
-     }
-
-     if (i < len)
-     {
-        bufline[j] = newLine++;
-        bufcolumn[j] = newCol + columnDiff;
-
-        while (i++ < len)
-        {
-           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-              bufline[j] = newLine++;
-           else
-              bufline[j] = newLine;
-        }
-     }
-
-     line = bufline[j];
-     column = bufcolumn[j];
-  }
-
-}
-/* JavaCC - OriginalChecksum=a71d76bc4e3e50f1cadfe216520f8634 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/JavaParser.java b/src/net/sourceforge/cobertura/javancss/parser/JavaParser.java
deleted file mode 100644
index 5fcbc93..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/JavaParser.java
+++ /dev/null
@@ -1,10403 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParser.java */
-package net.sourceforge.cobertura.javancss.parser;
-
-import java.util.*;
-
-import net.sourceforge.cobertura.javancss.ccl.Util;
-
-import net.sourceforge.cobertura.javancss.FunctionMetric;
-import net.sourceforge.cobertura.javancss.ObjectMetric;
-import net.sourceforge.cobertura.javancss.PackageMetric;
-
-/**
- * Java source code parser based on a grammar compiled by
- * JavaCC from Java1.1.jj to the JavaParser class.<p>
- *
- * This class is responsible for parsing Java code and counting
- * all metrics during this parsing process.
- * The rest of the application is only responsible for invoking
- * this parser in a convenient way and to present the results
- * to the user.<p>
- *
- * This grammar is based on the Java grammar that comes as an
- * example with JavaCC, but has been extended to collect the
- * metrics data (and adapted to support real life and jdk 1.4
- * Java sources as well).
- *
- * @author    Sriram Sankar (original JavaCC grammar)
- *            , Chr. Clemens Lee <clemens at kclee.com> (JavaNCSS metrics)
- *            , additional counting of javadoc comments done by
- *              Emilio Gongora, <emilio at sms.nl> and
- *              Guillermo Rodriguez, <guille at sms.nl>.
- *            Anonymous class count patch by Vesa Karvonnen, <vesa_karvonen at hotmail.com> 2002-10-30.
- * @version   2000-01-31 $Id: Java1.1.jj 171 2009-05-31 20:12:01Z hboutemy $
- */
-public class JavaParser implements JavaParserInterface, JavaParserConstants {
-    {
-        /* // DEBUG MODE
-        Util.setDebug( true );
-        // */
-    }
-    private boolean _bReturn         = false;
-    private int     _ncss            = 0;     // general counter
-    private int     _loc             = 0;
-    private int     _cyc             = 1;
-    private int     _localCases      = 0;
-    private String  _sName           = "";    // name of last token
-    private String  _sParameter      = "";
-    private String  _sPackage        = "";
-    private String  _sClass          = "";
-    private String  _sFunction       = "";
-    private int     _functions       = 0;     // number of functions in this class
-    //private int     _topLevelClasses = 0;
-    private int     _classes         = 0;
-    private int     _classLevel      = 0;
-    private int     _anonClassCount  = 1;
-
-    private int     _jvdcLines = 0;           // added by SMS
-    private int     _jvdc      = 0;
-    private boolean _bPrivate  = true;//false;        // added by SMS
-    private boolean _bPublic   = true;        // added by SMS
-
-    /**
-     * For each class the number of formal
-     * comments in toplevel methods, constructors, inner
-     * classes, and for the class itself are counted.
-     * The top level comment has to be directly before
-     * the class definition, not before the package or
-     * import statement as it is often seen in source code
-     * examples (at the beginning of your source files you
-     * should instead put your copyright notice).
-     */
-    private int    _javadocs   = 0;              // global javadocs
-    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
-
-    /**
-     * Metrics for each class/interface are stored in this
-     * vector.
-     */
-    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
-    private List _vImports = new ArrayList();
-    private Object[] _aoPackage = null;
-    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
-    private PackageMetric _pPackageMetric;
-
-    private Token _tmpToken = null;
-    /** Argh, too much of a state machine. */
-    private Token _tmpResultToken = null;
-
-    private String _formatPackage(String sPackage_) {
-        if (sPackage_.equals("")) {
-            return ".";
-        }
-
-        return sPackage_.substring(0, sPackage_.length() - 1);
-    }
-
-    public void parse() throws Exception {
-      CompilationUnit();
-    }
-
-    public void parseImportUnit() throws Exception {
-      ImportUnit();
-    }
-
-    public int getNcss() {
-        return _ncss;
-    }
-
-    public int getLOC() {
-        return _loc;
-    }
-
-    // added by SMS
-    public int getJvdc() {
-        return _jvdc;
-    }
-
-    /*public int getTopLevelClasses() {
-      return _topLevelClasses;
-      }*/
-
-    public List/*<FunctionMetric>*/ getFunction() {
-        return _vFunctions;
-    }
-
-    /**
-     * @return Top level classes in sorted order
-     */
-    public List/*<ObjectMetric>*/ getObject() {
-        Collections.sort(_vClasses);
-        return _vClasses;
-    }
-
-    /**
-     * @return The empty package consists of the name ".".
-     */
-    public Map/*<String,PackageMetric>*/ getPackage() {
-        return _htPackage;
-    }
-
-    public List getImports() {
-        return _vImports;
-    }
-
-    /**
-     * name, beginLine, ...
-     */
-    public Object[] getPackageObjects() {
-        return _aoPackage;
-    }
-
-    /**
-     * if javancss is used with cat *.java a long
-     * input stream might get generated, so line
-     * number information in case of an parse exception
-     * is not very useful.
-     */
-    public String getLastFunction() {
-        return _sPackage + _sClass + _sFunction;
-    }
-
-   /**
-    * Class to hold modifiers.
-    */
-   static public final class ModifierSet
-   {
-     /* Definitions of the bits in the modifiers field.  */
-     public static final int PUBLIC = 0x0001;
-     public static final int PROTECTED = 0x0002;
-     public static final int PRIVATE = 0x0004;
-     public static final int ABSTRACT = 0x0008;
-     public static final int STATIC = 0x0010;
-     public static final int FINAL = 0x0020;
-     public static final int SYNCHRONIZED = 0x0040;
-     public static final int NATIVE = 0x0080;
-     public static final int TRANSIENT = 0x0100;
-     public static final int VOLATILE = 0x0200;
-     public static final int STRICTFP = 0x1000;
-
-     /** A set of accessors that indicate whether the specified modifier
-         is in the set. */
-
-     public boolean isPublic(int modifiers)
-     {
-       return (modifiers & PUBLIC) != 0;
-     }
-
-     public boolean isProtected(int modifiers)
-     {
-       return (modifiers & PROTECTED) != 0;
-     }
-
-     public boolean isPrivate(int modifiers)
-     {
-       return (modifiers & PRIVATE) != 0;
-     }
-
-     public boolean isStatic(int modifiers)
-     {
-       return (modifiers & STATIC) != 0;
-     }
-
-     public boolean isAbstract(int modifiers)
-     {
-       return (modifiers & ABSTRACT) != 0;
-     }
-
-     public boolean isFinal(int modifiers)
-     {
-       return (modifiers & FINAL) != 0;
-     }
-
-     public boolean isNative(int modifiers)
-     {
-       return (modifiers & NATIVE) != 0;
-     }
-
-     public boolean isStrictfp(int modifiers)
-     {
-       return (modifiers & STRICTFP) != 0;
-     }
-
-     public boolean isSynchronized(int modifiers)
-     {
-       return (modifiers & SYNCHRONIZED) != 0;
-     }
-
-     public boolean isTransient(int modifiers)
-      {
-       return (modifiers & TRANSIENT) != 0;
-     }
-
-     public boolean isVolatile(int modifiers)
-     {
-       return (modifiers & VOLATILE) != 0;
-     }
-
-     /**
-      * Removes the given modifier.
-      */
-     static int removeModifier(int modifiers, int mod)
-     {
-        return modifiers & ~mod;
-     }
-   }
-
-/*****************************************
- * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
- *****************************************/
-
-/*
- * Program structuring syntax follows.
- */
-  final public void CompilationUnit() throws ParseException {
-    int oldNcss = 0;
-
-    // added by SMS
-    int oldFormal = 0;
-    int oldSingle = 0;
-    int oldMulti  = 0;
-
-    JavaParserTokenManager._iSingleComments = 0;
-    JavaParserTokenManager._iMultiComments = 0;
-    JavaParserTokenManager._iFormalComments = 0;
-
-    JavaParserTokenManager._iMultiCommentsLast = 0;
-
-    _bPrivate = true;
-                _sPackage = "";
-                _pPackageMetric = new PackageMetric();      // this object manages the metrics
-
-    if (jj_2_1(2147483647)) {
-      PackageDeclaration();
-    } else {
-      ;
-    }
-    label_1:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPORT:
-        ;
-        break;
-      default:
-        jj_la1[0] = jj_gen;
-        break label_1;
-      }
-      ImportDeclaration();
-    }
-    label_2:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case CLASS:
-      case ENUM:
-      case FINAL:
-      case INTERFACE:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case SEMICOLON:
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[1] = jj_gen;
-        break label_2;
-      }
-      TypeDeclaration();
-    }
-             // Package classes and functions are set inside
-             // class and interface bodies.
-             _pPackageMetric.ncss = _ncss;
-
-             // added by SMS
-             _pPackageMetric.javadocsLn = JavaParserTokenManager._iFormalComments;
-             _pPackageMetric.singleLn   = JavaParserTokenManager._iSingleComments;
-             _pPackageMetric.multiLn    = JavaParserTokenManager._iMultiComments;
-             //
-
-             _htPackage.put(_formatPackage(_sPackage),
-                            _pPackageMetric);
-    label_3:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPORT:
-      case PACKAGE:
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[2] = jj_gen;
-        break label_3;
-      }
-      oldNcss = _ncss;
-      _sPackage = "";
-      _pPackageMetric = new PackageMetric();
-
-      // added by SMS
-      oldFormal = JavaParserTokenManager._iFormalComments;
-      oldSingle = JavaParserTokenManager._iSingleComments;
-      oldMulti  = JavaParserTokenManager._iMultiComments;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PACKAGE:
-      case AT:
-        PackageDeclaration();
-        break;
-      case IMPORT:
-        ImportDeclaration();
-        break;
-      default:
-        jj_la1[3] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      label_4:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPORT:
-          ;
-          break;
-        default:
-          jj_la1[4] = jj_gen;
-          break label_4;
-        }
-        ImportDeclaration();
-      }
-      label_5:
-      while (true) {
-        TypeDeclaration();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case CLASS:
-        case ENUM:
-        case FINAL:
-        case INTERFACE:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case SEMICOLON:
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[5] = jj_gen;
-          break label_5;
-        }
-      }
-      // Package classes and functions are set inside
-      // class and interface bodies.
-      _pPackageMetric.ncss = _ncss - oldNcss;
-
-      // added by SMS
-      _pPackageMetric.javadocsLn = JavaParserTokenManager._iFormalComments - oldFormal;
-      _pPackageMetric.singleLn   = JavaParserTokenManager._iSingleComments - oldSingle;
-      _pPackageMetric.multiLn    = JavaParserTokenManager._iMultiComments  - oldMulti;
-      //
-
-      PackageMetric pckmPrevious = (PackageMetric)_htPackage.
-             get(_formatPackage(_sPackage));
-      _pPackageMetric.add(pckmPrevious);
-      _htPackage.put(_formatPackage(_sPackage),
-                     _pPackageMetric);
-    }
-    jj_consume_token(0);
-             Token pToken = getToken(1);
-             _loc = pToken.endLine;
-  }
-
-  final public void ImportUnit() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case PACKAGE:
-    case AT:
-      PackageDeclaration();
-      break;
-    default:
-      jj_la1[6] = jj_gen;
-      ;
-    }
-    label_6:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPORT:
-        ;
-        break;
-      default:
-        jj_la1[7] = jj_gen;
-        break label_6;
-      }
-      ImportDeclaration();
-    }
-    label_7:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case PUBLIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-        ;
-        break;
-      default:
-        jj_la1[8] = jj_gen;
-        break label_7;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-        break;
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-        break;
-      case SYNCHRONIZED:
-        jj_consume_token(SYNCHRONIZED);
-        break;
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-        break;
-      default:
-        jj_la1[9] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case CLASS:
-      jj_consume_token(CLASS);
-      break;
-    case INTERFACE:
-      jj_consume_token(INTERFACE);
-      break;
-    default:
-      jj_la1[10] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void PackageDeclaration() throws ParseException {
-    int beginLine = 1;
-    int beginColumn = 1;
-    label_8:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[11] = jj_gen;
-        break label_8;
-      }
-      Annotation();
-    }
-    jj_consume_token(PACKAGE);
-      _anonClassCount = 1;
-
-      Token pToken = getToken( 0 );
-      beginLine = pToken.beginLine ;
-      beginColumn = pToken.beginColumn;
-      _aoPackage = new Object[ 5 ];
-    Name();
-      _aoPackage[ 0 ] = _sName;
-      _aoPackage[ 1 ] = new Integer( beginLine );
-      _aoPackage[ 2 ] = new Integer( beginColumn );
-    jj_consume_token(SEMICOLON);
-      _aoPackage[ 3 ] = new Integer( getToken( 0 ).endLine );
-      _aoPackage[ 4 ] = new Integer( getToken( 0 ).endColumn );
-      _ncss++;
-      Util.debug( "_ncss++" );
-      _sPackage = _sName + ".";
-  }
-
-  final public void ImportDeclaration() throws ParseException {
-    int beginLine = 1;
-    int beginColumn = 1;
-    Object[] aoImport = null;
-    jj_consume_token(IMPORT);
-      Token pToken = getToken( 0 );
-      beginLine = pToken.beginLine ;
-      beginColumn = pToken.beginColumn;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case STATIC:
-      jj_consume_token(STATIC);
-      break;
-    default:
-      jj_la1[12] = jj_gen;
-      ;
-    }
-    Name();
-      aoImport = new Object[ 5 ];
-      aoImport[ 0 ] = _sName;
-      aoImport[ 1 ] = new Integer( beginLine );
-      aoImport[ 2 ] = new Integer( beginColumn );
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case DOT:
-      jj_consume_token(DOT);
-      jj_consume_token(STAR);
-              aoImport[ 0 ] = aoImport[ 0 ].toString() + ".*";
-      break;
-    default:
-      jj_la1[13] = jj_gen;
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-      aoImport[ 3 ] = new Integer( getToken( 0 ).endLine );
-      aoImport[ 4 ] = new Integer( getToken( 0 ).endColumn );
-      _vImports.add( aoImport );
-      _ncss++;
-      Util.debug( "_ncss++" );
-  }
-
-  final public void TypeDeclaration() throws ParseException {
-   int modifiers;
-    if (jj_2_2(2147483647)) {
-      ClassDeclaration();
-    } else if (jj_2_3(2147483647)) {
-      modifiers = Modifiers();
-      EnumDeclaration(modifiers);
-    } else if (jj_2_4(2147483647)) {
-      InterfaceDeclaration();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case AT:
-        modifiers = Modifiers();
-        AnnotationTypeDeclaration(modifiers);
-        break;
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        break;
-      default:
-        jj_la1[14] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-/*
- * Declaration syntax follows.
- */
-  final public void ClassDeclaration() throws ParseException {
-    Token tmpToken = null;
-    _javadocs = 0;
-    ObjectMetric metric = null;
-
-    // added by SMS
-    int oldSingle = 0;
-    int oldMulti  = 0;
-
-    _jvdcLines    = 0;
-    boolean bTemp = _bPublic;
-    _bPublic      = false;
-    //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case AT:
-         myToken = getToken(1);
-      Annotation();
-         tmpToken = myToken;
-      break;
-    default:
-      jj_la1[15] = jj_gen;
-      ;
-    }
-    label_9:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[16] = jj_gen;
-        break label_9;
-      }
-      Annotation();
-    }
-    label_10:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case PUBLIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-        ;
-        break;
-      default:
-        jj_la1[17] = jj_gen;
-        break label_10;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-      _bPublic = true;         // added by SMS
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case SYNCHRONIZED:
-        jj_consume_token(SYNCHRONIZED);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      default:
-        jj_la1[18] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 1 );
-      }
-      while( tmpToken.specialToken != null ) {
-          if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-              _javadocs++;
-              Util.debug( "ClassDeclaration()._javadocs++" );
-              if (_bPublic || _bPrivate) {
-                  Util.debug( "_jvdc++" );
-                  _jvdc++;
-                  _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
-                  JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
-              }
-              JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
-              break;
-          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-              break;
-          }
-
-          //System.out.println("\n"+tmpToken.specialToken.image);
-
-          tmpToken = tmpToken.specialToken;
-      }
-
-      oldSingle = JavaParserTokenManager._iSingleComments;
-      oldMulti = JavaParserTokenManager._iMultiComments;
-    UnmodifiedClassDeclaration();
-             /* removed by SMS
-             while( tmpToken.specialToken != null ) {
-                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                     _javadocs++;
-                 }
-                 tmpToken = tmpToken.specialToken;
-             }
-             */
-             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1);
-             metric.javadocs = _javadocs;
-
-             // added by SMS
-             metric.javadocsLn = _jvdcLines;
-             metric.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
-             metric.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
-             //
-
-            // added by SMS
-            _bPublic = bTemp;
-  }
-
-  final public void UnmodifiedClassDeclaration() throws ParseException {
-        String sOldClass = _sClass;
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        int oldClasses = _classes;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                int oldJavadocs = _javadocs;
-                if (!_sClass.equals("")) {
-                        _sClass += ".";
-                }
-                _sClass += getToken(2).image;
-                _classLevel ++;
-    Modifiers();
-    jj_consume_token(CLASS);
-    Identifier();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      jj_la1[19] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      jj_consume_token(EXTENDS);
-      Name();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeArguments();
-        break;
-      default:
-        jj_la1[20] = jj_gen;
-        ;
-      }
-      label_11:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case DOT:
-          ;
-          break;
-        default:
-          jj_la1[21] = jj_gen;
-          break label_11;
-        }
-        jj_consume_token(DOT);
-        Name();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-          TypeArguments();
-          break;
-        default:
-          jj_la1[22] = jj_gen;
-          ;
-        }
-      }
-      break;
-    default:
-      jj_la1[23] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IMPLEMENTS:
-      jj_consume_token(IMPLEMENTS);
-      NameList();
-      break;
-    default:
-      jj_la1[24] = jj_gen;
-      ;
-    }
-    ClassBody();
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _classLevel--;
-                if (_classLevel == 0) {
-                        //_topLevelClasses++;
-                        ObjectMetric metric = new ObjectMetric();
-                        metric.name = _sPackage + _sClass;
-                        metric.ncss = _ncss - oldNcss;
-                        metric.functions = _functions - oldFunctions;
-                        metric.classes = _classes - oldClasses;
-                        Token lastToken = getToken( 0 );
-                        //metric.add( new Integer( lastToken.endLine ) );
-                        //metric.add( new Integer( lastToken.endColumn ) );
-                        //metric.add( new Integer( _javadocs ) );
-                        _vClasses.add( metric );
-                        _pPackageMetric.functions += _functions - oldFunctions;
-                        _pPackageMetric.classes++;
-
-                        // added by SMS
-                        _pPackageMetric.javadocs += _javadocs;
-                        //_pPackageMetric.javadocsLn += JavaParserTokenManager._iFormalComments - oldFormal;
-                        //_pPackageMetric.singleLn += JavaParserTokenManager._iSingleComments - oldSingle;
-                        //_pPackageMetric.multiLn += JavaParserTokenManager._iMultiComments - oldMulti;
-                        //
-                }
-                        //Added by REYNAUD Sebastien (LOGICA)
-                        else
-                        {
-                        ObjectMetric metric1 = new ObjectMetric();
-                  metric1.name = _sPackage + _sClass ;
-                        metric1.ncss = _ncss - oldNcss;
-                  metric1.functions = _functions - oldFunctions;
-                  metric1.classes = _classes - oldClasses;
-                  Token lastToken = getToken( 0 );
-                  _vClasses.add( metric1 );
-                  _pPackageMetric.functions += _functions - oldFunctions;
-                  _pPackageMetric.classes++;
-                        metric1.javadocs = _javadocs - oldJavadocs;
-                        }
-                        //
-
-                _functions = oldFunctions;
-                _classes = oldClasses + 1;
-                _sClass = sOldClass;
-  }
-
-  final public void ClassBody() throws ParseException {
-    jj_consume_token(LBRACE);
-    label_12:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOID:
-      case VOLATILE:
-      case IDENTIFIER:
-      case LBRACE:
-      case SEMICOLON:
-      case AT:
-      case LT:
-        ;
-        break;
-      default:
-        jj_la1[25] = jj_gen;
-        break label_12;
-      }
-      ClassBodyDeclaration();
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void NestedClassDeclaration() throws ParseException {
-    // added by SMS
-    Token tmpToken = null;
-
-    boolean bTemp = _bPublic;
-    _bPublic = false;
-    boolean bPublic = false;
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case AT:
-         myToken = getToken(1);
-      Annotation();
-         tmpToken = myToken;
-      break;
-    default:
-      jj_la1[26] = jj_gen;
-      ;
-    }
-    label_13:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[27] = jj_gen;
-        break label_13;
-      }
-      Annotation();
-    }
-        if(tmpToken==null)
-        {
-                tmpToken = getToken( 1 );
-        }
-    label_14:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-        ;
-        break;
-      default:
-        jj_la1[28] = jj_gen;
-        break label_14;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-        break;
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-               bPublic = true;
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-                  bPublic = true;
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-        break;
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-        break;
-      default:
-        jj_la1[29] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-                        //tmpToken = getToken( 0 );//Removed by REYNAUD Sebastien (LOGICA)
-
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        Util.debug( "NestedClassDeclaration()._javadocs++" );
-                        if ((_bPublic && bPublic) || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
-                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-    UnmodifiedClassDeclaration();
-       //added by SMS
-      _bPublic = bTemp;
-  }
-
-  final public void ClassBodyDeclaration() throws ParseException {
-    int modifiers;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case SEMICOLON:
-      EmptyStatement();
-      break;
-    default:
-      jj_la1[31] = jj_gen;
-      if (jj_2_5(2)) {
-        Initializer();
-      } else if (jj_2_6(2147483647)) {
-        modifiers = Modifiers();
-        AnnotationTypeDeclaration(modifiers);
-      } else if (jj_2_7(2147483647)) {
-        CreationAnnotation();
-      } else if (jj_2_8(2147483647)) {
-        NestedClassDeclaration();
-      } else if (jj_2_9(2147483647)) {
-        //LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface" )
-          modifiers = Modifiers();
-        NestedInterfaceDeclaration();
-      } else if (jj_2_10(2147483647)) {
-        modifiers = Modifiers();
-        EnumDeclaration(modifiers);
-      } else if (jj_2_11(2147483647)) {
-        ConstructorDeclaration();
-      } else if (jj_2_12(2147483647)) {
-        MethodDeclaration();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TRANSIENT:
-        case VOLATILE:
-        case IDENTIFIER:
-        case AT:
-          label_15:
-          while (true) {
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case AT:
-              ;
-              break;
-            default:
-              jj_la1[30] = jj_gen;
-              break label_15;
-            }
-            Annotation();
-          }
-          FieldDeclaration();
-          break;
-        default:
-          jj_la1[32] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    }
-  }
-
-// This production is to determine lookahead only.
-  final public void MethodDeclarationLookahead() throws ParseException {
-    label_16:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[33] = jj_gen;
-        break label_16;
-      }
-      Annotation();
-    }
-    label_17:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-        ;
-        break;
-      default:
-        jj_la1[34] = jj_gen;
-        break label_17;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-        break;
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-        break;
-      case NATIVE:
-        jj_consume_token(NATIVE);
-        break;
-      case SYNCHRONIZED:
-        jj_consume_token(SYNCHRONIZED);
-        break;
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-        break;
-      default:
-        jj_la1[35] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    label_18:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[36] = jj_gen;
-        break label_18;
-      }
-      Annotation();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      jj_la1[37] = jj_gen;
-      ;
-    }
-    ResultType();
-    Identifier();
-    jj_consume_token(LPAREN);
-  }
-
-  final public void InterfaceDeclaration() throws ParseException {
-        Token tmpToken = null;
-        _javadocs = 0;
-        //boolean bClassComment = false;
-        ObjectMetric metric = null;
-
-        // added by SMS
-        int oldSingle;
-        int oldMulti;
-
-        _jvdcLines = 0;
-        boolean bTemp = _bPublic;
-        _bPublic = false;
-        //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken=null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case AT:
-         myToken = getToken(1);
-      Annotation();
-         tmpToken = myToken;
-      break;
-    default:
-      jj_la1[38] = jj_gen;
-      ;
-    }
-    label_19:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[39] = jj_gen;
-        break label_19;
-      }
-      Annotation();
-    }
-    label_20:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case PUBLIC:
-      case TESTAAAA:
-        ;
-        break;
-      default:
-        jj_la1[40] = jj_gen;
-        break label_20;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-        break;
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-      _bPublic = true;         // added by SMS
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      default:
-        jj_la1[41] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 1 );
-      }
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        Util.debug( "InterfaceDeclaration()._javadocs++" );
-                        if (_bPublic || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
-                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-
-                oldSingle = JavaParserTokenManager._iSingleComments;
-                oldMulti = JavaParserTokenManager._iMultiComments;
-    UnmodifiedInterfaceDeclaration();
-             /* removed by SMS
-             while( tmpToken.specialToken != null ) {
-                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                     _javadocs++;
-                     bClassComment = true;
-                 }
-                 tmpToken = tmpToken.specialToken;
-                 }*/
-             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1 );
-             metric.javadocs = _javadocs;
-
-             // added by SMS
-             metric.javadocsLn = _jvdcLines;
-             metric.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
-             metric.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
-             //
-
-            // added by SMS
-            _bPublic = bTemp;
-  }
-
-  final public void NestedInterfaceDeclaration() throws ParseException {
-    // added by SMS
-    Token tmpToken = null;
-
-    boolean bTemp = _bPublic;
-    _bPublic = false;
-    boolean bPublic = false;
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken=null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case AT:
-         myToken = getToken(1);
-      Annotation();
-         tmpToken = myToken;
-      break;
-    default:
-      jj_la1[42] = jj_gen;
-      ;
-    }
-    label_21:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[43] = jj_gen;
-        break label_21;
-      }
-      Annotation();
-    }
-        if(tmpToken==null)
-        {
-                tmpToken = getToken( 1 );
-        }
-    label_22:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-        ;
-        break;
-      default:
-        jj_la1[44] = jj_gen;
-        break label_22;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-        break;
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-               bPublic = true;
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-                  bPublic = true;
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-        break;
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-        break;
-      default:
-        jj_la1[45] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-                        //tmpToken = getToken( 0 );	//Removed by REYNAUD Sebastien (LOGICA)
-
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        if ((_bPublic && bPublic) || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
-                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-    UnmodifiedInterfaceDeclaration();
-      // added by SMS
-      _bPublic = bTemp;
-  }
-
-  final public void UnmodifiedInterfaceDeclaration() throws ParseException {
-        String sOldClass = _sClass;
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        int oldClasses = _classes;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                int oldJavadocs = _javadocs;
-                if (!_sClass.equals("")) {
-                        _sClass += ".";
-                }
-                _sClass += getToken(2).image;
-                _classLevel ++;
-    jj_consume_token(INTERFACE);
-    Identifier();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      jj_la1[46] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      jj_consume_token(EXTENDS);
-      NameList();
-      break;
-    default:
-      jj_la1[47] = jj_gen;
-      ;
-    }
-    jj_consume_token(LBRACE);
-    label_23:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOID:
-      case VOLATILE:
-      case IDENTIFIER:
-      case SEMICOLON:
-      case AT:
-      case LT:
-        ;
-        break;
-      default:
-        jj_la1[48] = jj_gen;
-        break label_23;
-      }
-      InterfaceMemberDeclaration();
-    }
-    jj_consume_token(RBRACE);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _classLevel--;
-                if (_classLevel == 0)
-                {
-                        //_topLevelClasses++;
-                        ObjectMetric metric = new ObjectMetric();
-                        metric.name = _sPackage + _sClass;
-                        metric.ncss = _ncss - oldNcss;
-                        metric.functions = _functions - oldFunctions;
-                        metric.classes = _classes - oldClasses;
-                        //metric.add( Util.getConstantObject() );
-                        //metric.add( Util.getConstantObject() );
-                        _vClasses.add( metric );
-                        _pPackageMetric.functions += _functions - oldFunctions;
-                        _pPackageMetric.classes++;
-
-                        // added by SMS
-                        _pPackageMetric.javadocs += _javadocs;
-                        //_pPackageMetric.javadocsLn += JavaParserTokenManager._iFormalComments - oldFormal;
-                        //_pPackageMetric.singleLn += JavaParserTokenManager._iSingleComments - oldSingle;
-                        //_pPackageMetric.multiLn += JavaParserTokenManager._iMultiComments - oldMulti;
-                        //
-                }
-                        //Added by REYNAUD Sebastien (LOGICA)
-                        else
-                        {
-                        ObjectMetric metric1 = new ObjectMetric();
-                  metric1.name = _sPackage + _sClass;
-                        metric1.ncss = _ncss - oldNcss;
-                  metric1.functions = _functions - oldFunctions;
-                  metric1.classes = _classes - oldClasses;
-                  Token lastToken = getToken( 0 );
-                  _vClasses.add( metric1 );
-                  _pPackageMetric.functions += _functions - oldFunctions;
-                  _pPackageMetric.classes++;
-                        //_pPackageMetric.javadocs += _javadocs;
-                        metric1.javadocs = _javadocs - oldJavadocs;
-                        }
-                        //
-
-                _functions = oldFunctions;
-                _classes = oldClasses + 1;
-                _sClass = sOldClass;
-  }
-
-  final public void InterfaceMemberDeclaration() throws ParseException {
-   int modifiers;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case SEMICOLON:
-      EmptyStatement();
-      break;
-    default:
-      jj_la1[49] = jj_gen;
-      if (jj_2_13(2147483647)) {
-        NestedClassDeclaration();
-      } else if (jj_2_14(2147483647)) {
-        NestedInterfaceDeclaration();
-      } else if (jj_2_15(2147483647)) {
-        modifiers = Modifiers();
-        EnumDeclaration(modifiers);
-      } else if (jj_2_16(2147483647)) {
-        MethodDeclaration();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case IDENTIFIER:
-        case AT:
-          modifiers = Modifiers();
-          FieldDeclaration();
-          break;
-        default:
-          jj_la1[50] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    }
-  }
-
-  final public void FieldDeclaration() throws ParseException {
-    // added by SMS
-    Token tmpToken = null;
-    boolean bPublic = false;
-    label_24:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case FINAL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TRANSIENT:
-      case VOLATILE:
-        ;
-        break;
-      default:
-        jj_la1[51] = jj_gen;
-        break label_24;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-               bPublic = true;
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-                  bPublic = true;
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-        break;
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-        break;
-      case TRANSIENT:
-        jj_consume_token(TRANSIENT);
-        break;
-      case VOLATILE:
-        jj_consume_token(VOLATILE);
-        break;
-      default:
-        jj_la1[52] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-                tmpToken = getToken( 0 );
-
-                while( tmpToken.specialToken != null )
-                {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) )
-                    {
-                        if ((bPublic && _bPublic) || _bPrivate)
-                        {
-                            //_javadocs++;
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserTokenManager._iMultiCommentsLast;
-                            JavaParserTokenManager._iFormalComments += JavaParserTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserTokenManager._iMultiComments -= JavaParserTokenManager._iMultiCommentsLast;
-                        break;
-                    }
-                    else if ( tmpToken.specialToken.image.startsWith( "/*" ) )
-                    {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-    label_25:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[53] = jj_gen;
-        break label_25;
-      }
-      Annotation();
-    }
-    Type();
-    VariableDeclarator();
-    label_26:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[54] = jj_gen;
-        break label_26;
-      }
-      jj_consume_token(COMMA);
-      VariableDeclarator();
-    }
-    jj_consume_token(SEMICOLON);
-    _ncss++; Util.debug( "_ncss++" );
-  }
-
-  final public void VariableDeclarator() throws ParseException {
-    VariableDeclaratorId();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSIGN:
-      jj_consume_token(ASSIGN);
-      VariableInitializer();
-      break;
-    default:
-      jj_la1[55] = jj_gen;
-      ;
-    }
-  }
-
-  final public void VariableDeclaratorId() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ENUM:
-      jj_consume_token(ENUM);
-      break;
-    case ASSERT:
-    case IDENTIFIER:
-      Identifier();
-      break;
-    default:
-      jj_la1[56] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    label_27:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        ;
-        break;
-      default:
-        jj_la1[57] = jj_gen;
-        break label_27;
-      }
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-                                          _sName += "[]";
-    }
-  }
-
-  final public void VariableInitializer() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LBRACE:
-      ArrayInitializer();
-      break;
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      Expression();
-      break;
-    default:
-      jj_la1[58] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ArrayInitializer() throws ParseException {
-    jj_consume_token(LBRACE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      VariableInitializer();
-      label_28:
-      while (true) {
-        if (jj_2_17(2)) {
-          ;
-        } else {
-          break label_28;
-        }
-        jj_consume_token(COMMA);
-        VariableInitializer();
-      }
-      break;
-    default:
-      jj_la1[59] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COMMA:
-      jj_consume_token(COMMA);
-      break;
-    default:
-      jj_la1[60] = jj_gen;
-      ;
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void MethodDeclaration() throws ParseException {
-    int oldNcss = _ncss;
-    int oldFunctions = _functions;
-    String sOldFunction = _sFunction;
-    int oldcyc = _cyc;
-    boolean bOldReturn = _bReturn;
-    Token tmpToken = null;
-    int jvdc = 0;
-
-    // added by SMS
-    int jvdcLines = 0;
-    int oldSingle;
-    int oldMulti;
-    boolean bPublic = false;
-    //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-        _tmpToken=null;
-    if ( _tmpToken != null )
-    {
-        tmpToken = _tmpToken;
-    }
-    label_29:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[61] = jj_gen;
-        break label_29;
-      }
-         myToken = getToken(1);
-      Annotation();
-      if ( tmpToken == null ) {
-
-          //tmpToken = getToken( 0 ); //Removed by REYNAUD Sebastien (LOGICA)
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                tmpToken = myToken;
-                //
-      }
-    }
-    label_30:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-        ;
-        break;
-      default:
-        jj_la1[62] = jj_gen;
-        break label_30;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-               bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-                    bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case STATIC:
-        jj_consume_token(STATIC);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case NATIVE:
-        jj_consume_token(NATIVE);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case SYNCHRONIZED:
-        jj_consume_token(SYNCHRONIZED);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      default:
-        jj_la1[63] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    label_31:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[64] = jj_gen;
-        break label_31;
-      }
-      Annotation();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      jj_la1[65] = jj_gen;
-      ;
-    }
-               _tmpResultToken = null;
-    ResultType();
-            if ( tmpToken == null )
-            {
-                tmpToken = _tmpResultToken;
-                if ( tmpToken == null )
-                {
-                    tmpToken = getToken( 0 );
-                }
-                Util.debug( "result type tmpToken: " + tmpToken );
-            }
-    MethodDeclarator();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case THROWS:
-      jj_consume_token(THROWS);
-      NameList();
-      break;
-    default:
-      jj_la1[66] = jj_gen;
-      ;
-    }
-                _cyc = 1;
-                _bReturn = false;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LBRACE:
-      Block();
-      break;
-    case SEMICOLON:
-      jj_consume_token(SEMICOLON);
-      break;
-    default:
-      jj_la1[67] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  // added by SMS
-  {
-      Util.debug( "Token: " + String.valueOf( tmpToken.image ) );
-      while( tmpToken.specialToken != null )
-      {
-          Util.debug( "Token comment: " + String.valueOf( tmpToken.specialToken.image ) );
-          if ( tmpToken.specialToken.image.startsWith( "/**" ) )
-          {
-              _javadocs++;
-              Util.debug( "MethodDeclaration()._javadocs++" );
-              jvdc++;
-              if ((bPublic && _bPublic) || _bPrivate) {
-                  Util.debug( "_jvdc++" );
-                  _jvdc++;
-                  jvdcLines = JavaParserTokenManager._iMultiCommentsLast;
-                  _jvdcLines += jvdcLines;
-                  JavaParserTokenManager._iFormalComments += jvdcLines;
-              }
-              JavaParserTokenManager._iMultiComments -= jvdcLines;
-              break;
-          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-              jvdcLines = 0;
-              break;
-          }
-
-          //System.out.println("\n"+tmpToken.specialToken.image);
-
-          tmpToken = tmpToken.specialToken;
-      }
-
-      oldSingle = JavaParserTokenManager._iSingleComments;
-      oldMulti = JavaParserTokenManager._iMultiComments;
-  }
-
-
-             // removed by ccl
-             /*
-             while( tmpToken.specialToken != null ) {
-                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                     jvdc++;
-                     _javadocs++;
-                 }
-                 tmpToken = tmpToken.specialToken;
-             }
-             */
-             // removed by SMS
-             /*
-               while( tmpToken.specialToken != null ) {
-               if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-               jvdc++;
-               _javadocs++;
-               _bJavadoc = true;
-               }
-
-               tmpToken = tmpToken.specialToken;
-               }
-             */
-
-             if (_bReturn)
-             {
-                 _cyc--;
-             }
-             _ncss++;
-             Util.debug( "MethodDeclaration()._ncss++" );
-
-             FunctionMetric functionMetrics = new FunctionMetric();
-             functionMetrics.name = _sPackage + _sClass + _sFunction;
-             functionMetrics.ncss = _ncss - oldNcss;
-             functionMetrics.ccn = _cyc;
-             functionMetrics.javadocs = jvdc;
-
-             // added by SMS
-             functionMetrics.javadocsLn = 0; //jvdcLines;
-             functionMetrics.singleLn = 0; //JavaParserTokenManager._iSingleComments - oldSingle;
-             functionMetrics.multiLn = 0; //JavaParserTokenManager._iMultiComments - oldMulti;
-             //
-
-             // specially added for Cobertura
-             // Commenting out for now until the rest of patch 2353196 is applied.
-             //functionMetrics.beginLine = (new Integer(beginLine));
-             //functionMetrics.endLine = (new Integer(endLine));
-
-             _vFunctions.add(functionMetrics);
-             _sFunction = sOldFunction;
-             _functions = oldFunctions + 1;
-             _cyc = oldcyc;
-             _bReturn = bOldReturn;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                _tmpToken = null;
-                //
-
-  }
-
-  final public void MethodDeclarator() throws ParseException {
-                _sFunction = "." + getToken(1).image;
-    Identifier();
-    FormalParameters();
-                _sFunction += _sParameter;
-    label_32:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        ;
-        break;
-      default:
-        jj_la1[68] = jj_gen;
-        break label_32;
-      }
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-              _sFunction += "[]";
-    }
-  }
-
-  final public void FormalParameters() throws ParseException {
-                _sParameter = "(";
-    jj_consume_token(LPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FINAL:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case SHORT:
-    case STATIC:
-    case TESTAAAA:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case IDENTIFIER:
-    case AT:
-      FormalParameter();
-                            _sParameter += _sName;
-      label_33:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[69] = jj_gen;
-          break label_33;
-        }
-        jj_consume_token(COMMA);
-        FormalParameter();
-                            _sParameter += "," + _sName;
-      }
-      break;
-    default:
-      jj_la1[70] = jj_gen;
-      ;
-    }
-    jj_consume_token(RPAREN);
-                _sParameter += ")";
-  }
-
-  final public void FormalParameter() throws ParseException {
-    Modifiers();
-    Type();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ELLIPSIS:
-      jj_consume_token(ELLIPSIS);
-      break;
-    default:
-      jj_la1[71] = jj_gen;
-      ;
-    }
-    VariableDeclaratorId();
-  }
-
-  final public void ConstructorDeclaration() throws ParseException {
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        String sOldFunction = _sFunction;
-        int oldcyc = _cyc;
-        boolean bOldReturn = _bReturn;
-        Token tmpToken = null;
-        int jvdc = 0;
-
-        // added by SMS
-        int oldSingle;
-        int oldMulti;
-        int jvdcLines = 0;
-        boolean bPublic = false;
-        //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-    label_34:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[72] = jj_gen;
-        break label_34;
-      }
-         myToken = getToken(1);
-      Annotation();
-        if ( tmpToken == null )
-                {
-                        tmpToken = myToken;
-        }
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-               bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-                 bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-        break;
-      default:
-        jj_la1[73] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      jj_la1[74] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      jj_la1[75] = jj_gen;
-      ;
-    }
-    Identifier();
-            if ( tmpToken == null ) {
-                tmpToken = getToken( 0 );
-            }
-                _cyc = 1;
-                _sFunction = _sPackage + _sClass + "." + getToken(0).image;
-    FormalParameters();
-                _sFunction += _sParameter;
-                _bReturn = false;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case THROWS:
-      jj_consume_token(THROWS);
-      NameList();
-      break;
-    default:
-      jj_la1[76] = jj_gen;
-      ;
-    }
-    jj_consume_token(LBRACE);
-    if (jj_2_18(2147483647)) {
-      ExplicitConstructorInvocation();
-    } else {
-      ;
-    }
-    if (jj_2_19(2147483647)) {
-      ExplicitConstructorInvocation();
-    } else {
-      ;
-    }
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        jvdc++;
-                        if ((bPublic && _bPublic) || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            jvdcLines = JavaParserTokenManager._iMultiCommentsLast;
-                            _jvdcLines += jvdcLines;
-                            JavaParserTokenManager._iFormalComments += jvdcLines;
-                        }
-                        JavaParserTokenManager._iMultiComments -= jvdcLines;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        jvdcLines = 0;
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-
-
-                oldSingle = JavaParserTokenManager._iSingleComments;
-                oldMulti = JavaParserTokenManager._iMultiComments;
-    label_35:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BREAK:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case CONTINUE:
-      case DO:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FINAL:
-      case FLOAT:
-      case FOR:
-      case IF:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case RETURN:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SUPER:
-      case SWITCH:
-      case SYNCHRONIZED:
-      case THIS:
-      case THROW:
-      case TRANSIENT:
-      case TRUE:
-      case TRY:
-      case VOID:
-      case VOLATILE:
-      case WHILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
-      case AT:
-      case INCR:
-      case DECR:
-        ;
-        break;
-      default:
-        jj_la1[77] = jj_gen;
-        break label_35;
-      }
-      BlockStatement();
-    }
-    jj_consume_token(RBRACE);
-            /*
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        jvdc++;
-                        _javadocs++;
-                    }
-                    tmpToken = tmpToken.specialToken;
-                }
-            */
-                if (_bReturn) {
-                        _cyc--;
-                }
-                _ncss++;
-                Util.debug( "_ncss++" );
-
-                FunctionMetric functionMetrics = new FunctionMetric();
-                functionMetrics.name = _sFunction;
-                functionMetrics.ncss = _ncss - oldNcss;
-                functionMetrics.ccn = _cyc;
-                functionMetrics.javadocs = jvdc;
-
-                // added by SMS
-                functionMetrics.javadocsLn = jvdcLines;
-                functionMetrics.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
-                functionMetrics.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
-                //
-                // specially added for Cobertura
-                // Commenting out for now until the rest of patch 2353196 is applied.
-                //functionMetrics.endLine = beginLine;
-                //functionMetrics.endLine = endLine;
-
-                _vFunctions.add(functionMetrics);
-                _sFunction = sOldFunction;
-                _functions = oldFunctions + 1;
-                _cyc = oldcyc;
-                _bReturn = bOldReturn;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                _tmpToken = null;
-                //
-
-  }
-
-  final public void ExplicitConstructorInvocation() throws ParseException {
-    if (jj_2_21(2147483647)) {
-      jj_consume_token(THIS);
-      Arguments();
-      jj_consume_token(SEMICOLON);
-           _ncss++;       Util.debug( "_ncss++" );
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-        if (jj_2_20(2147483647)) {
-          PrimaryExpression();
-          jj_consume_token(DOT);
-        } else {
-          ;
-        }
-        jj_consume_token(SUPER);
-        Arguments();
-        jj_consume_token(SEMICOLON);
-    _ncss++;       Util.debug( "_ncss++" );
-//System.out.println( "\n\nAfter ExplicitConstructorInvocation\n" );
-
-        break;
-      default:
-        jj_la1[78] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void Initializer() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case STATIC:
-      jj_consume_token(STATIC);
-      break;
-    default:
-      jj_la1[79] = jj_gen;
-      ;
-    }
-    Block();
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-/*
- * Type, name and expression syntax follows.
- */
-  final public void Type() throws ParseException {
-    if (jj_2_22(2)) {
-      ReferenceType();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-        PrimitiveType();
-                  _sName = getToken(0).image;
-        break;
-      default:
-        jj_la1[80] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-/*
-ccl 2008-01-24
-{
-  ( PrimitiveType()
-          {
-                  _sName = getToken(0).image;
-          }
-    | Name()
-    [TypeArguments() ["." Identifier()] ]
-) ( "[" "]" { _sName += "[]"; } )*
-}
-*/
-
-/*
- * Takes special consideration for assert.
- */
-  final public void FieldTypeLookahead() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case SHORT:
-      PrimitiveType();
-      break;
-    case IDENTIFIER:
-      FieldTypeNameLookahead();
-      break;
-    default:
-      jj_la1[81] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    label_36:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        ;
-        break;
-      default:
-        jj_la1[82] = jj_gen;
-        break label_36;
-      }
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-    }
-  }
-
-  final public void PrimitiveType() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-      jj_consume_token(BOOLEAN);
-      break;
-    case CHAR:
-      jj_consume_token(CHAR);
-      break;
-    case BYTE:
-      jj_consume_token(BYTE);
-      break;
-    case SHORT:
-      jj_consume_token(SHORT);
-      break;
-    case INT:
-      jj_consume_token(INT);
-      break;
-    case LONG:
-      jj_consume_token(LONG);
-      break;
-    case FLOAT:
-      jj_consume_token(FLOAT);
-      break;
-    case DOUBLE:
-      jj_consume_token(DOUBLE);
-      break;
-    default:
-      jj_la1[83] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ResultType() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case VOID:
-      jj_consume_token(VOID);
-      break;
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case SHORT:
-    case IDENTIFIER:
-      Type();
-      break;
-    default:
-      jj_la1[84] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void Name() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ENUM:
-      jj_consume_token(ENUM);
-      break;
-    case ASSERT:
-    case IDENTIFIER:
-      Identifier();
-      break;
-    default:
-      jj_la1[85] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-                _sName = getToken(0).image;
-                _tmpResultToken = getToken( 0 );
-                Util.debug( "Name._tmpResultToken: " + _tmpResultToken );
-    label_37:
-    while (true) {
-      if (jj_2_23(2)) {
-        ;
-      } else {
-        break label_37;
-      }
-      jj_consume_token(DOT);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ENUM:
-        jj_consume_token(ENUM);
-        break;
-      case ASSERT:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[86] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-                _sName += "." + getToken(0).image;
-    }
-  }
-
-/**
- * Takes special consideration for assert.
- */
-  final public void FieldTypeNameLookahead() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    label_38:
-    while (true) {
-      if (jj_2_24(2)) {
-        ;
-      } else {
-        break label_38;
-      }
-      jj_consume_token(DOT);
-      Identifier();
-    }
-  }
-
-  final public void NameList() throws ParseException {
-    Name();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeArguments();
-      break;
-    default:
-      jj_la1[87] = jj_gen;
-      ;
-    }
-    label_39:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[88] = jj_gen;
-        break label_39;
-      }
-      jj_consume_token(COMMA);
-      Name();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeArguments();
-        break;
-      default:
-        jj_la1[89] = jj_gen;
-        ;
-      }
-    }
-  }
-
-/*
- * Expression syntax follows.
- */
-  final public void Expression() throws ParseException {
-    if (jj_2_25(2147483647)) {
-      Assignment();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        ConditionalExpression();
-        break;
-      default:
-        jj_la1[90] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void Assignment() throws ParseException {
-    PrimaryExpression();
-    AssignmentOperator();
-    Expression();
-  }
-
-  final public void AssignmentOperator() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSIGN:
-      jj_consume_token(ASSIGN);
-      break;
-    case STARASSIGN:
-      jj_consume_token(STARASSIGN);
-      break;
-    case SLASHASSIGN:
-      jj_consume_token(SLASHASSIGN);
-      break;
-    case REMASSIGN:
-      jj_consume_token(REMASSIGN);
-      break;
-    case PLUSASSIGN:
-      jj_consume_token(PLUSASSIGN);
-      break;
-    case MINUSASSIGN:
-      jj_consume_token(MINUSASSIGN);
-      break;
-    case LSHIFTASSIGN:
-      jj_consume_token(LSHIFTASSIGN);
-      break;
-    case RSIGNEDSHIFTASSIGN:
-      jj_consume_token(RSIGNEDSHIFTASSIGN);
-      break;
-    case RUNSIGNEDSHIFTASSIGN:
-      jj_consume_token(RUNSIGNEDSHIFTASSIGN);
-      break;
-    case ANDASSIGN:
-      jj_consume_token(ANDASSIGN);
-      break;
-    case XORASSIGN:
-      jj_consume_token(XORASSIGN);
-      break;
-    case ORASSIGN:
-      jj_consume_token(ORASSIGN);
-      break;
-    default:
-      jj_la1[91] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ConditionalExpression() throws ParseException {
-    ConditionalOrExpression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case HOOK:
-      jj_consume_token(HOOK);
-      Expression();
-      jj_consume_token(COLON);
-      ConditionalExpression();
-                                                                             _cyc++;
-      break;
-    default:
-      jj_la1[92] = jj_gen;
-      ;
-    }
-  }
-
-  final public void ConditionalOrExpression() throws ParseException {
-    ConditionalAndExpression();
-    label_40:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SC_OR:
-        ;
-        break;
-      default:
-        jj_la1[93] = jj_gen;
-        break label_40;
-      }
-      jj_consume_token(SC_OR);
-                                      _cyc++;
-      ConditionalAndExpression();
-    }
-  }
-
-  final public void ConditionalAndExpression() throws ParseException {
-    InclusiveOrExpression();
-    label_41:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SC_AND:
-        ;
-        break;
-      default:
-        jj_la1[94] = jj_gen;
-        break label_41;
-      }
-      jj_consume_token(SC_AND);
-                                   _cyc++;
-      InclusiveOrExpression();
-    }
-  }
-
-  final public void InclusiveOrExpression() throws ParseException {
-    ExclusiveOrExpression();
-    label_42:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BIT_OR:
-        ;
-        break;
-      default:
-        jj_la1[95] = jj_gen;
-        break label_42;
-      }
-      jj_consume_token(BIT_OR);
-      ExclusiveOrExpression();
-    }
-  }
-
-  final public void ExclusiveOrExpression() throws ParseException {
-    AndExpression();
-    label_43:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case XOR:
-        ;
-        break;
-      default:
-        jj_la1[96] = jj_gen;
-        break label_43;
-      }
-      jj_consume_token(XOR);
-      AndExpression();
-    }
-  }
-
-  final public void AndExpression() throws ParseException {
-    EqualityExpression();
-    label_44:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BIT_AND:
-        ;
-        break;
-      default:
-        jj_la1[97] = jj_gen;
-        break label_44;
-      }
-      jj_consume_token(BIT_AND);
-      EqualityExpression();
-    }
-  }
-
-  final public void EqualityExpression() throws ParseException {
-    InstanceOfExpression();
-    label_45:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EQ:
-      case NE:
-        ;
-        break;
-      default:
-        jj_la1[98] = jj_gen;
-        break label_45;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EQ:
-        jj_consume_token(EQ);
-        break;
-      case NE:
-        jj_consume_token(NE);
-        break;
-      default:
-        jj_la1[99] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      InstanceOfExpression();
-    }
-  }
-
-  final public void InstanceOfExpression() throws ParseException {
-    RelationalExpression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INSTANCEOF:
-      jj_consume_token(INSTANCEOF);
-      Type();
-      break;
-    default:
-      jj_la1[100] = jj_gen;
-      ;
-    }
-  }
-
-  final public void RelationalExpression() throws ParseException {
-    ShiftExpression();
-    label_46:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GT:
-      case LT:
-      case LE:
-      case GE:
-        ;
-        break;
-      default:
-        jj_la1[101] = jj_gen;
-        break label_46;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        jj_consume_token(LT);
-        break;
-      case GT:
-        jj_consume_token(GT);
-        break;
-      case LE:
-        jj_consume_token(LE);
-        break;
-      case GE:
-        jj_consume_token(GE);
-        break;
-      default:
-        jj_la1[102] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      ShiftExpression();
-    }
-  }
-
-  final public void ShiftExpression() throws ParseException {
-    AdditiveExpression();
-    label_47:
-    while (true) {
-      if (jj_2_26(3)) {
-        ;
-      } else {
-        break label_47;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LSHIFT:
-        jj_consume_token(LSHIFT);
-        break;
-      case GT:
-        jj_consume_token(GT);
-        jj_consume_token(GT);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case GT:
-          jj_consume_token(GT);
-          break;
-        default:
-          jj_la1[103] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[104] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      AdditiveExpression();
-    }
-  }
-
-  final public void AdditiveExpression() throws ParseException {
-    MultiplicativeExpression();
-    label_48:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-      case MINUS:
-        ;
-        break;
-      default:
-        jj_la1[105] = jj_gen;
-        break label_48;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-        jj_consume_token(PLUS);
-        break;
-      case MINUS:
-        jj_consume_token(MINUS);
-        break;
-      default:
-        jj_la1[106] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      MultiplicativeExpression();
-    }
-  }
-
-  final public void MultiplicativeExpression() throws ParseException {
-    UnaryExpression();
-    label_49:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STAR:
-      case SLASH:
-      case REM:
-        ;
-        break;
-      default:
-        jj_la1[107] = jj_gen;
-        break label_49;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STAR:
-        jj_consume_token(STAR);
-        break;
-      case SLASH:
-        jj_consume_token(SLASH);
-        break;
-      case REM:
-        jj_consume_token(REM);
-        break;
-      default:
-        jj_la1[108] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      UnaryExpression();
-    }
-  }
-
-  final public void UnaryExpression() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case PLUS:
-    case MINUS:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-        jj_consume_token(PLUS);
-        break;
-      case MINUS:
-        jj_consume_token(MINUS);
-        break;
-      default:
-        jj_la1[109] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      UnaryExpression();
-      break;
-    case INCR:
-      PreIncrementExpression();
-      break;
-    case DECR:
-      PreDecrementExpression();
-      break;
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-      UnaryExpressionNotPlusMinus();
-      break;
-    default:
-      jj_la1[110] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void PreIncrementExpression() throws ParseException {
-    jj_consume_token(INCR);
-    PrimaryExpression();
-  }
-
-  final public void PreDecrementExpression() throws ParseException {
-    jj_consume_token(DECR);
-    PrimaryExpression();
-  }
-
-  final public void UnaryExpressionNotPlusMinus() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BANG:
-    case TILDE:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case TILDE:
-        jj_consume_token(TILDE);
-        break;
-      case BANG:
-        jj_consume_token(BANG);
-        break;
-      default:
-        jj_la1[111] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      UnaryExpression();
-      break;
-    default:
-      jj_la1[112] = jj_gen;
-      if (jj_2_27(2147483647)) {
-        CastExpression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-          PostfixExpression();
-          break;
-        default:
-          jj_la1[113] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    }
-  }
-
-// This production is to determine lookahead only.  The LOOKAHEAD specifications
-// below are not used, but they are there just to indicate that we know about
-// this.
-  final public void CastLookahead() throws ParseException {
-    if (jj_2_28(2)) {
-      jj_consume_token(LPAREN);
-      PrimitiveType();
-    } else if (jj_2_29(2147483647)) {
-      jj_consume_token(LPAREN);
-      Type();
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(RPAREN);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case TILDE:
-          jj_consume_token(TILDE);
-          break;
-        case BANG:
-          jj_consume_token(BANG);
-          break;
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          break;
-        case ASSERT:
-        case IDENTIFIER:
-          Identifier();
-          break;
-        case THIS:
-          jj_consume_token(THIS);
-          break;
-        case SUPER:
-          jj_consume_token(SUPER);
-          break;
-        case NEW:
-          jj_consume_token(NEW);
-          break;
-        case FALSE:
-        case NULL:
-        case TRUE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-          Literal();
-          break;
-        default:
-          jj_la1[114] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_la1[115] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-// To fix bug Test48.java. Clemens [2000-10-03]
-  final public void PostfixLookahead() throws ParseException {
-    jj_consume_token(LPAREN);
-    Name();
-    label_50:
-    while (true) {
-      if (jj_2_30(2)) {
-        ;
-      } else {
-        break label_50;
-      }
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-    }
-    jj_consume_token(DOT);
-  }
-
-  final public void PostfixExpression() throws ParseException {
-    PrimaryExpression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INCR:
-    case DECR:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INCR:
-        jj_consume_token(INCR);
-        break;
-      case DECR:
-        jj_consume_token(DECR);
-        break;
-      default:
-        jj_la1[116] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      jj_la1[117] = jj_gen;
-      ;
-    }
-  }
-
-  final public void CastExpression() throws ParseException {
-    if (jj_2_31(2147483647)) {
-      jj_consume_token(LPAREN);
-      Type();
-      jj_consume_token(RPAREN);
-      UnaryExpression();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(RPAREN);
-        UnaryExpressionNotPlusMinus();
-        break;
-      default:
-        jj_la1[118] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void PrimaryExpression() throws ParseException {
-    PrimaryPrefix();
-    label_51:
-    while (true) {
-      if (jj_2_32(2)) {
-        ;
-      } else {
-        break label_51;
-      }
-      PrimarySuffix();
-    }
-  }
-
-  final public void PrimaryPrefix() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case FALSE:
-    case NULL:
-    case TRUE:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-      Literal();
-      break;
-    case THIS:
-      jj_consume_token(THIS);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case DOT:
-        jj_consume_token(DOT);
-        break;
-      default:
-        jj_la1[119] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[120] = jj_gen;
-        ;
-      }
-      break;
-    default:
-      jj_la1[123] = jj_gen;
-      if (jj_2_34(2)) {
-        jj_consume_token(SUPER);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case DOT:
-          jj_consume_token(DOT);
-          break;
-        default:
-          jj_la1[121] = jj_gen;
-          ;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case IDENTIFIER:
-          Identifier();
-          break;
-        default:
-          jj_la1[122] = jj_gen;
-          ;
-        }
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          Expression();
-          jj_consume_token(RPAREN);
-          break;
-        case NEW:
-          AllocationExpression();
-          break;
-        default:
-          jj_la1[124] = jj_gen;
-          if (jj_2_35(2147483647)) {
-            ResultType();
-            jj_consume_token(DOT);
-            jj_consume_token(CLASS);
-          } else {
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case ASSERT:
-            case ENUM:
-            case IDENTIFIER:
-              Name();
-              if (jj_2_33(3)) {
-                jj_consume_token(DOT);
-                jj_consume_token(SUPER);
-                jj_consume_token(DOT);
-                Identifier();
-              } else {
-                ;
-              }
-              break;
-            default:
-              jj_la1[125] = jj_gen;
-              jj_consume_token(-1);
-              throw new ParseException();
-            }
-          }
-        }
-      }
-    }
-  }
-
-  final public void PrimarySuffix() throws ParseException {
-    if (jj_2_36(2)) {
-      jj_consume_token(DOT);
-      jj_consume_token(THIS);
-    } else if (jj_2_37(2)) {
-      jj_consume_token(DOT);
-      AllocationExpression();
-    } else if (jj_2_38(3)) {
-      MemberSelector();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        jj_consume_token(LBRACKET);
-        Expression();
-        jj_consume_token(RBRACKET);
-        break;
-      case DOT:
-        jj_consume_token(DOT);
-        Identifier();
-        break;
-      case LPAREN:
-        Arguments();
-        break;
-      default:
-        jj_la1[126] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void Literal() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INTEGER_LITERAL:
-      jj_consume_token(INTEGER_LITERAL);
-      break;
-    case FLOATING_POINT_LITERAL:
-      jj_consume_token(FLOATING_POINT_LITERAL);
-      break;
-    case CHARACTER_LITERAL:
-      jj_consume_token(CHARACTER_LITERAL);
-      break;
-    case STRING_LITERAL:
-      jj_consume_token(STRING_LITERAL);
-      break;
-    case FALSE:
-    case TRUE:
-      BooleanLiteral();
-      break;
-    case NULL:
-      NullLiteral();
-      break;
-    default:
-      jj_la1[127] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void BooleanLiteral() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case TRUE:
-      jj_consume_token(TRUE);
-      break;
-    case FALSE:
-      jj_consume_token(FALSE);
-      break;
-    default:
-      jj_la1[128] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void NullLiteral() throws ParseException {
-    jj_consume_token(NULL);
-  }
-
-  final public void Arguments() throws ParseException {
-    jj_consume_token(LPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      ArgumentList();
-      break;
-    default:
-      jj_la1[129] = jj_gen;
-      ;
-    }
-    jj_consume_token(RPAREN);
-  }
-
-  final public void ArgumentList() throws ParseException {
-    Expression();
-    label_52:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[130] = jj_gen;
-        break label_52;
-      }
-      jj_consume_token(COMMA);
-      Expression();
-    }
-  }
-
-  final public void AllocationExpression() throws ParseException {
-        String sOldClass = _sClass;
-        //int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        int oldClasses = _classes;
-        String sName;
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        int oldJavadocs = _javadocs;
-        int oldNcss = _ncss;
-    if (jj_2_39(2)) {
-      jj_consume_token(NEW);
-      PrimitiveType();
-      ArrayDimsAndInits();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case NEW:
-        jj_consume_token(NEW);
-        Name();
-                          sName = _sName;
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-          TypeArguments();
-          break;
-        default:
-          jj_la1[131] = jj_gen;
-          ;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ArrayDimsAndInits();
-          break;
-        case LPAREN:
-          Arguments();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LBRACE:
-                         if (!_sClass.equals("")) {
-                                 _sClass += ".";
-                         }
-                         /*_sClass += sName;*/
-                         //_sClass += sName + "$" + _anonClassCount ;//Removed by REYNAUD Sebastien (LOGICA)
-
-                                //Added by REYNAUD Sebastien (LOGICA)
-                                _sClass += sName;
-                                //
-                         _classLevel ++;
-            ClassBody();
-                                //Added by REYNAUD Sebastien (LOGICA)
-                                ObjectMetric metric = new ObjectMetric();
-                                metric.name = _sPackage + _sClass;
-                                metric.ncss = _ncss - oldNcss;
-                            metric.functions = _functions - oldFunctions;
-                      metric.classes = _classes - oldClasses;
-                        Token lastToken = getToken( 0 );
-                        _vClasses.add( metric );
-                        _pPackageMetric.functions += _functions - oldFunctions;
-                        _pPackageMetric.classes++;
-                                metric.javadocs = _javadocs - oldJavadocs;
-                                //
-                                _classLevel--;
-                                _functions = oldFunctions;
-                                _classes = oldClasses + 1;
-                                _sClass = sOldClass;
-            break;
-          default:
-            jj_la1[132] = jj_gen;
-            ;
-          }
-          break;
-        default:
-          jj_la1[133] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_la1[134] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-/*
- * The third LOOKAHEAD specification below is to parse to PrimarySuffix
- * if there is an expression between the "[...]".
- */
-  final public void ArrayDimsAndInits() throws ParseException {
-    if (jj_2_42(2)) {
-      label_53:
-      while (true) {
-        jj_consume_token(LBRACKET);
-        Expression();
-        jj_consume_token(RBRACKET);
-        if (jj_2_40(2)) {
-          ;
-        } else {
-          break label_53;
-        }
-      }
-      label_54:
-      while (true) {
-        if (jj_2_41(2)) {
-          ;
-        } else {
-          break label_54;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        label_55:
-        while (true) {
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LBRACKET:
-            ;
-            break;
-          default:
-            jj_la1[135] = jj_gen;
-            break label_55;
-          }
-        }
-        ArrayInitializer();
-        break;
-      default:
-        jj_la1[136] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-/*
- * Statement syntax follows.
- */
-  final public void Statement() throws ParseException {
-        _bReturn = false;
-    if (jj_2_43(2)) {
-      LabeledStatement();
-    } else if (jj_2_44(2147483647)) {
-      AssertStatement();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACE:
-        Block();
-        break;
-      case SEMICOLON:
-        EmptyStatement();
-        break;
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case INCR:
-      case DECR:
-        StatementExpression();
-        jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-        break;
-      case SWITCH:
-        SwitchStatement();
-        break;
-      case IF:
-        IfStatement();
-          _cyc++;
-        break;
-      case WHILE:
-        WhileStatement();
-          _cyc++;
-        break;
-      case DO:
-        DoStatement();
-          _cyc++;
-        break;
-      case FOR:
-        ForStatement();
-          _cyc++;
-        break;
-      case BREAK:
-        BreakStatement();
-        break;
-      case CONTINUE:
-        ContinueStatement();
-        break;
-      case RETURN:
-        ReturnStatement();
-        break;
-      case THROW:
-        ThrowStatement();
-        break;
-      case SYNCHRONIZED:
-        SynchronizedStatement();
-        break;
-      case TRY:
-        TryStatement();
-        break;
-      default:
-        jj_la1[137] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void LabeledStatement() throws ParseException {
-    Identifier();
-    jj_consume_token(COLON);
-    Statement();
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void AssertStatementLookahead() throws ParseException {
-    jj_consume_token(ASSERT);
-    Expression();
-  }
-
-  final public void AssertStatement() throws ParseException {
-    jj_consume_token(ASSERT);
-    Expression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COLON:
-      jj_consume_token(COLON);
-      Expression();
-      break;
-    default:
-      jj_la1[138] = jj_gen;
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-    _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void Block() throws ParseException {
-    jj_consume_token(LBRACE);
-    label_56:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BREAK:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case CONTINUE:
-      case DO:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FINAL:
-      case FLOAT:
-      case FOR:
-      case IF:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case RETURN:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SUPER:
-      case SWITCH:
-      case SYNCHRONIZED:
-      case THIS:
-      case THROW:
-      case TRANSIENT:
-      case TRUE:
-      case TRY:
-      case VOID:
-      case VOLATILE:
-      case WHILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
-      case AT:
-      case INCR:
-      case DECR:
-        ;
-        break;
-      default:
-        jj_la1[139] = jj_gen;
-        break label_56;
-      }
-      BlockStatement();
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void BlockStatement() throws ParseException {
-    if (jj_2_45(2147483647)) {
-      LocalVariableDeclaration();
-      jj_consume_token(SEMICOLON);
-                _ncss++;       Util.debug( "_ncss++" );
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BREAK:
-      case BYTE:
-      case CHAR:
-      case CONTINUE:
-      case DO:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case FOR:
-      case IF:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case RETURN:
-      case SHORT:
-      case SUPER:
-      case SWITCH:
-      case SYNCHRONIZED:
-      case THIS:
-      case THROW:
-      case TRUE:
-      case TRY:
-      case VOID:
-      case WHILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
-      case INCR:
-      case DECR:
-        Statement();
-        break;
-      case ABSTRACT:
-      case CLASS:
-      case FINAL:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-      case TRANSIENT:
-      case VOLATILE:
-      case AT:
-        UnmodifiedClassDeclaration();
-        break;
-      case INTERFACE:
-        UnmodifiedInterfaceDeclaration();
-        break;
-      default:
-        jj_la1[140] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-/*void LocalVariableDeclaration() :
-{}
-{
-  [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )*
-}*/
-  final public void LocalVariableDeclaration() throws ParseException {
-    Modifiers();
-    Type();
-    VariableDeclarator();
-    label_57:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[141] = jj_gen;
-        break label_57;
-      }
-      jj_consume_token(COMMA);
-      VariableDeclarator();
-    }
-  }
-
-  final public void EmptyStatement() throws ParseException {
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void StatementExpression() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INCR:
-      PreIncrementExpression();
-      break;
-    case DECR:
-      PreDecrementExpression();
-      break;
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-      PrimaryExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-      case INCR:
-      case DECR:
-      case PLUSASSIGN:
-      case MINUSASSIGN:
-      case STARASSIGN:
-      case SLASHASSIGN:
-      case ANDASSIGN:
-      case ORASSIGN:
-      case XORASSIGN:
-      case REMASSIGN:
-      case LSHIFTASSIGN:
-      case RSIGNEDSHIFTASSIGN:
-      case RUNSIGNEDSHIFTASSIGN:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case INCR:
-          jj_consume_token(INCR);
-          break;
-        case DECR:
-          jj_consume_token(DECR);
-          break;
-        case ASSIGN:
-        case PLUSASSIGN:
-        case MINUSASSIGN:
-        case STARASSIGN:
-        case SLASHASSIGN:
-        case ANDASSIGN:
-        case ORASSIGN:
-        case XORASSIGN:
-        case REMASSIGN:
-        case LSHIFTASSIGN:
-        case RSIGNEDSHIFTASSIGN:
-        case RUNSIGNEDSHIFTASSIGN:
-          AssignmentOperator();
-          Expression();
-          break;
-        default:
-          jj_la1[142] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_la1[143] = jj_gen;
-        ;
-      }
-      break;
-    default:
-      jj_la1[144] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void SwitchStatement() throws ParseException {
-                _localCases = 0;
-    jj_consume_token(SWITCH);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    jj_consume_token(LBRACE);
-    label_58:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CASE:
-      case _DEFAULT:
-        ;
-        break;
-      default:
-        jj_la1[145] = jj_gen;
-        break label_58;
-      }
-      SwitchLabel();
-      label_59:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case RETURN:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRANSIENT:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case VOLATILE:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          ;
-          break;
-        default:
-          jj_la1[146] = jj_gen;
-          break label_59;
-        }
-        BlockStatement();
-      }
-    }
-    jj_consume_token(RBRACE);
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void SwitchLabel() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case CASE:
-      jj_consume_token(CASE);
-      Expression();
-      jj_consume_token(COLON);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _localCases++;
-                _cyc++;
-      break;
-    case _DEFAULT:
-      jj_consume_token(_DEFAULT);
-      jj_consume_token(COLON);
-                _ncss++;       Util.debug( "_ncss++" );
-      break;
-    default:
-      jj_la1[147] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void IfStatement() throws ParseException {
-    jj_consume_token(IF);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    Statement();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ELSE:
-      jj_consume_token(ELSE);
-                                                                _ncss++;       Util.debug( "_ncss++" );
-      Statement();
-      break;
-    default:
-      jj_la1[148] = jj_gen;
-      ;
-    }
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void WhileStatement() throws ParseException {
-    jj_consume_token(WHILE);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    Statement();
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void DoStatement() throws ParseException {
-    jj_consume_token(DO);
-    Statement();
-    jj_consume_token(WHILE);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void ForStatement() throws ParseException {
-    jj_consume_token(FOR);
-    jj_consume_token(LPAREN);
-    if (jj_2_46(2147483647)) {
-      Modifiers();
-      Type();
-      jj_consume_token(IDENTIFIER);
-      jj_consume_token(COLON);
-      Expression();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NATIVE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SUPER:
-      case SYNCHRONIZED:
-      case THIS:
-      case TRANSIENT:
-      case TRUE:
-      case VOID:
-      case VOLATILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case SEMICOLON:
-      case AT:
-      case INCR:
-      case DECR:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SUPER:
-        case SYNCHRONIZED:
-        case THIS:
-        case TRANSIENT:
-        case TRUE:
-        case VOID:
-        case VOLATILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case AT:
-        case INCR:
-        case DECR:
-          ForInit();
-          break;
-        default:
-          jj_la1[149] = jj_gen;
-          ;
-        }
-        jj_consume_token(SEMICOLON);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case BANG:
-        case TILDE:
-        case INCR:
-        case DECR:
-        case PLUS:
-        case MINUS:
-          Expression();
-          break;
-        default:
-          jj_la1[150] = jj_gen;
-          ;
-        }
-        jj_consume_token(SEMICOLON);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case INCR:
-        case DECR:
-          ForUpdate();
-          break;
-        default:
-          jj_la1[151] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[152] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    jj_consume_token(RPAREN);
-    Statement();
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void ForInit() throws ParseException {
-    if (jj_2_47(2147483647)) {
-      LocalVariableDeclaration();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case INCR:
-      case DECR:
-        StatementExpressionList();
-        break;
-      default:
-        jj_la1[153] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void StatementExpressionList() throws ParseException {
-    StatementExpression();
-    label_60:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[154] = jj_gen;
-        break label_60;
-      }
-      jj_consume_token(COMMA);
-      StatementExpression();
-    }
-  }
-
-  final public void ForUpdate() throws ParseException {
-    StatementExpressionList();
-  }
-
-  final public void BreakStatement() throws ParseException {
-    jj_consume_token(BREAK);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSERT:
-    case IDENTIFIER:
-      Identifier();
-      break;
-    default:
-      jj_la1[155] = jj_gen;
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void ContinueStatement() throws ParseException {
-    jj_consume_token(CONTINUE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSERT:
-    case IDENTIFIER:
-      Identifier();
-      break;
-    default:
-      jj_la1[156] = jj_gen;
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void ReturnStatement() throws ParseException {
-    jj_consume_token(RETURN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      Expression();
-      break;
-    default:
-      jj_la1[157] = jj_gen;
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _cyc++;
-                _bReturn = true;
-  }
-
-  final public void ThrowStatement() throws ParseException {
-    jj_consume_token(THROW);
-    Expression();
-    jj_consume_token(SEMICOLON);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _cyc++;
-  }
-
-  final public void SynchronizedStatement() throws ParseException {
-    jj_consume_token(SYNCHRONIZED);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    Block();
-          _ncss++;       Util.debug( "_ncss++" );
-  }
-
-  final public void TryStatement() throws ParseException {
-    jj_consume_token(TRY);
-    Block();
-    label_61:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CATCH:
-        ;
-        break;
-      default:
-        jj_la1[158] = jj_gen;
-        break label_61;
-      }
-      jj_consume_token(CATCH);
-      jj_consume_token(LPAREN);
-      FormalParameter();
-      jj_consume_token(RPAREN);
-      Block();
-                                                _ncss++;       Util.debug( "_ncss++" ); _cyc++;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case FINALLY:
-      jj_consume_token(FINALLY);
-      Block();
-                        _ncss++;       Util.debug( "_ncss++" );
-      break;
-    default:
-      jj_la1[159] = jj_gen;
-      ;
-    }
-  }
-
-  final public void Identifier() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IDENTIFIER:
-      jj_consume_token(IDENTIFIER);
-      break;
-    case ASSERT:
-      jj_consume_token(ASSERT);
-      break;
-    default:
-      jj_la1[160] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-/* Annotation syntax follows. */
-  final public void Annotation() throws ParseException {
-    if (jj_2_48(2147483647)) {
-      NormalAnnotation();
-    } else if (jj_2_49(2147483647)) {
-      SingleMemberAnnotation();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        MarkerAnnotation();
-        break;
-      default:
-        jj_la1[161] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void NormalAnnotation() throws ParseException {
-    jj_consume_token(AT);
-    Name();
-    jj_consume_token(LPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IDENTIFIER:
-      MemberValuePairs();
-      break;
-    default:
-      jj_la1[162] = jj_gen;
-      ;
-    }
-    jj_consume_token(RPAREN);
-  }
-
-  final public void MarkerAnnotation() throws ParseException {
-    jj_consume_token(AT);
-    Name();
-  }
-
-  final public void SingleMemberAnnotation() throws ParseException {
-    jj_consume_token(AT);
-    Name();
-    jj_consume_token(LPAREN);
-    MemberValue();
-    jj_consume_token(RPAREN);
-  }
-
-  final public void MemberValuePairs() throws ParseException {
-    MemberValuePair();
-    label_62:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[163] = jj_gen;
-        break label_62;
-      }
-      jj_consume_token(COMMA);
-      MemberValuePair();
-    }
-  }
-
-  final public void MemberValuePair() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    jj_consume_token(ASSIGN);
-    MemberValue();
-  }
-
-  final public void MemberValue() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case AT:
-      Annotation();
-      break;
-    case LBRACE:
-      MemberValueArrayInitializer();
-      break;
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      ConditionalExpression();
-      break;
-    default:
-      jj_la1[164] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void MemberValueArrayInitializer() throws ParseException {
-    jj_consume_token(LBRACE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSERT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case ENUM:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case AT:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      MemberValue();
-      break;
-    default:
-      jj_la1[165] = jj_gen;
-      ;
-    }
-    label_63:
-    while (true) {
-      if (jj_2_50(2)) {
-        ;
-      } else {
-        break label_63;
-      }
-      jj_consume_token(COMMA);
-      MemberValue();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COMMA:
-      jj_consume_token(COMMA);
-      break;
-    default:
-      jj_la1[166] = jj_gen;
-      ;
-    }
-    jj_consume_token(RBRACE);
-  }
-
-/*
- =================================================
- Java 1.5 stuff starts here
- =================================================
-*/
-
-/* Annotation Types. */
-
-//Added by REYNAUD Sebastien (LOGICA)
-  final public void CreationAnnotation() throws ParseException {
-    jj_consume_token(AT);
-    jj_consume_token(INTERFACE);
-    jj_consume_token(IDENTIFIER);
-    jj_consume_token(LBRACE);
-    label_64:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case SEMICOLON:
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[167] = jj_gen;
-        break label_64;
-      }
-      AnnotationTypeMemberDeclaration();
-    }
-    jj_consume_token(RBRACE);
-  }
-
-//
-  final public void AnnotationTypeDeclaration(int modifiers) throws ParseException {
-    jj_consume_token(AT);
-    jj_consume_token(INTERFACE);
-    jj_consume_token(IDENTIFIER);
-    AnnotationTypeBody();
-  }
-
-  final public void AnnotationTypeBody() throws ParseException {
-    jj_consume_token(LBRACE);
-       _ncss++;       Util.debug( "_ncss++" );
-    label_65:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case SEMICOLON:
-      case AT:
-        ;
-        break;
-      default:
-        jj_la1[168] = jj_gen;
-        break label_65;
-      }
-      AnnotationTypeMemberDeclaration();
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void AnnotationTypeMemberDeclaration() throws ParseException {
-   int modifiers;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case CLASS:
-    case DOUBLE:
-    case ENUM:
-    case FINAL:
-    case FLOAT:
-    case INT:
-    case INTERFACE:
-    case LONG:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case SHORT:
-    case STATIC:
-    case TESTAAAA:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case IDENTIFIER:
-    case AT:
-      modifiers = Modifiers();
-      if (jj_2_51(2147483647)) {
-        Type();
-        jj_consume_token(IDENTIFIER);
-        jj_consume_token(LPAREN);
-        jj_consume_token(RPAREN);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case _DEFAULT:
-          DefaultValue();
-          break;
-        default:
-          jj_la1[169] = jj_gen;
-          ;
-        }
-        jj_consume_token(SEMICOLON);
-            _ncss++;
-            Util.debug( "_ncss++" );
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CLASS:
-        case INTERFACE:
-          ClassOrInterfaceDeclaration(modifiers);
-          break;
-        case ENUM:
-          EnumDeclaration(modifiers);
-          break;
-        case AT:
-          AnnotationTypeDeclaration(modifiers);
-          break;
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case SHORT:
-        case IDENTIFIER:
-          FieldDeclaration15(modifiers);
-          break;
-        default:
-          jj_la1[170] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      break;
-    case SEMICOLON:
-      jj_consume_token(SEMICOLON);
-            _ncss++;
-            Util.debug( "_ncss++" );
-      break;
-    default:
-      jj_la1[171] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void DefaultValue() throws ParseException {
-    jj_consume_token(_DEFAULT);
-    MemberValue();
-  }
-
-/*
- * Modifiers. We match all modifiers in a single rule to reduce the chances of
- * syntax errors for simple modifier mistakes. It will also enable us to give
- * better error messages.
- */
-  final public int Modifiers() throws ParseException {
-   int modifiers = 0;
-   _tmpToken = null;
-    label_66:
-    while (true) {
-      if (jj_2_52(2)) {
-        ;
-      } else {
-        break label_66;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-              modifiers |= ModifierSet.PUBLIC;
-      if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case STATIC:
-        jj_consume_token(STATIC);
-              modifiers |= ModifierSet.STATIC;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-                 modifiers |= ModifierSet.PROTECTED;       if ( _tmpToken == null ) {
-       _tmpToken = getToken( 0 );
-      }
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-               modifiers |= ModifierSet.PRIVATE;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-             modifiers |= ModifierSet.FINAL;       if ( _tmpToken == null ) {
-       _tmpToken = getToken( 0 );
-      }
-        break;
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-                modifiers |= ModifierSet.ABSTRACT;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case SYNCHRONIZED:
-        jj_consume_token(SYNCHRONIZED);
-                    modifiers |= ModifierSet.SYNCHRONIZED;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case NATIVE:
-        jj_consume_token(NATIVE);
-              modifiers |= ModifierSet.NATIVE;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case TRANSIENT:
-        jj_consume_token(TRANSIENT);
-                 modifiers |= ModifierSet.TRANSIENT;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case VOLATILE:
-        jj_consume_token(VOLATILE);
-                modifiers |= ModifierSet.VOLATILE;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case TESTAAAA:
-        jj_consume_token(TESTAAAA);
-                modifiers |= ModifierSet.STRICTFP;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-        break;
-      case AT:
-        Annotation();
-        break;
-      default:
-        jj_la1[172] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    {if (true) return modifiers;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public void ClassOrInterfaceDeclaration(int modifiers) throws ParseException {
-   boolean isInterface = false;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case CLASS:
-      jj_consume_token(CLASS);
-      break;
-    case INTERFACE:
-      jj_consume_token(INTERFACE);
-                            isInterface = true;
-      break;
-    default:
-      jj_la1[173] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    jj_consume_token(IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      jj_la1[174] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      ExtendsList(isInterface);
-      break;
-    default:
-      jj_la1[175] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IMPLEMENTS:
-      ImplementsList(isInterface);
-      break;
-    default:
-      jj_la1[176] = jj_gen;
-      ;
-    }
-    ClassOrInterfaceBody(isInterface);
-  }
-
-  final public void EnumDeclaration(int modifiers) throws ParseException {
-        String sOldClass = _sClass;
-        int oldClasses = _classes;
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-
-        // Chris Povirk
-        int oldSingle;
-        int oldMulti;
-      Util.debug( "EnumDeclaration().START" );
-    jj_consume_token(ENUM);
-    jj_consume_token(IDENTIFIER);
-                if (!_sClass.equals("")) {
-                        _sClass += ".";
-                }
-                _sClass += getToken(0).image;
-                _classLevel ++;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IMPLEMENTS:
-      ImplementsList(false);
-      break;
-    default:
-      jj_la1[177] = jj_gen;
-      ;
-    }
-        // Chris Povirk
-      oldSingle = JavaParserTokenManager._iSingleComments;
-      oldMulti = JavaParserTokenManager._iMultiComments;
-    EnumBody();
-             _classLevel--;
-             if (_classLevel == 0) {
-                 //_topLevelClasses++;
-                 ObjectMetric metric = new ObjectMetric();
-                 metric.name = _sPackage + _sClass;
-                 metric.ncss = _ncss - oldNcss;
-                 metric.functions = _functions - oldFunctions;
-                 metric.classes = _classes - oldClasses;
-                 Token lastToken = getToken( 0 );
-                 //metric.add( new Integer( lastToken.endLine ) );
-                 //metric.add( new Integer( lastToken.endColumn ) );
-                 metric.javadocs = _javadocs;
-
-                 // Chris Povirk
-                 metric.javadocsLn = _jvdcLines;
-                 metric.singleLn = JavaParserTokenManager._iSingleComments - oldSingle;
-                 metric.multiLn = JavaParserTokenManager._iMultiComments - oldMulti;
-
-                 _vClasses.add(metric);
-                 _pPackageMetric.functions += _functions - oldFunctions;
-                 _pPackageMetric.classes++;
-
-                 // added by SMS
-                 _pPackageMetric.javadocs += _javadocs;
-                 //_pPackageMetric.javadocsLn += JavaParserTokenManager._iFormalComments - oldFormal;
-                 //_pPackageMetric.singleLn += JavaParserTokenManager._iSingleComments - oldSingle;
-                 //_pPackageMetric.multiLn += Manager._iMultiComments - oldMulti;
-                 //
-             }
-             _functions = oldFunctions;
-             _classes = oldClasses + 1;
-             _sClass = sOldClass;
-  }
-
-  final public void TypeParameters() throws ParseException {
-    jj_consume_token(LT);
-    TypeParameter();
-    label_67:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[178] = jj_gen;
-        break label_67;
-      }
-      jj_consume_token(COMMA);
-      TypeParameter();
-    }
-    jj_consume_token(GT);
-  }
-
-  final public void ExtendsList(boolean isInterface) throws ParseException {
-   boolean extendsMoreThanOne = false;
-    jj_consume_token(EXTENDS);
-    ClassOrInterfaceType();
-    label_68:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[179] = jj_gen;
-        break label_68;
-      }
-      jj_consume_token(COMMA);
-      ClassOrInterfaceType();
-                                  extendsMoreThanOne = true;
-    }
-      if (extendsMoreThanOne && !isInterface)
-         {if (true) throw new ParseException("A class cannot extend more than one other class");}
-  }
-
-  final public void ImplementsList(boolean isInterface) throws ParseException {
-    jj_consume_token(IMPLEMENTS);
-    ClassOrInterfaceType();
-    label_69:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[180] = jj_gen;
-        break label_69;
-      }
-      jj_consume_token(COMMA);
-      ClassOrInterfaceType();
-    }
-      if (isInterface)
-         {if (true) throw new ParseException("An interface cannot implement other interfaces");}
-  }
-
-  final public void ClassOrInterfaceBody(boolean isInterface) throws ParseException {
-    jj_consume_token(LBRACE);
-           _ncss++; Util.debug( "ClassOrInterfaceBody()._ncss++" );
-    label_70:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOID:
-      case VOLATILE:
-      case IDENTIFIER:
-      case LBRACE:
-      case SEMICOLON:
-      case AT:
-      case LT:
-        ;
-        break;
-      default:
-        jj_la1[181] = jj_gen;
-        break label_70;
-      }
-      ClassOrInterfaceBodyDeclaration(isInterface);
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void EnumBody() throws ParseException {
-    jj_consume_token(LBRACE);
-               _ncss++;
-               Util.debug( "_ncss++" );
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case FINAL:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case STATIC:
-    case TESTAAAA:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case IDENTIFIER:
-    case AT:
-      EnumConstant();
-      label_71:
-      while (true) {
-        if (jj_2_53(2)) {
-          ;
-        } else {
-          break label_71;
-        }
-        jj_consume_token(COMMA);
-        EnumConstant();
-      }
-      break;
-    default:
-      jj_la1[182] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COMMA:
-      jj_consume_token(COMMA);
-      break;
-    default:
-      jj_la1[183] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case SEMICOLON:
-      jj_consume_token(SEMICOLON);
-      label_72:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case LT:
-          ;
-          break;
-        default:
-          jj_la1[184] = jj_gen;
-          break label_72;
-        }
-        ClassOrInterfaceBodyDeclaration(false);
-      }
-      break;
-    default:
-      jj_la1[185] = jj_gen;
-      ;
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void TypeParameter() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      TypeBound();
-      break;
-    default:
-      jj_la1[186] = jj_gen;
-      ;
-    }
-  }
-
-  final public void ClassOrInterfaceType() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-                _sName = getToken(0).image;
-                if ( _tmpResultToken == null )
-                {
-                  _tmpResultToken = getToken( 0 );
-                  Util.debug( "ClassOrInterfaceType._tmpResultToken: " + _tmpResultToken );
-                }
-    if (jj_2_54(4)) {
-      TypeArguments();
-    } else {
-      ;
-    }
-    label_73:
-    while (true) {
-      if (jj_2_55(2)) {
-        ;
-      } else {
-        break label_73;
-      }
-      jj_consume_token(DOT);
-      jj_consume_token(IDENTIFIER);
-                _sName += "." + getToken(0).image;
-      if (jj_2_56(2)) {
-        TypeArguments();
-      } else {
-        ;
-      }
-    }
-  }
-
-  final public void ClassOrInterfaceBodyDeclaration(boolean isInterface) throws ParseException {
-   //boolean isNestedInterface = false;
-   int modifiers;
-    if (jj_2_59(2)) {
-      Initializer();
-     if (isInterface)
-        {if (true) throw new ParseException("An interface cannot have initializers");}
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOID:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-      case LT:
-        modifiers = Modifiers();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CLASS:
-        case INTERFACE:
-          ClassOrInterfaceDeclaration(modifiers);
-          break;
-        case ENUM:
-          EnumDeclaration(modifiers);
-          break;
-        default:
-          jj_la1[187] = jj_gen;
-          if (jj_2_57(2147483647)) {
-            ConstructorDeclaration();
-          } else if (jj_2_58(2147483647)) {
-            FieldDeclaration15(modifiers);
-          } else {
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case ABSTRACT:
-            case BOOLEAN:
-            case BYTE:
-            case CHAR:
-            case DOUBLE:
-            case FINAL:
-            case FLOAT:
-            case INT:
-            case LONG:
-            case NATIVE:
-            case PRIVATE:
-            case PROTECTED:
-            case PUBLIC:
-            case SHORT:
-            case STATIC:
-            case TESTAAAA:
-            case SYNCHRONIZED:
-            case VOID:
-            case IDENTIFIER:
-            case AT:
-            case LT:
-              MethodDeclaration15(modifiers);
-              break;
-            default:
-              jj_la1[188] = jj_gen;
-              jj_consume_token(-1);
-              throw new ParseException();
-            }
-          }
-        }
-        break;
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        break;
-      default:
-        jj_la1[189] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void EnumConstant() throws ParseException {
-    Modifiers();
-    jj_consume_token(IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LPAREN:
-      Arguments();
-      break;
-    default:
-      jj_la1[190] = jj_gen;
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LBRACE:
-      ClassOrInterfaceBody(false);
-      break;
-    default:
-      jj_la1[191] = jj_gen;
-      ;
-    }
-  }
-
-  final public void TypeBound() throws ParseException {
-    jj_consume_token(EXTENDS);
-    ClassOrInterfaceType();
-    label_74:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BIT_AND:
-        ;
-        break;
-      default:
-        jj_la1[192] = jj_gen;
-        break label_74;
-      }
-      jj_consume_token(BIT_AND);
-      ClassOrInterfaceType();
-    }
-  }
-
-  final public void TypeArguments() throws ParseException {
-    jj_consume_token(LT);
-    TypeArgument();
-    label_75:
-    while (true) {
-      if (jj_2_60(2)) {
-        ;
-      } else {
-        break label_75;
-      }
-      jj_consume_token(COMMA);
-      TypeArgument();
-    }
-    jj_consume_token(GT);
-  }
-
-  final public void TypeArgument() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case SHORT:
-    case IDENTIFIER:
-      ReferenceType();
-      break;
-    case HOOK:
-      jj_consume_token(HOOK);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-      case SUPER:
-        WildcardBounds();
-        break;
-      default:
-        jj_la1[193] = jj_gen;
-        ;
-      }
-      break;
-    default:
-      jj_la1[194] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ReferenceType() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case SHORT:
-      PrimitiveType();
-      label_76:
-      while (true) {
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-                                            _sName += "[]";
-        if (jj_2_61(2)) {
-          ;
-        } else {
-          break label_76;
-        }
-      }
-      break;
-    case IDENTIFIER:
-      ClassOrInterfaceType();
-      label_77:
-      while (true) {
-        if (jj_2_62(2)) {
-          ;
-        } else {
-          break label_77;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-                                                       _sName += "[]";
-      }
-      break;
-    default:
-      jj_la1[195] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void WildcardBounds() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      jj_consume_token(EXTENDS);
-      ReferenceType();
-      break;
-    case SUPER:
-      jj_consume_token(SUPER);
-      ReferenceType();
-      break;
-    default:
-      jj_la1[196] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void FieldDeclaration15(int modifiers) throws ParseException {
-    Type();
-    VariableDeclarator();
-    label_78:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        jj_la1[197] = jj_gen;
-        break label_78;
-      }
-      jj_consume_token(COMMA);
-      VariableDeclarator();
-    }
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void MethodDeclaration15(int modifiers) throws ParseException {
-    MethodDeclaration();
-  }
-
-  final public void MethodDeclarator15() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    FormalParameters();
-    label_79:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        ;
-        break;
-      default:
-        jj_la1[198] = jj_gen;
-        break label_79;
-      }
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-    }
-  }
-
-  final public void FormalParameters15() throws ParseException {
-    jj_consume_token(LPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FINAL:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case SHORT:
-    case STATIC:
-    case TESTAAAA:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case IDENTIFIER:
-    case AT:
-      FormalParameter15();
-      label_80:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[199] = jj_gen;
-          break label_80;
-        }
-        jj_consume_token(COMMA);
-        FormalParameter15();
-      }
-      break;
-    default:
-      jj_la1[200] = jj_gen;
-      ;
-    }
-    jj_consume_token(RPAREN);
-  }
-
-  final public void FormalParameter15() throws ParseException {
-    Modifiers();
-    Type();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ELLIPSIS:
-      jj_consume_token(ELLIPSIS);
-      break;
-    default:
-      jj_la1[201] = jj_gen;
-      ;
-    }
-    VariableDeclaratorId();
-  }
-
-  final public void MemberSelector() throws ParseException {
-    jj_consume_token(DOT);
-    TypeArguments();
-    jj_consume_token(IDENTIFIER);
-  }
-
-  private boolean jj_2_1(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(0, xla); }
-  }
-
-  private boolean jj_2_2(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_2(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(1, xla); }
-  }
-
-  private boolean jj_2_3(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_3(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(2, xla); }
-  }
-
-  private boolean jj_2_4(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_4(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(3, xla); }
-  }
-
-  private boolean jj_2_5(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_5(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(4, xla); }
-  }
-
-  private boolean jj_2_6(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_6(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(5, xla); }
-  }
-
-  private boolean jj_2_7(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_7(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(6, xla); }
-  }
-
-  private boolean jj_2_8(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_8(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(7, xla); }
-  }
-
-  private boolean jj_2_9(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_9(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(8, xla); }
-  }
-
-  private boolean jj_2_10(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_10(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(9, xla); }
-  }
-
-  private boolean jj_2_11(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_11(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(10, xla); }
-  }
-
-  private boolean jj_2_12(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_12(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(11, xla); }
-  }
-
-  private boolean jj_2_13(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_13(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(12, xla); }
-  }
-
-  private boolean jj_2_14(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_14(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(13, xla); }
-  }
-
-  private boolean jj_2_15(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_15(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(14, xla); }
-  }
-
-  private boolean jj_2_16(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_16(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(15, xla); }
-  }
-
-  private boolean jj_2_17(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_17(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(16, xla); }
-  }
-
-  private boolean jj_2_18(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_18(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(17, xla); }
-  }
-
-  private boolean jj_2_19(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_19(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(18, xla); }
-  }
-
-  private boolean jj_2_20(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_20(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(19, xla); }
-  }
-
-  private boolean jj_2_21(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_21(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(20, xla); }
-  }
-
-  private boolean jj_2_22(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_22(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(21, xla); }
-  }
-
-  private boolean jj_2_23(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_23(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(22, xla); }
-  }
-
-  private boolean jj_2_24(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_24(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(23, xla); }
-  }
-
-  private boolean jj_2_25(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_25(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(24, xla); }
-  }
-
-  private boolean jj_2_26(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_26(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(25, xla); }
-  }
-
-  private boolean jj_2_27(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_27(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(26, xla); }
-  }
-
-  private boolean jj_2_28(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_28(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(27, xla); }
-  }
-
-  private boolean jj_2_29(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_29(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(28, xla); }
-  }
-
-  private boolean jj_2_30(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_30(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(29, xla); }
-  }
-
-  private boolean jj_2_31(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_31(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(30, xla); }
-  }
-
-  private boolean jj_2_32(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_32(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(31, xla); }
-  }
-
-  private boolean jj_2_33(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_33(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(32, xla); }
-  }
-
-  private boolean jj_2_34(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_34(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(33, xla); }
-  }
-
-  private boolean jj_2_35(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_35(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(34, xla); }
-  }
-
-  private boolean jj_2_36(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_36(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(35, xla); }
-  }
-
-  private boolean jj_2_37(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_37(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(36, xla); }
-  }
-
-  private boolean jj_2_38(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_38(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(37, xla); }
-  }
-
-  private boolean jj_2_39(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_39(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(38, xla); }
-  }
-
-  private boolean jj_2_40(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_40(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(39, xla); }
-  }
-
-  private boolean jj_2_41(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_41(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(40, xla); }
-  }
-
-  private boolean jj_2_42(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_42(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(41, xla); }
-  }
-
-  private boolean jj_2_43(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_43(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(42, xla); }
-  }
-
-  private boolean jj_2_44(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_44(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(43, xla); }
-  }
-
-  private boolean jj_2_45(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_45(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(44, xla); }
-  }
-
-  private boolean jj_2_46(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_46(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(45, xla); }
-  }
-
-  private boolean jj_2_47(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_47(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(46, xla); }
-  }
-
-  private boolean jj_2_48(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_48(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(47, xla); }
-  }
-
-  private boolean jj_2_49(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_49(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(48, xla); }
-  }
-
-  private boolean jj_2_50(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_50(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(49, xla); }
-  }
-
-  private boolean jj_2_51(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_51(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(50, xla); }
-  }
-
-  private boolean jj_2_52(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_52(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(51, xla); }
-  }
-
-  private boolean jj_2_53(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_53(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(52, xla); }
-  }
-
-  private boolean jj_2_54(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_54(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(53, xla); }
-  }
-
-  private boolean jj_2_55(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_55(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(54, xla); }
-  }
-
-  private boolean jj_2_56(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_56(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(55, xla); }
-  }
-
-  private boolean jj_2_57(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_57(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(56, xla); }
-  }
-
-  private boolean jj_2_58(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_58(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(57, xla); }
-  }
-
-  private boolean jj_2_59(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_59(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(58, xla); }
-  }
-
-  private boolean jj_2_60(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_60(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(59, xla); }
-  }
-
-  private boolean jj_2_61(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_61(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(60, xla); }
-  }
-
-  private boolean jj_2_62(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_62(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(61, xla); }
-  }
-
-  private boolean jj_3R_117() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_164()) {
-    jj_scanpos = xsp;
-    if (jj_3R_165()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_164() {
-    if (jj_3R_190()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_314() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_344()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_388() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_303() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_3R_314()) return true;
-    return false;
-  }
-
-  private boolean jj_3_50() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_389() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_408()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_104() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_363() {
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_388()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_389()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_304() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_315()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_352() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_351() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_321() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_3R_351()) {
-    jj_scanpos = xsp;
-    if (jj_3R_352()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_24() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_320() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_261() {
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_319() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_306() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_319()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_320()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_321()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_225()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_192() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_261()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_50()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_240() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_239()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_144() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_23() {
-    if (jj_scan_token(DOT)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_104()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_168() {
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_167() {
-    if (jj_3R_192()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_123() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_166()) {
-    jj_scanpos = xsp;
-    if (jj_3R_167()) {
-    jj_scanpos = xsp;
-    if (jj_3R_168()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_166() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_94() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_144()) return true;
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_23()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_239() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_221() {
-    if (jj_3R_239()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_240()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_207() {
-    if (jj_3R_221()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_122() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_162() {
-    if (jj_3R_111()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_114() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(63)) {
-    jj_scanpos = xsp;
-    if (jj_3R_162()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_194() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_123()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_195() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    return false;
-  }
-
-  private boolean jj_3_49() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_193() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_207()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_48() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_122()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(78)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_173() {
-    if (jj_3R_195()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_110() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(15)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(20)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(17)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(51)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(40)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(42)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(33)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(26)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_172() {
-    if (jj_3R_194()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_141() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_171()) {
-    jj_scanpos = xsp;
-    if (jj_3R_172()) {
-    jj_scanpos = xsp;
-    if (jj_3R_173()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_171() {
-    if (jj_3R_193()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_105() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(74)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(14)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_439() {
-    if (jj_scan_token(FINALLY)) return true;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_438() {
-    if (jj_scan_token(CATCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_386()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_274() {
-    if (jj_scan_token(TRY)) return true;
-    if (jj_3R_142()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_438()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_439()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_93() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_158() {
-    if (jj_3R_110()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_111() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_22()) {
-    jj_scanpos = xsp;
-    if (jj_3R_158()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_22() {
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_273() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_85() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) jj_scanpos = xsp;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_272() {
-    if (jj_scan_token(THROW)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_437() {
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3_20() {
-    if (jj_3R_102()) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_436() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_21() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_121() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_409() {
-    if (jj_3R_102()) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_271() {
-    if (jj_scan_token(RETURN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_437()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_391() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_409()) jj_scanpos = xsp;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_3R_189()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_455() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_263()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_446() {
-    if (jj_3R_451()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_435() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_390() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_3R_189()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_364() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_390()) {
-    jj_scanpos = xsp;
-    if (jj_3R_391()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_270() {
-    if (jj_scan_token(CONTINUE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_436()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_92() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_269() {
-    if (jj_scan_token(BREAK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_435()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_451() {
-    if (jj_3R_454()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_147() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_148() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_146() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(43)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_145() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_47() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(31)) jj_scanpos = xsp;
-    if (jj_3R_111()) return true;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_121()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_445() {
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_454() {
-    if (jj_3R_263()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_455()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_95() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_145()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_146()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_147()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_148()) jj_scanpos = xsp;
-    if (jj_3R_114()) return true;
-    if (jj_3R_105()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_91() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_11() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_91()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_92()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_93()) jj_scanpos = xsp;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_12() {
-    if (jj_3R_95()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_432() {
-    if (jj_scan_token(ELSE)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_453() {
-    if (jj_3R_454()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_90() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_46() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_310() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_452() {
-    if (jj_3R_222()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_450() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_452()) {
-    jj_scanpos = xsp;
-    if (jj_3R_453()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_300() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_310()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_311()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_299() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_298() {
-    if (jj_3R_308()) return true;
-    return false;
-  }
-
-  private boolean jj_3_10() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(ENUM)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_444() {
-    if (jj_3R_450()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_433() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_87() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_434() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_444()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_445()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_446()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_9() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_268() {
-    if (jj_scan_token(FOR)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_433()) {
-    jj_scanpos = xsp;
-    if (jj_3R_434()) return true;
-    }
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_297() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_89() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_8() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_89()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_90()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_350() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_296() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_306()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_88() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_267() {
-    if (jj_scan_token(DO)) return true;
-    if (jj_3R_223()) return true;
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3_7() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_88()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_331() {
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_86() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_6() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_86()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_87()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_295() {
-    if (jj_3R_305()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_266() {
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_294() {
-    if (jj_3R_304()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_265() {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_223()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_432()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_293() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_303()) return true;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_3R_85()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_290() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_3_5()) {
-    jj_scanpos = xsp;
-    if (jj_3R_293()) {
-    jj_scanpos = xsp;
-    if (jj_3R_294()) {
-    jj_scanpos = xsp;
-    if (jj_3R_295()) {
-    jj_scanpos = xsp;
-    if (jj_3R_296()) {
-    jj_scanpos = xsp;
-    if (jj_3R_297()) {
-    jj_scanpos = xsp;
-    if (jj_3R_298()) {
-    jj_scanpos = xsp;
-    if (jj_3R_299()) {
-    jj_scanpos = xsp;
-    if (jj_3R_300()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_443() {
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_399() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_101() {
-    if (jj_3R_102()) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_449() {
-    if (jj_scan_token(_DEFAULT)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3_19() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_101()) jj_scanpos = xsp;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_18() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_448() {
-    if (jj_scan_token(CASE)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_442() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_448()) {
-    jj_scanpos = xsp;
-    if (jj_3R_449()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_382() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_399()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_330() {
-    if (jj_3R_364()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_329() {
-    if (jj_3R_364()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_431() {
-    if (jj_3R_442()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_443()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_120() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_264() {
-    if (jj_scan_token(SWITCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_431()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_415() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_341()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_328() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_447() {
-    if (jj_3R_106()) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_441() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(100)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(101)) {
-    jj_scanpos = xsp;
-    if (jj_3R_447()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_326() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_285() {
-    if (jj_3R_102()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_441()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_347() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_284() {
-    if (jj_3R_215()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_346() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_318() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_3R_346()) {
-    jj_scanpos = xsp;
-    if (jj_3R_347()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_263() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_283()) {
-    jj_scanpos = xsp;
-    if (jj_3R_284()) {
-    jj_scanpos = xsp;
-    if (jj_3R_285()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_283() {
-    if (jj_3R_214()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_361() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_317() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_360() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_316() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_305() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_316()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_317()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_318()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_359() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_325() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_359()) {
-    jj_scanpos = xsp;
-    if (jj_3R_360()) {
-    jj_scanpos = xsp;
-    if (jj_3R_361()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_222() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    if (jj_3R_341()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_415()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_324() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_308() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_324()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_325()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_326()) jj_scanpos = xsp;
-    if (jj_3R_105()) return true;
-    if (jj_3R_327()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_328()) jj_scanpos = xsp;
-    if (jj_scan_token(LBRACE)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_329()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_330()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_331()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_381() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3_45() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(74)) return true;
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(87)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(84)) {
-    jj_scanpos = xsp;
-    if (jj_3R_120()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_287() {
-    if (jj_3R_290()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_211() {
-    if (jj_3R_225()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_210() {
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_209() {
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_276() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_287()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_196() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_208()) {
-    jj_scanpos = xsp;
-    if (jj_3R_209()) {
-    jj_scanpos = xsp;
-    if (jj_3R_210()) {
-    jj_scanpos = xsp;
-    if (jj_3R_211()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_208() {
-    if (jj_3R_222()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_174() {
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_349() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_381()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_382()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_386() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(122)) jj_scanpos = xsp;
-    if (jj_3R_377()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_142() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_174()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_430() {
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_262() {
-    if (jj_scan_token(ASSERT)) return true;
-    if (jj_3R_117()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_430()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_362() {
-    if (jj_3R_386()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_387()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_387() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_386()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_348() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_327() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_362()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_119() {
-    if (jj_scan_token(ASSERT)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_374() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_118() {
-    if (jj_3R_105()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_336() {
-    if (jj_3R_105()) return true;
-    if (jj_3R_327()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_374()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_254() {
-    if (jj_3R_274()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_253() {
-    if (jj_3R_273()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_252() {
-    if (jj_3R_272()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_251() {
-    if (jj_3R_271()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_224() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(CLASS)) return true;
-    if (jj_3R_105()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_348()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_349()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_350()) jj_scanpos = xsp;
-    if (jj_3R_276()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_250() {
-    if (jj_3R_270()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_249() {
-    if (jj_3R_269()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_248() {
-    if (jj_3R_268()) return true;
-    return false;
-  }
-
-  private boolean jj_3_41() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_247() {
-    if (jj_3R_267()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_246() {
-    if (jj_3R_266()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_116() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_137()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_245() {
-    if (jj_3R_265()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_244() {
-    if (jj_3R_264()) return true;
-    return false;
-  }
-
-  private boolean jj_3_44() {
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_421() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_341()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_243() {
-    if (jj_3R_263()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_242() {
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_241() {
-    if (jj_3R_262()) return true;
-    return false;
-  }
-
-  private boolean jj_3_43() {
-    if (jj_3R_118()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_223() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_43()) {
-    jj_scanpos = xsp;
-    if (jj_3R_241()) {
-    jj_scanpos = xsp;
-    if (jj_3R_242()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_3R_243()) {
-    jj_scanpos = xsp;
-    if (jj_3R_244()) {
-    jj_scanpos = xsp;
-    if (jj_3R_245()) {
-    jj_scanpos = xsp;
-    if (jj_3R_246()) {
-    jj_scanpos = xsp;
-    if (jj_3R_247()) {
-    jj_scanpos = xsp;
-    if (jj_3R_248()) {
-    jj_scanpos = xsp;
-    if (jj_3R_249()) {
-    jj_scanpos = xsp;
-    if (jj_3R_250()) {
-    jj_scanpos = xsp;
-    if (jj_3R_251()) {
-    jj_scanpos = xsp;
-    if (jj_3R_252()) {
-    jj_scanpos = xsp;
-    if (jj_3R_253()) {
-    jj_scanpos = xsp;
-    if (jj_3R_254()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_62() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_429() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_275() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_40() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_255() {
-    Token xsp;
-    if (jj_3R_275()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_275()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_177()) return true;
-    return false;
-  }
-
-  private boolean jj_3_42() {
-    Token xsp;
-    if (jj_3_40()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_40()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_41()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_228() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_42()) {
-    jj_scanpos = xsp;
-    if (jj_3R_255()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_61() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_412() {
-    if (jj_3R_111()) return true;
-    if (jj_3R_341()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_421()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_238() {
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_220() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_237()) {
-    jj_scanpos = xsp;
-    if (jj_3R_238()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_237() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_406() {
-    if (jj_3R_413()) return true;
-    return false;
-  }
-
-  private boolean jj_3_60() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_140()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_226() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_153() {
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_62()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_152() {
-    if (jj_3R_110()) return true;
-    Token xsp;
-    if (jj_3_61()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_61()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_103() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_152()) {
-    jj_scanpos = xsp;
-    if (jj_3R_153()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_206() {
-    if (jj_3R_220()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_170() {
-    if (jj_scan_token(HOOK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_206()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_256() {
-    if (jj_3R_276()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_140() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_169()) {
-    jj_scanpos = xsp;
-    if (jj_3R_170()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_169() {
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_405() {
-    if (jj_3R_189()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_139() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_337() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_137() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_140()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_60()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_231() {
-    if (jj_3R_189()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_256()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_230() {
-    if (jj_3R_228()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_163() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_229()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_230()) {
-    jj_scanpos = xsp;
-    if (jj_3R_231()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_229() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_338() {
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_212() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_226()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_58() {
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_139()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(87)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_138() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_115() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_39()) {
-    jj_scanpos = xsp;
-    if (jj_3R_163()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_39() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_110()) return true;
-    if (jj_3R_228()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_136() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_405()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_406()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_57() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_138()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_277() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_427() {
-    if (jj_3R_429()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_426() {
-    if (jj_3R_412()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_425() {
-    if (jj_3R_308()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_424() {
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_423() {
-    if (jj_3R_411()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_335() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_217() {
-    if (jj_3R_117()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_277()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_204() {
-    if (jj_3R_217()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_414() {
-    if (jj_3R_84()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_423()) {
-    jj_scanpos = xsp;
-    if (jj_3R_424()) {
-    jj_scanpos = xsp;
-    if (jj_3R_425()) {
-    jj_scanpos = xsp;
-    if (jj_3R_426()) {
-    jj_scanpos = xsp;
-    if (jj_3R_427()) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_334() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_189() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_204()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_407() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_59()) {
-    jj_scanpos = xsp;
-    if (jj_3R_414()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_59() {
-    if (jj_3R_85()) return true;
-    return false;
-  }
-
-  private boolean jj_3_4() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_373() {
-    if (jj_scan_token(TESTAAAA)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_83() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_56() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_372() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_227() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(61)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(30)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_55() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_56()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_197() {
-    if (jj_3R_212()) return true;
-    return false;
-  }
-
-  private boolean jj_3_54() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_371() {
-    if (jj_scan_token(NATIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_3() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_53() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_136()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_213() {
-    if (jj_3R_227()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_82() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_370() {
-    if (jj_scan_token(FINAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_82()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_83()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_184() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_54()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_55()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_385() {
-    if (jj_3R_407()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_198() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(66)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(70)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(72)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(73)) {
-    jj_scanpos = xsp;
-    if (jj_3R_213()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(45)) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_175() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_197()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_369() {
-    if (jj_scan_token(ABSTRACT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_358() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_385()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_161() {
-    if (jj_3R_189()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_368() {
-    if (jj_scan_token(STATIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_357() {
-    if (jj_3R_136()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_53()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_160() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_367() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_159() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_323() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_357()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_358()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_38() {
-    if (jj_3R_116()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_366() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3_33() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_37() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_115()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_112() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_36()) {
-    jj_scanpos = xsp;
-    if (jj_3_37()) {
-    jj_scanpos = xsp;
-    if (jj_3_38()) {
-    jj_scanpos = xsp;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
-    if (jj_3R_160()) {
-    jj_scanpos = xsp;
-    if (jj_3R_161()) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_36() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_422() {
-    if (jj_3R_407()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_365() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_333() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_365()) {
-    jj_scanpos = xsp;
-    if (jj_3R_366()) {
-    jj_scanpos = xsp;
-    if (jj_3R_367()) {
-    jj_scanpos = xsp;
-    if (jj_3R_368()) {
-    jj_scanpos = xsp;
-    if (jj_3R_369()) {
-    jj_scanpos = xsp;
-    if (jj_3R_370()) {
-    jj_scanpos = xsp;
-    if (jj_3R_371()) {
-    jj_scanpos = xsp;
-    if (jj_3R_372()) {
-    jj_scanpos = xsp;
-    if (jj_3R_373()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_413() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_422()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_35() {
-    if (jj_3R_114()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_183() {
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_33()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_188() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_384() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_113() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_356() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_384()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_332() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_182() {
-    if (jj_3R_114()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_176() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_175()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_181() {
-    if (jj_3R_115()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_180() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_440() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_428() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_440()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_17() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_100()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_309() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_332()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_333()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_334()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_335()) jj_scanpos = xsp;
-    if (jj_3R_114()) return true;
-    if (jj_3R_336()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_337()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_338()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_199() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_34() {
-    if (jj_scan_token(SUPER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(85)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_113()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_32() {
-    if (jj_3R_112()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_342() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_341()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_143() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_175()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_176()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_393() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_179() {
-    if (jj_scan_token(THIS)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(85)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_199()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_151() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_178()) {
-    jj_scanpos = xsp;
-    if (jj_3R_179()) {
-    jj_scanpos = xsp;
-    if (jj_3_34()) {
-    jj_scanpos = xsp;
-    if (jj_3R_180()) {
-    jj_scanpos = xsp;
-    if (jj_3R_181()) {
-    jj_scanpos = xsp;
-    if (jj_3R_182()) {
-    jj_scanpos = xsp;
-    if (jj_3R_183()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_178() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_280() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(100)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(101)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_286() {
-    if (jj_3R_100()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_17()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_378() {
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_100()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_187() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_102() {
-    if (jj_3R_151()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_32()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_31() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_110()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_392() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_177() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_286()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_150() {
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_279() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_216()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_99() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_377() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_392()) return true;
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_393()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_149() {
-    if (jj_3R_177()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_100() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_149()) {
-    jj_scanpos = xsp;
-    if (jj_3R_150()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_30() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_257() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_278()) {
-    jj_scanpos = xsp;
-    if (jj_3R_279()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_278() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_97() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_258() {
-    if (jj_3R_102()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_280()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_341() {
-    if (jj_3R_377()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_378()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_29() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_340() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_322() {
-    if (jj_3R_356()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_98() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_14() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_98()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_99()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_157() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(91)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(90)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(77)) {
-    jj_scanpos = xsp;
-    if (jj_3R_187()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(57)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(54)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(44)) {
-    jj_scanpos = xsp;
-    if (jj_3R_188()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_96() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_13() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_96()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_97()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_156() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_307() {
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_322()) jj_scanpos = xsp;
-    if (jj_3R_323()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_109() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_28()) {
-    jj_scanpos = xsp;
-    if (jj_3R_156()) {
-    jj_scanpos = xsp;
-    if (jj_3R_157()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_28() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_110()) return true;
-    return false;
-  }
-
-  private boolean jj_3_27() {
-    if (jj_3R_109()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_417() {
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_234() {
-    if (jj_3R_258()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_420() {
-    if (jj_3R_356()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_419() {
-    if (jj_3R_428()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_233() {
-    if (jj_3R_257()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_418() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_81() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_376() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_375() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_339() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_375()) {
-    jj_scanpos = xsp;
-    if (jj_3R_376()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(60)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(64)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_1() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_81()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(PACKAGE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_107() {
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(88)) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_411() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(21)) {
-    jj_scanpos = xsp;
-    if (jj_3R_417()) return true;
-    }
-    if (jj_scan_token(IDENTIFIER)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_418()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_419()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_420()) jj_scanpos = xsp;
-    if (jj_3R_413()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_311() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_339()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_340()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_111()) return true;
-    if (jj_3R_341()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_342()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_216() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_232()) {
-    jj_scanpos = xsp;
-    if (jj_3R_233()) {
-    jj_scanpos = xsp;
-    if (jj_3R_234()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_232() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(91)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(90)) return true;
-    }
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3_16() {
-    if (jj_3R_95()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_215() {
-    if (jj_scan_token(DECR)) return true;
-    if (jj_3R_102()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_155() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(102)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(103)) return true;
-    }
-    if (jj_3R_154()) return true;
-    return false;
-  }
-
-  private boolean jj_3_15() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_186() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(104)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(105)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(109)) return true;
-    }
-    }
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_404() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_311()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_214() {
-    if (jj_scan_token(INCR)) return true;
-    if (jj_3R_102()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_135() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_403() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_203() {
-    if (jj_3R_216()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_134() {
-    if (jj_scan_token(TESTAAAA)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_202() {
-    if (jj_3R_215()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_402() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3_26() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(110)) {
-    jj_scanpos = xsp;
-    if (jj_3R_107()) return true;
-    }
-    if (jj_3R_108()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_201() {
-    if (jj_3R_214()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_133() {
-    if (jj_scan_token(VOLATILE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_401() {
-    if (jj_3R_306()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_185() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_200()) {
-    jj_scanpos = xsp;
-    if (jj_3R_201()) {
-    jj_scanpos = xsp;
-    if (jj_3R_202()) {
-    jj_scanpos = xsp;
-    if (jj_3R_203()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_200() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(102)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(103)) return true;
-    }
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_400() {
-    if (jj_3R_305()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_132() {
-    if (jj_scan_token(TRANSIENT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_383() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_3R_400()) {
-    jj_scanpos = xsp;
-    if (jj_3R_401()) {
-    jj_scanpos = xsp;
-    if (jj_3R_402()) {
-    jj_scanpos = xsp;
-    if (jj_3R_403()) {
-    jj_scanpos = xsp;
-    if (jj_3R_404()) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_154() {
-    if (jj_3R_185()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_186()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_131() {
-    if (jj_scan_token(NATIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_343() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(89)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(88)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(95)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(96)) return true;
-    }
-    }
-    }
-    if (jj_3R_312()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_313() {
-    if (jj_scan_token(INSTANCEOF)) return true;
-    if (jj_3R_111()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_108() {
-    if (jj_3R_154()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_155()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_354() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_130() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_302() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(94)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(97)) return true;
-    }
-    if (jj_3R_291()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_129() {
-    if (jj_scan_token(ABSTRACT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_312() {
-    if (jj_3R_108()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_26()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_128() {
-    if (jj_scan_token(FINAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_292() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_288()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_127() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_301() {
-    if (jj_3R_312()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_343()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_353() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_282() {
-    if (jj_scan_token(BIT_OR)) return true;
-    if (jj_3R_259()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_126() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_289() {
-    if (jj_scan_token(XOR)) return true;
-    if (jj_3R_281()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_291() {
-    if (jj_3R_301()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_313()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_125() {
-    if (jj_scan_token(STATIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_260() {
-    if (jj_scan_token(SC_AND)) return true;
-    if (jj_3R_235()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_288() {
-    if (jj_3R_291()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_302()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_236() {
-    if (jj_scan_token(SC_OR)) return true;
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_124() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_281() {
-    if (jj_3R_288()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_292()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_52() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_124()) {
-    jj_scanpos = xsp;
-    if (jj_3R_125()) {
-    jj_scanpos = xsp;
-    if (jj_3R_126()) {
-    jj_scanpos = xsp;
-    if (jj_3R_127()) {
-    jj_scanpos = xsp;
-    if (jj_3R_128()) {
-    jj_scanpos = xsp;
-    if (jj_3R_129()) {
-    jj_scanpos = xsp;
-    if (jj_3R_130()) {
-    jj_scanpos = xsp;
-    if (jj_3R_131()) {
-    jj_scanpos = xsp;
-    if (jj_3R_132()) {
-    jj_scanpos = xsp;
-    if (jj_3R_133()) {
-    jj_scanpos = xsp;
-    if (jj_3R_134()) {
-    jj_scanpos = xsp;
-    if (jj_3R_135()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_219() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_84() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_52()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_355() {
-    if (jj_3R_383()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_344() {
-    if (jj_3R_345()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_259() {
-    if (jj_3R_281()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_289()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_410() {
-    if (jj_3R_416()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_235() {
-    if (jj_3R_259()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_282()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_225() {
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_3R_105()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_353()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_354()) jj_scanpos = xsp;
-    if (jj_scan_token(LBRACE)) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_355()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_416() {
-    if (jj_scan_token(_DEFAULT)) return true;
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_218() {
-    if (jj_3R_235()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_260()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_380() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_205() {
-    if (jj_3R_218()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_236()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_398() {
-    if (jj_3R_412()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_191() {
-    if (jj_3R_205()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_219()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_397() {
-    if (jj_3R_303()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_315() {
-    if (jj_3R_345()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_396() {
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3_51() {
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_395() {
-    if (jj_3R_411()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_106() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(87)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(113)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(114)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(118)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(111)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(112)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(119)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(120)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(121)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(115)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(117)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(116)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_25() {
-    if (jj_3R_102()) return true;
-    if (jj_3R_106()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_190() {
-    if (jj_3R_102()) return true;
-    if (jj_3R_106()) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_394() {
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_410()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_379() {
-    if (jj_3R_84()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_394()) {
-    jj_scanpos = xsp;
-    if (jj_3R_395()) {
-    jj_scanpos = xsp;
-    if (jj_3R_396()) {
-    jj_scanpos = xsp;
-    if (jj_3R_397()) {
-    jj_scanpos = xsp;
-    if (jj_3R_398()) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_345() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_379()) {
-    jj_scanpos = xsp;
-    if (jj_3R_380()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_165() {
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_408() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  /** Generated Token Manager. */
-  public JavaParserTokenManager token_source;
-  JavaCharStream jj_input_stream;
-  /** Current token. */
-  public Token token;
-  /** Next token. */
-  public Token jj_nt;
-  private int jj_ntk;
-  private Token jj_scanpos, jj_lastpos;
-  private int jj_la;
-  private int jj_gen;
-  final private int[] jj_la1 = new int[202];
-  static private int[] jj_la1_0;
-  static private int[] jj_la1_1;
-  static private int[] jj_la1_2;
-  static private int[] jj_la1_3;
-  static {
-      jj_la1_init_0();
-      jj_la1_init_1();
-      jj_la1_init_2();
-      jj_la1_init_3();
-   }
-   private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x0,0x90202000,0x0,0x0,0x0,0x90202000,0x0,0x0,0x80002000,0x80002000,0x200000,0x0,0x0,0x0,0x80002000,0x0,0x0,0x80002000,0x80002000,0x0,0x0,0x0,0x0,0x20000000,0x0,0x9432e000,0x0,0x0,0x80002000,0x80002000,0x0,0x0,0x84128000,0x0,0x80002000,0x80002000,0x0,0x0,0x0,0x0,0x2000,0x2000,0x0,0x0,0x80002000,0x80002000,0x0,0x20000000,0x9432a000,0x0,0x8412a000,0x80000000,0x80000000,0x0,0x0,0x0,0x10004000,0x0,0x5412c000,0x5412c000,0x0,0x0,0x80002000,0x80002000,0x0,0x0,0x0,0x0 [...]
-   }
-   private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] {0x40,0x11338a00,0x4040,0x4040,0x40,0x11338a00,0x4000,0x40,0x1220000,0x1220000,0x200,0x0,0x100000,0x0,0x11338800,0x0,0x0,0x1220000,0x1220000,0x0,0x0,0x0,0x0,0x0,0x20,0x913b8f02,0x0,0x0,0x338000,0x338000,0x0,0x0,0x101b8502,0x0,0x1338800,0x1338800,0x0,0x0,0x0,0x0,0x220000,0x220000,0x0,0x0,0x338000,0x338000,0x0,0x0,0x913b8f02,0x0,0x113b8d02,0x10138000,0x10138000,0x0,0x0,0x0,0x0,0x0,0xa2483502,0xa2483502,0x0,0x0,0x1338800,0x1338800,0x0,0x0,0x8000000,0x0,0x0,0x0,0x1 [...]
-   }
-   private static void jj_la1_init_2() {
-      jj_la1_2 = new int[] {0x0,0x480001,0x400000,0x400000,0x0,0x480001,0x400000,0x0,0x0,0x0,0x0,0x400000,0x0,0x200000,0x480001,0x400000,0x400000,0x0,0x0,0x2000000,0x2000000,0x200000,0x2000000,0x0,0x0,0x2488401,0x400000,0x400000,0x0,0x0,0x400000,0x80000,0x400401,0x400000,0x0,0x0,0x400000,0x2000000,0x400000,0x400000,0x0,0x0,0x400000,0x400000,0x0,0x0,0x2000000,0x0,0x2480401,0x80000,0x400401,0x1,0x1,0x400000,0x100000,0x800000,0x400,0x20000,0xc00a744,0xc00a744,0x100000,0x400000,0x0,0x0,0x400 [...]
-   }
-   private static void jj_la1_init_3() {
-      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf0,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x0,0x0,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf0,0x3ff8000,0x0,0x4,0x8,0x800,0x1000,0x400,0x2,0x2,0x0,0x1,0x1,0x0,0x4000,0xc0,0xc0,0x2300,0 [...]
-   }
-  final private JJCalls[] jj_2_rtns = new JJCalls[62];
-  private boolean jj_rescan = false;
-  private int jj_gc = 0;
-
-  /** Constructor with InputStream. */
-  public JavaParser(java.io.InputStream stream) {
-     this(stream, null);
-  }
-  /** Constructor with InputStream and supplied encoding */
-  public JavaParser(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source = new JavaParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream) {
-     ReInit(stream, null);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Constructor. */
-  public JavaParser(java.io.Reader stream) {
-    jj_input_stream = new JavaCharStream(stream, 1, 1);
-    token_source = new JavaParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Constructor with generated Token Manager. */
-  public JavaParser(JavaParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Reinitialise. */
-  public void ReInit(JavaParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      jj_gen++;
-      if (++jj_gc > 100) {
-        jj_gc = 0;
-        for (int i = 0; i < jj_2_rtns.length; i++) {
-          JJCalls c = jj_2_rtns[i];
-          while (c != null) {
-            if (c.gen < jj_gen) c.first = null;
-            c = c.next;
-          }
-        }
-      }
-      return token;
-    }
-    token = oldToken;
-    jj_kind = kind;
-    throw generateParseException();
-  }
-
-  static private final class LookaheadSuccess extends java.lang.Error { }
-  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
-  private boolean jj_scan_token(int kind) {
-    if (jj_scanpos == jj_lastpos) {
-      jj_la--;
-      if (jj_scanpos.next == null) {
-        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
-      } else {
-        jj_lastpos = jj_scanpos = jj_scanpos.next;
-      }
-    } else {
-      jj_scanpos = jj_scanpos.next;
-    }
-    if (jj_rescan) {
-      int i = 0; Token tok = token;
-      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
-      if (tok != null) jj_add_error_token(kind, i);
-    }
-    if (jj_scanpos.kind != kind) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
-    return false;
-  }
-
-
-/** Get the next Token. */
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    jj_gen++;
-    return token;
-  }
-
-/** Get the specific Token. */
-  final public Token getToken(int index) {
-    Token t = token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
-    }
-    return t;
-  }
-
-  private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
-
-  private java.util.List jj_expentries = new java.util.ArrayList();
-  private int[] jj_expentry;
-  private int jj_kind = -1;
-  private int[] jj_lasttokens = new int[100];
-  private int jj_endpos;
-
-  private void jj_add_error_token(int kind, int pos) {
-    if (pos >= 100) return;
-    if (pos == jj_endpos + 1) {
-      jj_lasttokens[jj_endpos++] = kind;
-    } else if (jj_endpos != 0) {
-      jj_expentry = new int[jj_endpos];
-      for (int i = 0; i < jj_endpos; i++) {
-        jj_expentry[i] = jj_lasttokens[i];
-      }
-      jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) {
-        int[] oldentry = (int[])(it.next());
-        if (oldentry.length == jj_expentry.length) {
-          for (int i = 0; i < jj_expentry.length; i++) {
-            if (oldentry[i] != jj_expentry[i]) {
-              continue jj_entries_loop;
-            }
-          }
-          jj_expentries.add(jj_expentry);
-          break jj_entries_loop;
-        }
-      }
-      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
-    }
-  }
-
-  /** Generate ParseException. */
-  public ParseException generateParseException() {
-    jj_expentries.clear();
-    boolean[] la1tokens = new boolean[123];
-    if (jj_kind >= 0) {
-      la1tokens[jj_kind] = true;
-      jj_kind = -1;
-    }
-    for (int i = 0; i < 202; i++) {
-      if (jj_la1[i] == jj_gen) {
-        for (int j = 0; j < 32; j++) {
-          if ((jj_la1_0[i] & (1<<j)) != 0) {
-            la1tokens[j] = true;
-          }
-          if ((jj_la1_1[i] & (1<<j)) != 0) {
-            la1tokens[32+j] = true;
-          }
-          if ((jj_la1_2[i] & (1<<j)) != 0) {
-            la1tokens[64+j] = true;
-          }
-          if ((jj_la1_3[i] & (1<<j)) != 0) {
-            la1tokens[96+j] = true;
-          }
-        }
-      }
-    }
-    for (int i = 0; i < 123; i++) {
-      if (la1tokens[i]) {
-        jj_expentry = new int[1];
-        jj_expentry[0] = i;
-        jj_expentries.add(jj_expentry);
-      }
-    }
-    jj_endpos = 0;
-    jj_rescan_token();
-    jj_add_error_token(0, 0);
-    int[][] exptokseq = new int[jj_expentries.size()][];
-    for (int i = 0; i < jj_expentries.size(); i++) {
-      exptokseq[i] = (int[])jj_expentries.get(i);
-    }
-    return new ParseException(token, exptokseq, tokenImage);
-  }
-
-  /** Enable tracing. */
-  final public void enable_tracing() {
-  }
-
-  /** Disable tracing. */
-  final public void disable_tracing() {
-  }
-
-  private void jj_rescan_token() {
-    jj_rescan = true;
-    for (int i = 0; i < 62; i++) {
-    try {
-      JJCalls p = jj_2_rtns[i];
-      do {
-        if (p.gen > jj_gen) {
-          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
-          switch (i) {
-            case 0: jj_3_1(); break;
-            case 1: jj_3_2(); break;
-            case 2: jj_3_3(); break;
-            case 3: jj_3_4(); break;
-            case 4: jj_3_5(); break;
-            case 5: jj_3_6(); break;
-            case 6: jj_3_7(); break;
-            case 7: jj_3_8(); break;
-            case 8: jj_3_9(); break;
-            case 9: jj_3_10(); break;
-            case 10: jj_3_11(); break;
-            case 11: jj_3_12(); break;
-            case 12: jj_3_13(); break;
-            case 13: jj_3_14(); break;
-            case 14: jj_3_15(); break;
-            case 15: jj_3_16(); break;
-            case 16: jj_3_17(); break;
-            case 17: jj_3_18(); break;
-            case 18: jj_3_19(); break;
-            case 19: jj_3_20(); break;
-            case 20: jj_3_21(); break;
-            case 21: jj_3_22(); break;
-            case 22: jj_3_23(); break;
-            case 23: jj_3_24(); break;
-            case 24: jj_3_25(); break;
-            case 25: jj_3_26(); break;
-            case 26: jj_3_27(); break;
-            case 27: jj_3_28(); break;
-            case 28: jj_3_29(); break;
-            case 29: jj_3_30(); break;
-            case 30: jj_3_31(); break;
-            case 31: jj_3_32(); break;
-            case 32: jj_3_33(); break;
-            case 33: jj_3_34(); break;
-            case 34: jj_3_35(); break;
-            case 35: jj_3_36(); break;
-            case 36: jj_3_37(); break;
-            case 37: jj_3_38(); break;
-            case 38: jj_3_39(); break;
-            case 39: jj_3_40(); break;
-            case 40: jj_3_41(); break;
-            case 41: jj_3_42(); break;
-            case 42: jj_3_43(); break;
-            case 43: jj_3_44(); break;
-            case 44: jj_3_45(); break;
-            case 45: jj_3_46(); break;
-            case 46: jj_3_47(); break;
-            case 47: jj_3_48(); break;
-            case 48: jj_3_49(); break;
-            case 49: jj_3_50(); break;
-            case 50: jj_3_51(); break;
-            case 51: jj_3_52(); break;
-            case 52: jj_3_53(); break;
-            case 53: jj_3_54(); break;
-            case 54: jj_3_55(); break;
-            case 55: jj_3_56(); break;
-            case 56: jj_3_57(); break;
-            case 57: jj_3_58(); break;
-            case 58: jj_3_59(); break;
-            case 59: jj_3_60(); break;
-            case 60: jj_3_61(); break;
-            case 61: jj_3_62(); break;
-          }
-        }
-        p = p.next;
-      } while (p != null);
-      } catch(LookaheadSuccess ls) { }
-    }
-    jj_rescan = false;
-  }
-
-  private void jj_save(int index, int xla) {
-    JJCalls p = jj_2_rtns[index];
-    while (p.gen > jj_gen) {
-      if (p.next == null) { p = p.next = new JJCalls(); break; }
-      p = p.next;
-    }
-    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
-  }
-
-  static final class JJCalls {
-    int gen;
-    Token first;
-    int arg;
-    JJCalls next;
-  }
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/JavaParserConstants.java b/src/net/sourceforge/cobertura/javancss/parser/JavaParserConstants.java
deleted file mode 100644
index 0d676d4..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/JavaParserConstants.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParserConstants.java */
-package net.sourceforge.cobertura.javancss.parser;
-
-
-/**
- * Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
- */
-public interface JavaParserConstants {
-
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int SINGLE_LINE_COMMENT = 8;
-  /** RegularExpression Id. */
-  int SINGLE_LINE_COMMENT2 = 9;
-  /** RegularExpression Id. */
-  int END_OF_LINE_MULTI = 10;
-  /** RegularExpression Id. */
-  int MULTI_LINE_COMMENT = 11;
-  /** RegularExpression Id. */
-  int ABSTRACT = 13;
-  /** RegularExpression Id. */
-  int ASSERT = 14;
-  /** RegularExpression Id. */
-  int BOOLEAN = 15;
-  /** RegularExpression Id. */
-  int BREAK = 16;
-  /** RegularExpression Id. */
-  int BYTE = 17;
-  /** RegularExpression Id. */
-  int CASE = 18;
-  /** RegularExpression Id. */
-  int CATCH = 19;
-  /** RegularExpression Id. */
-  int CHAR = 20;
-  /** RegularExpression Id. */
-  int CLASS = 21;
-  /** RegularExpression Id. */
-  int CONST = 22;
-  /** RegularExpression Id. */
-  int CONTINUE = 23;
-  /** RegularExpression Id. */
-  int _DEFAULT = 24;
-  /** RegularExpression Id. */
-  int DO = 25;
-  /** RegularExpression Id. */
-  int DOUBLE = 26;
-  /** RegularExpression Id. */
-  int ELSE = 27;
-  /** RegularExpression Id. */
-  int ENUM = 28;
-  /** RegularExpression Id. */
-  int EXTENDS = 29;
-  /** RegularExpression Id. */
-  int FALSE = 30;
-  /** RegularExpression Id. */
-  int FINAL = 31;
-  /** RegularExpression Id. */
-  int FINALLY = 32;
-  /** RegularExpression Id. */
-  int FLOAT = 33;
-  /** RegularExpression Id. */
-  int FOR = 34;
-  /** RegularExpression Id. */
-  int GOTO = 35;
-  /** RegularExpression Id. */
-  int IF = 36;
-  /** RegularExpression Id. */
-  int IMPLEMENTS = 37;
-  /** RegularExpression Id. */
-  int IMPORT = 38;
-  /** RegularExpression Id. */
-  int INSTANCEOF = 39;
-  /** RegularExpression Id. */
-  int INT = 40;
-  /** RegularExpression Id. */
-  int INTERFACE = 41;
-  /** RegularExpression Id. */
-  int LONG = 42;
-  /** RegularExpression Id. */
-  int NATIVE = 43;
-  /** RegularExpression Id. */
-  int NEW = 44;
-  /** RegularExpression Id. */
-  int NULL = 45;
-  /** RegularExpression Id. */
-  int PACKAGE = 46;
-  /** RegularExpression Id. */
-  int PRIVATE = 47;
-  /** RegularExpression Id. */
-  int PROTECTED = 48;
-  /** RegularExpression Id. */
-  int PUBLIC = 49;
-  /** RegularExpression Id. */
-  int RETURN = 50;
-  /** RegularExpression Id. */
-  int SHORT = 51;
-  /** RegularExpression Id. */
-  int STATIC = 52;
-  /** RegularExpression Id. */
-  int TESTAAAA = 53;
-  /** RegularExpression Id. */
-  int SUPER = 54;
-  /** RegularExpression Id. */
-  int SWITCH = 55;
-  /** RegularExpression Id. */
-  int SYNCHRONIZED = 56;
-  /** RegularExpression Id. */
-  int THIS = 57;
-  /** RegularExpression Id. */
-  int THROW = 58;
-  /** RegularExpression Id. */
-  int THROWS = 59;
-  /** RegularExpression Id. */
-  int TRANSIENT = 60;
-  /** RegularExpression Id. */
-  int TRUE = 61;
-  /** RegularExpression Id. */
-  int TRY = 62;
-  /** RegularExpression Id. */
-  int VOID = 63;
-  /** RegularExpression Id. */
-  int VOLATILE = 64;
-  /** RegularExpression Id. */
-  int WHILE = 65;
-  /** RegularExpression Id. */
-  int INTEGER_LITERAL = 66;
-  /** RegularExpression Id. */
-  int DECIMAL_LITERAL = 67;
-  /** RegularExpression Id. */
-  int HEX_LITERAL = 68;
-  /** RegularExpression Id. */
-  int OCTAL_LITERAL = 69;
-  /** RegularExpression Id. */
-  int FLOATING_POINT_LITERAL = 70;
-  /** RegularExpression Id. */
-  int EXPONENT = 71;
-  /** RegularExpression Id. */
-  int CHARACTER_LITERAL = 72;
-  /** RegularExpression Id. */
-  int STRING_LITERAL = 73;
-  /** RegularExpression Id. */
-  int IDENTIFIER = 74;
-  /** RegularExpression Id. */
-  int LETTER = 75;
-  /** RegularExpression Id. */
-  int DIGIT = 76;
-  /** RegularExpression Id. */
-  int LPAREN = 77;
-  /** RegularExpression Id. */
-  int RPAREN = 78;
-  /** RegularExpression Id. */
-  int LBRACE = 79;
-  /** RegularExpression Id. */
-  int RBRACE = 80;
-  /** RegularExpression Id. */
-  int LBRACKET = 81;
-  /** RegularExpression Id. */
-  int RBRACKET = 82;
-  /** RegularExpression Id. */
-  int SEMICOLON = 83;
-  /** RegularExpression Id. */
-  int COMMA = 84;
-  /** RegularExpression Id. */
-  int DOT = 85;
-  /** RegularExpression Id. */
-  int AT = 86;
-  /** RegularExpression Id. */
-  int ASSIGN = 87;
-  /** RegularExpression Id. */
-  int GT = 88;
-  /** RegularExpression Id. */
-  int LT = 89;
-  /** RegularExpression Id. */
-  int BANG = 90;
-  /** RegularExpression Id. */
-  int TILDE = 91;
-  /** RegularExpression Id. */
-  int HOOK = 92;
-  /** RegularExpression Id. */
-  int COLON = 93;
-  /** RegularExpression Id. */
-  int EQ = 94;
-  /** RegularExpression Id. */
-  int LE = 95;
-  /** RegularExpression Id. */
-  int GE = 96;
-  /** RegularExpression Id. */
-  int NE = 97;
-  /** RegularExpression Id. */
-  int SC_OR = 98;
-  /** RegularExpression Id. */
-  int SC_AND = 99;
-  /** RegularExpression Id. */
-  int INCR = 100;
-  /** RegularExpression Id. */
-  int DECR = 101;
-  /** RegularExpression Id. */
-  int PLUS = 102;
-  /** RegularExpression Id. */
-  int MINUS = 103;
-  /** RegularExpression Id. */
-  int STAR = 104;
-  /** RegularExpression Id. */
-  int SLASH = 105;
-  /** RegularExpression Id. */
-  int BIT_AND = 106;
-  /** RegularExpression Id. */
-  int BIT_OR = 107;
-  /** RegularExpression Id. */
-  int XOR = 108;
-  /** RegularExpression Id. */
-  int REM = 109;
-  /** RegularExpression Id. */
-  int LSHIFT = 110;
-  /** RegularExpression Id. */
-  int PLUSASSIGN = 111;
-  /** RegularExpression Id. */
-  int MINUSASSIGN = 112;
-  /** RegularExpression Id. */
-  int STARASSIGN = 113;
-  /** RegularExpression Id. */
-  int SLASHASSIGN = 114;
-  /** RegularExpression Id. */
-  int ANDASSIGN = 115;
-  /** RegularExpression Id. */
-  int ORASSIGN = 116;
-  /** RegularExpression Id. */
-  int XORASSIGN = 117;
-  /** RegularExpression Id. */
-  int REMASSIGN = 118;
-  /** RegularExpression Id. */
-  int LSHIFTASSIGN = 119;
-  /** RegularExpression Id. */
-  int RSIGNEDSHIFTASSIGN = 120;
-  /** RegularExpression Id. */
-  int RUNSIGNEDSHIFTASSIGN = 121;
-  /** RegularExpression Id. */
-  int ELLIPSIS = 122;
-
-  /** Lexical state. */
-  int DEFAULT = 0;
-  /** Lexical state. */
-  int IN_SINGLE_LINE_COMMENT = 1;
-  /** Lexical state. */
-  int IN_MULTI_LINE_COMMENT = 2;
-
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "\" \"",
-    "\"\\t\"",
-    "\"\\n\"",
-    "\"\\r\"",
-    "\"\\f\"",
-    "\"\\u001a\"",
-    "\"/*\"",
-    "\"//\"",
-    "<SINGLE_LINE_COMMENT2>",
-    "<END_OF_LINE_MULTI>",
-    "\"*/\"",
-    "<token of kind 12>",
-    "\"abstract\"",
-    "\"assert\"",
-    "\"boolean\"",
-    "\"break\"",
-    "\"byte\"",
-    "\"case\"",
-    "\"catch\"",
-    "\"char\"",
-    "\"class\"",
-    "\"const\"",
-    "\"continue\"",
-    "\"default\"",
-    "\"do\"",
-    "\"double\"",
-    "\"else\"",
-    "\"enum\"",
-    "\"extends\"",
-    "\"false\"",
-    "\"final\"",
-    "\"finally\"",
-    "\"float\"",
-    "\"for\"",
-    "\"goto\"",
-    "\"if\"",
-    "\"implements\"",
-    "\"import\"",
-    "\"instanceof\"",
-    "\"int\"",
-    "\"interface\"",
-    "\"long\"",
-    "\"native\"",
-    "\"new\"",
-    "\"null\"",
-    "\"package\"",
-    "\"private\"",
-    "\"protected\"",
-    "\"public\"",
-    "\"return\"",
-    "\"short\"",
-    "\"static\"",
-    "\"strictfp\"",
-    "\"super\"",
-    "\"switch\"",
-    "\"synchronized\"",
-    "\"this\"",
-    "\"throw\"",
-    "\"throws\"",
-    "\"transient\"",
-    "\"true\"",
-    "\"try\"",
-    "\"void\"",
-    "\"volatile\"",
-    "\"while\"",
-    "<INTEGER_LITERAL>",
-    "<DECIMAL_LITERAL>",
-    "<HEX_LITERAL>",
-    "<OCTAL_LITERAL>",
-    "<FLOATING_POINT_LITERAL>",
-    "<EXPONENT>",
-    "<CHARACTER_LITERAL>",
-    "<STRING_LITERAL>",
-    "<IDENTIFIER>",
-    "<LETTER>",
-    "<DIGIT>",
-    "\"(\"",
-    "\")\"",
-    "\"{\"",
-    "\"}\"",
-    "\"[\"",
-    "\"]\"",
-    "\";\"",
-    "\",\"",
-    "\".\"",
-    "\"@\"",
-    "\"=\"",
-    "\">\"",
-    "\"<\"",
-    "\"!\"",
-    "\"~\"",
-    "\"?\"",
-    "\":\"",
-    "\"==\"",
-    "\"<=\"",
-    "\">=\"",
-    "\"!=\"",
-    "\"||\"",
-    "\"&&\"",
-    "\"++\"",
-    "\"--\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"&\"",
-    "\"|\"",
-    "\"^\"",
-    "\"%\"",
-    "\"<<\"",
-    "\"+=\"",
-    "\"-=\"",
-    "\"*=\"",
-    "\"/=\"",
-    "\"&=\"",
-    "\"|=\"",
-    "\"^=\"",
-    "\"%=\"",
-    "\"<<=\"",
-    "\">>=\"",
-    "\">>>=\"",
-    "\"...\"",
-  };
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/JavaParserInterface.java b/src/net/sourceforge/cobertura/javancss/parser/JavaParserInterface.java
deleted file mode 100644
index 97ba137..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/JavaParserInterface.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-package net.sourceforge.cobertura.javancss.parser;
-
-import java.util.*;
-
-public interface JavaParserInterface
-{
-    public void parse() throws Exception;
-    public void parseImportUnit() throws Exception;
-
-    public int getNcss();
-    
-    public int getLOC();
-
-    // added by SMS
-    public int getJvdc();
-
-    /*public int getTopLevelClasses() {
-      return _topLevelClasses;
-      }*/
-    
-    public List/*<FunctionMetric>*/ getFunction();
-    
-    /**
-     * @return Top level classes in sorted order
-     */
-    public List/*<ObjectMetric>*/ getObject();
-    
-    /**
-     * @return The empty package consists of the name ".".
-     */
-    public Map/*<String,PackageMetric>*/ getPackage();
-    
-    public List getImports();
-
-    /**
-     * name, beginLine, ...
-     */
-    public Object[] getPackageObjects();
-
-    /**
-     * if javancss is used with cat *.java a long
-     * input stream might get generated, so line
-     * number information in case of an parse exception
-     * is not very useful.
-     */
-    public String getLastFunction();
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/JavaParserTokenManager.java b/src/net/sourceforge/cobertura/javancss/parser/JavaParserTokenManager.java
deleted file mode 100644
index 9fe2490..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/JavaParserTokenManager.java
+++ /dev/null
@@ -1,2144 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParserTokenManager.java */
-package net.sourceforge.cobertura.javancss.parser;
-import java.util.*;
-import net.sourceforge.cobertura.javancss.ccl.Util;
-import net.sourceforge.cobertura.javancss.FunctionMetric;
-import net.sourceforge.cobertura.javancss.ObjectMetric;
-import net.sourceforge.cobertura.javancss.PackageMetric;
-
-/** Token Manager. */
-public class JavaParserTokenManager implements JavaParserConstants
-{
-    // added by SMS
-
-    public static int  _iSingleComments = 0;
-    public static int  _iMultiComments = 0;
-    public static int  _iFormalComments = 0;
-
-    public static int  _iMultiCommentsLast = 0;
-
-  /** Debug output. */
-  public  java.io.PrintStream debugStream = System.out;
-  /** Set debug output. */
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
-{
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0xffffffffffffe000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            jjmatchedKind = 74;
-            return 28;
-         }
-         if ((active1 & 0x400000000200000L) != 0L)
-            return 4;
-         return -1;
-      case 1:
-         if ((active0 & 0x1006000000L) != 0L)
-            return 28;
-         if ((active0 & 0xffffffeff9ffe000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 74;
-               jjmatchedPos = 1;
-            }
-            return 28;
-         }
-         return -1;
-      case 2:
-         if ((active0 & 0x4000130400000000L) != 0L)
-            return 28;
-         if ((active0 & 0xbfffecebfdffe000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 74;
-               jjmatchedPos = 2;
-            }
-            return 28;
-         }
-         return -1;
-      case 3:
-         if ((active0 & 0x1dffcae3e5e9e000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 3;
-            return 28;
-         }
-         if ((active0 & 0xa200240818160000L) != 0L)
-            return 28;
-         return -1;
-      case 4:
-         if ((active0 & 0xc480003c0690000L) != 0L || (active1 & 0x2L) != 0L)
-            return 28;
-         if ((active0 & 0x11b7cae02580e000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 4)
-            {
-               jjmatchedKind = 74;
-               jjmatchedPos = 4;
-            }
-            return 28;
-         }
-         return -1;
-      case 5:
-         if ((active0 & 0x896084004004000L) != 0L)
-            return 28;
-         if ((active0 & 0x1121c2a12180a000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 5;
-            return 28;
-         }
-         return -1;
-      case 6:
-         if ((active0 & 0xc00121008000L) != 0L)
-            return 28;
-         if ((active0 & 0x112102a000802000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 6;
-            return 28;
-         }
-         return -1;
-      case 7:
-         if ((active0 & 0x20000000802000L) != 0L || (active1 & 0x1L) != 0L)
-            return 28;
-         if ((active0 & 0x110102a000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 7;
-            return 28;
-         }
-         return -1;
-      case 8:
-         if ((active0 & 0x1001020000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x10000a000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 8;
-            return 28;
-         }
-         return -1;
-      case 9:
-         if ((active0 & 0xa000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 9;
-            return 28;
-         }
-         return -1;
-      case 10:
-         if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 10;
-            return 28;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0, long active1)
-{
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
-}
-private int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 33:
-         jjmatchedKind = 90;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x200000000L);
-      case 37:
-         jjmatchedKind = 109;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x40000000000000L);
-      case 38:
-         jjmatchedKind = 106;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000800000000L);
-      case 40:
-         return jjStopAtPos(0, 77);
-      case 41:
-         return jjStopAtPos(0, 78);
-      case 42:
-         jjmatchedKind = 104;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000000000000L);
-      case 43:
-         jjmatchedKind = 102;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x801000000000L);
-      case 44:
-         return jjStopAtPos(0, 84);
-      case 45:
-         jjmatchedKind = 103;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1002000000000L);
-      case 46:
-         jjmatchedKind = 85;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x400000000000000L);
-      case 47:
-         jjmatchedKind = 105;
-         return jjMoveStringLiteralDfa1_0(0x180L, 0x4000000000000L);
-      case 58:
-         return jjStopAtPos(0, 93);
-      case 59:
-         return jjStopAtPos(0, 83);
-      case 60:
-         jjmatchedKind = 89;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x80400080000000L);
-      case 61:
-         jjmatchedKind = 87;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x40000000L);
-      case 62:
-         jjmatchedKind = 88;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x300000100000000L);
-      case 63:
-         return jjStopAtPos(0, 92);
-      case 64:
-         return jjStopAtPos(0, 86);
-      case 91:
-         return jjStopAtPos(0, 81);
-      case 93:
-         return jjStopAtPos(0, 82);
-      case 94:
-         jjmatchedKind = 108;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x20000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x6000L, 0x0L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x38000L, 0x0L);
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0xfc0000L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x7000000L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x38000000L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x7c0000000L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x800000000L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x3f000000000L, 0x0L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x40000000000L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x380000000000L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x3c00000000000L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x4000000000000L, 0x0L);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x1f8000000000000L, 0x0L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x7e00000000000000L, 0x0L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0x1L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2L);
-      case 123:
-         return jjStopAtPos(0, 79);
-      case 124:
-         jjmatchedKind = 107;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x10000400000000L);
-      case 125:
-         return jjStopAtPos(0, 80);
-      case 126:
-         return jjStopAtPos(0, 91);
-      default :
-         return jjMoveNfa_0(0, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_0(long active0, long active1)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0, active1);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 38:
-         if ((active1 & 0x800000000L) != 0L)
-            return jjStopAtPos(1, 99);
-         break;
-      case 42:
-         if ((active0 & 0x80L) != 0L)
-            return jjStopAtPos(1, 7);
-         break;
-      case 43:
-         if ((active1 & 0x1000000000L) != 0L)
-            return jjStopAtPos(1, 100);
-         break;
-      case 45:
-         if ((active1 & 0x2000000000L) != 0L)
-            return jjStopAtPos(1, 101);
-         break;
-      case 46:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x400000000000000L);
-      case 47:
-         if ((active0 & 0x100L) != 0L)
-            return jjStopAtPos(1, 8);
-         break;
-      case 60:
-         if ((active1 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 110;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80000000000000L);
-      case 61:
-         if ((active1 & 0x40000000L) != 0L)
-            return jjStopAtPos(1, 94);
-         else if ((active1 & 0x80000000L) != 0L)
-            return jjStopAtPos(1, 95);
-         else if ((active1 & 0x100000000L) != 0L)
-            return jjStopAtPos(1, 96);
-         else if ((active1 & 0x200000000L) != 0L)
-            return jjStopAtPos(1, 97);
-         else if ((active1 & 0x800000000000L) != 0L)
-            return jjStopAtPos(1, 111);
-         else if ((active1 & 0x1000000000000L) != 0L)
-            return jjStopAtPos(1, 112);
-         else if ((active1 & 0x2000000000000L) != 0L)
-            return jjStopAtPos(1, 113);
-         else if ((active1 & 0x4000000000000L) != 0L)
-            return jjStopAtPos(1, 114);
-         else if ((active1 & 0x8000000000000L) != 0L)
-            return jjStopAtPos(1, 115);
-         else if ((active1 & 0x10000000000000L) != 0L)
-            return jjStopAtPos(1, 116);
-         else if ((active1 & 0x20000000000000L) != 0L)
-            return jjStopAtPos(1, 117);
-         else if ((active1 & 0x40000000000000L) != 0L)
-            return jjStopAtPos(1, 118);
-         break;
-      case 62:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x300000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4800400c0000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4100001000000L, active1, 0L);
-      case 102:
-         if ((active0 & 0x1000000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 36, 28);
-         break;
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0xe08000000100000L, active1, 0x2L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0x180000000L, active1, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x208200000L, active1, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0x6000000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa2_0(active0, 0x38010000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 25;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000040c04c08000L, active1, 0x1L);
-      case 114:
-         return jjMoveStringLiteralDfa2_0(active0, 0x7001800000010000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa2_0(active0, 0x30000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x42200000000000L, active1, 0L);
-      case 119:
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000000L, active1, 0L);
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0x20000000L, active1, 0L);
-      case 121:
-         return jjMoveStringLiteralDfa2_0(active0, 0x100000000020000L, active1, 0L);
-      case 124:
-         if ((active1 & 0x400000000L) != 0L)
-            return jjStopAtPos(1, 98);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0, active1);
-}
-private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(0, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0, active1);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 46:
-         if ((active1 & 0x400000000000000L) != 0L)
-            return jjStopAtPos(2, 122);
-         break;
-      case 61:
-         if ((active1 & 0x80000000000000L) != 0L)
-            return jjStopAtPos(2, 119);
-         else if ((active1 & 0x100000000000000L) != 0L)
-            return jjStopAtPos(2, 120);
-         break;
-      case 62:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000300000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x10000L, active1, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8280800000000000L, active1, 0x2L);
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200040000000L, active1, 0x1L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100040180c00000L, active1, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x9000200008000L, active1, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0x40006000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x400000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 34, 28);
-         return jjMoveStringLiteralDfa3_0(active0, 0xc20000000000000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8008046000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x40a08200a0000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000000014000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x100000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 44, 28);
-         break;
-      case 121:
-         if ((active0 & 0x4000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 62, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0, active1);
-}
-private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(1, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(2, active0, active1);
-      return 3;
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active1 & 0x200000000000000L) != 0L)
-            return jjStopAtPos(3, 121);
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x381010000L, active1, 0x1L);
-      case 98:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000080000L, active1, 0L);
-      case 100:
-         if ((active0 & 0x8000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 63, 28);
-         break;
-      case 101:
-         if ((active0 & 0x20000L) != 0L)
-            return jjStartNfaWithStates_0(3, 17, 28);
-         else if ((active0 & 0x40000L) != 0L)
-            return jjStartNfaWithStates_0(3, 18, 28);
-         else if ((active0 & 0x8000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 27, 28);
-         else if ((active0 & 0x2000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 61, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x40020020004000L, active1, 0L);
-      case 103:
-         if ((active0 & 0x40000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 42, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x20080000000000L, active1, 0L);
-      case 107:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000L, active1, 0L);
-      case 108:
-         if ((active0 & 0x200000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 45, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x2002000008000L, active1, 0x2L);
-      case 109:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 28, 28);
-         break;
-      case 110:
-         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x800000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 35, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0xc00004000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x100000L) != 0L)
-            return jjStartNfaWithStates_0(3, 20, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x200000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 57, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x40600000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0x91008000802000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(2, active0, active1);
-}
-private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(2, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(3, active0, active1);
-      return 4;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0xc08000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0xa0000000000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x40000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 30, 28);
-         else if ((active1 & 0x2L) != 0L)
-            return jjStartNfaWithStates_0(4, 65, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x1002000008000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(4, 19, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0x12000000800000L, active1, 0L);
-      case 107:
-         if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_0(4, 16, 28);
-         break;
-      case 108:
-         if ((active0 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 31;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x104000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa5_0(active0, 0x20000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x40000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 54, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x4024000006000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(4, 21, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(4, 22, 28);
-         else if ((active0 & 0x200000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 33, 28);
-         else if ((active0 & 0x8000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 51, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1L);
-      case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 58;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(3, active0, active1);
-}
-private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(3, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(4, active0, active1);
-      return 5;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0xa000L, active1, 0L);
-      case 99:
-         if ((active0 & 0x2000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 49, 28);
-         else if ((active0 & 0x10000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 52, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000L, active1, 0L);
-      case 100:
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 26, 28);
-         else if ((active0 & 0x80000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 43, 28);
-         break;
-      case 102:
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x80000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 55, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000000L, active1, 0x1L);
-      case 108:
-         return jjMoveStringLiteralDfa6_0(active0, 0x101000000L, active1, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000L, active1, 0L);
-      case 110:
-         if ((active0 & 0x4000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 50, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000800000L, active1, 0L);
-      case 114:
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x800000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 59, 28);
-         break;
-      case 116:
-         if ((active0 & 0x4000L) != 0L)
-            return jjStartNfaWithStates_0(5, 14, 28);
-         else if ((active0 & 0x4000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 38, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x20800000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(4, active0, active1);
-}
-private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(4, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(5, active0, active1);
-      return 6;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000002000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x400000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 46, 28);
-         else if ((active0 & 0x800000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 47, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x1000002000000000L, active1, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x1L);
-      case 110:
-         if ((active0 & 0x8000L) != 0L)
-            return jjStartNfaWithStates_0(6, 15, 28);
-         break;
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0x100000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 29, 28);
-         break;
-      case 116:
-         if ((active0 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 24, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x1000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0x800000L, active1, 0L);
-      case 121:
-         if ((active0 & 0x100000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 32, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(5, active0, active1);
-}
-private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(5, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(6, active0, active1);
-      return 7;
-   }
-   switch(curChar)
-   {
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0x20000000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_0(7, 23, 28);
-         else if ((active1 & 0x1L) != 0L)
-            return jjStartNfaWithStates_0(7, 64, 28);
-         return jjMoveStringLiteralDfa8_0(active0, 0x1008000000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa8_0(active0, 0x1100002000000000L, active1, 0L);
-      case 112:
-         if ((active0 & 0x20000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 53, 28);
-         break;
-      case 116:
-         if ((active0 & 0x2000L) != 0L)
-            return jjStartNfaWithStates_0(7, 13, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(6, active0, active1);
-}
-private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(6, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(7, active0, 0L);
-      return 8;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x1000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 48, 28);
-         break;
-      case 101:
-         if ((active0 & 0x20000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 41, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active0, 0x100000000000000L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0x8000000000L);
-      case 116:
-         if ((active0 & 0x1000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 60, 28);
-         return jjMoveStringLiteralDfa9_0(active0, 0x2000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(7, active0, 0L);
-}
-private int jjMoveStringLiteralDfa9_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(7, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(8, active0, 0L);
-      return 9;
-   }
-   switch(curChar)
-   {
-      case 102:
-         if ((active0 & 0x8000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 39, 28);
-         break;
-      case 115:
-         if ((active0 & 0x2000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 37, 28);
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa10_0(active0, 0x100000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(8, active0, 0L);
-}
-private int jjMoveStringLiteralDfa10_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(8, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(9, active0, 0L);
-      return 10;
-   }
-   switch(curChar)
-   {
-      case 101:
-         return jjMoveStringLiteralDfa11_0(active0, 0x100000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(9, active0, 0L);
-}
-private int jjMoveStringLiteralDfa11_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(9, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(10, active0, 0L);
-      return 11;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x100000000000000L) != 0L)
-            return jjStartNfaWithStates_0(11, 56, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(10, active0, 0L);
-}
-private int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-static final long[] jjbitVec0 = {
-   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec2 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec3 = {
-   0xfff0000000200002L, 0xffffffffffffdfffL, 0xfffff00f7fffffffL, 0x12000000007fffffL
-};
-static final long[] jjbitVec4 = {
-   0x0L, 0x0L, 0x420043c00000000L, 0xff7fffffff7fffffL
-};
-static final long[] jjbitVec5 = {
-   0xffffcffffffffL, 0xffffffffffff0000L, 0xf9ff3fffffffffffL, 0x401f00030003L
-};
-static final long[] jjbitVec6 = {
-   0x0L, 0x400000000000000L, 0xfffffffbffffd740L, 0xffffffcff7fffL
-};
-static final long[] jjbitVec7 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffffff003L, 0x33fffffffff199fL
-};
-static final long[] jjbitVec8 = {
-   0xfffe000000000000L, 0xfffffffe027fffffL, 0xffL, 0x707ffffff0000L
-};
-static final long[] jjbitVec9 = {
-   0x7fffffe00000000L, 0xfffe0000000007ffL, 0xffffffffffffffffL, 0x1c000060002fffffL
-};
-static final long[] jjbitVec10 = {
-   0x1ffffffd0000L, 0x0L, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec11 = {
-   0x23ffffffffffffe0L, 0x3ff010000L, 0x3c5fdfffff99fe0L, 0xf0003b0000000L
-};
-static final long[] jjbitVec12 = {
-   0x36dfdfffff987e0L, 0x1c00005e000000L, 0x23edfdfffffbafe0L, 0x100010000L
-};
-static final long[] jjbitVec13 = {
-   0x23cdfdfffff99fe0L, 0x3b0000000L, 0x3bfc718d63dc7e0L, 0x0L
-};
-static final long[] jjbitVec14 = {
-   0x3effdfffffddfe0L, 0x300000000L, 0x3effdfffffddfe0L, 0x340000000L
-};
-static final long[] jjbitVec15 = {
-   0x3fffdfffffddfe0L, 0x300000000L, 0x2ffbfffffc7fffe0L, 0x7fL
-};
-static final long[] jjbitVec16 = {
-   0x800dfffffffffffeL, 0x7fL, 0x200decaefef02596L, 0x3000005fL
-};
-static final long[] jjbitVec17 = {
-   0x1L, 0x7fffffffeffL, 0xf00L, 0x0L
-};
-static final long[] jjbitVec18 = {
-   0x6fbffffffffL, 0x3f0000L, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-static final long[] jjbitVec19 = {
-   0xffffffffffffffffL, 0xffffffff83ffffffL, 0xffffff07ffffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec20 = {
-   0xffffffffffffff7fL, 0xffffffff3d7f3d7fL, 0x7f3d7fffffff3d7fL, 0xffff7fffff7f7f3dL
-};
-static final long[] jjbitVec21 = {
-   0xffffffff7f3d7fffL, 0x7ffff7fL, 0xffffffff00000000L, 0x1fffffffffffffL
-};
-static final long[] jjbitVec22 = {
-   0xffffffffffffffffL, 0x7f9fffffffffffL, 0xffffffff07fffffeL, 0x7ffffffffffL
-};
-static final long[] jjbitVec23 = {
-   0x0L, 0x0L, 0xfffffffffffffL, 0x8000000L
-};
-static final long[] jjbitVec24 = {
-   0xffffffff00000000L, 0xffffffffffffffL, 0x1ffffffffffL, 0x0L
-};
-static final long[] jjbitVec25 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffff0fffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec26 = {
-   0xffffffff3f3fffffL, 0x3fffffffaaff3f3fL, 0x5fdfffffffffffffL, 0x1fdc1fff0fcf1fdcL
-};
-static final long[] jjbitVec27 = {
-   0x8000000000000000L, 0x8000000000000001L, 0xffff00000000L, 0x0L
-};
-static final long[] jjbitVec28 = {
-   0x3fbbd503e2ffc84L, 0xffffffff00000000L, 0xfL, 0x0L
-};
-static final long[] jjbitVec29 = {
-   0x73e03fe000000e0L, 0xfffffffffffffffeL, 0xfffffffe601fffffL, 0x7fffffffffffffffL
-};
-static final long[] jjbitVec30 = {
-   0xfffe1fffffffffe0L, 0xffffffffffffffffL, 0xffffff00007fffL, 0x0L
-};
-static final long[] jjbitVec31 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffffffL, 0x0L
-};
-static final long[] jjbitVec32 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec33 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x1fffL, 0x0L
-};
-static final long[] jjbitVec34 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffL, 0x0L
-};
-static final long[] jjbitVec35 = {
-   0x3fffffffffffL, 0x0L, 0x0L, 0x0L
-};
-static final long[] jjbitVec36 = {
-   0x5f7ffdffa0f8007fL, 0xffffffffffffffdbL, 0x3ffffffffffffL, 0xfffffffffff80000L
-};
-static final long[] jjbitVec37 = {
-   0x3fffffffffffffffL, 0xffffffffffff0000L, 0xfffffffffffcffffL, 0xfff0000000000ffL
-};
-static final long[] jjbitVec38 = {
-   0x18000000000000L, 0xffd702000000e000L, 0xffffffffffffffffL, 0x1fffffffffffffffL
-};
-static final long[] jjbitVec39 = {
-   0x87fffffe00000010L, 0xffffffe007fffffeL, 0x7fffffffffffffffL, 0x631cfcfcfcL
-};
-static final long[] jjbitVec40 = {
-   0x7fffffe00000000L, 0xfffe03ff000007ffL, 0xffffffffffffffffL, 0x1fff0060002fffffL
-};
-static final long[] jjbitVec41 = {
-   0x23ffffffffffffe0L, 0xffc3ff010000L, 0x3c5fdfffff99fe0L, 0xfffc3b0000000L
-};
-static final long[] jjbitVec42 = {
-   0x36dfdfffff987e0L, 0x1cffc05e000000L, 0x23edfdfffffbafe0L, 0xffc100010000L
-};
-static final long[] jjbitVec43 = {
-   0x23cdfdfffff99fe0L, 0xffc3b0000000L, 0x3bfc718d63dc7e0L, 0xff8000000000L
-};
-static final long[] jjbitVec44 = {
-   0x3effdfffffddfe0L, 0xffc300000000L, 0x3effdfffffddfe0L, 0xffc340000000L
-};
-static final long[] jjbitVec45 = {
-   0x3fffdfffffddfe0L, 0xffc300000000L, 0x2ffbfffffc7fffe0L, 0x7fL
-};
-static final long[] jjbitVec46 = {
-   0x800dfffffffffffeL, 0x3ff007fL, 0x200decaefef02596L, 0x33ff005fL
-};
-static final long[] jjbitVec47 = {
-   0x6fbffffffffL, 0x3f03ffL, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-private int jjMoveNfa_0(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 48;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(0, 6);
-                  else if (curChar == 36)
-                  {
-                     if (kind > 74)
-                        kind = 74;
-                     jjCheckNAdd(28);
-                  }
-                  else if (curChar == 34)
-                     jjCheckNAddStates(7, 9);
-                  else if (curChar == 39)
-                     jjAddStates(10, 11);
-                  else if (curChar == 46)
-                     jjCheckNAdd(4);
-                  if ((0x3fe000000000000L & l) != 0L)
-                  {
-                     if (kind > 66)
-                        kind = 66;
-                     jjCheckNAddTwoStates(1, 2);
-                  }
-                  else if (curChar == 48)
-                  {
-                     if (kind > 66)
-                        kind = 66;
-                     jjCheckNAddStates(12, 14);
-                  }
-                  break;
-               case 1:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(1, 2);
-                  break;
-               case 3:
-                  if (curChar == 46)
-                     jjCheckNAdd(4);
-                  break;
-               case 4:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddStates(15, 17);
-                  break;
-               case 6:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 7:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-                  if (curChar == 39)
-                     jjAddStates(10, 11);
-                  break;
-               case 10:
-                  if ((0xfffffffffffffbffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 11:
-                  if (curChar == 39 && kind > 72)
-                     kind = 72;
-                  break;
-               case 13:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 14:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(15, 11);
-                  break;
-               case 15:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 16:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  break;
-               case 17:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(15);
-                  break;
-               case 18:
-                  if (curChar == 34)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 19:
-                  if ((0xfffffffbffffdbffL & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 21:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 22:
-                  if (curChar == 34 && kind > 73)
-                     kind = 73;
-                  break;
-               case 23:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(18, 21);
-                  break;
-               case 24:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 25:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 26;
-                  break;
-               case 26:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(24);
-                  break;
-               case 27:
-                  if (curChar != 36)
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 28:
-                  if ((0x3ff001000000000L & l) == 0L)
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 29:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(0, 6);
-                  break;
-               case 30:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(30, 31);
-                  break;
-               case 31:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddStates(22, 24);
-                  break;
-               case 32:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddStates(22, 24);
-                  break;
-               case 34:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(35);
-                  break;
-               case 35:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddTwoStates(35, 8);
-                  break;
-               case 36:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(36, 37);
-                  break;
-               case 38:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(39);
-                  break;
-               case 39:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddTwoStates(39, 8);
-                  break;
-               case 40:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(25, 27);
-                  break;
-               case 42:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(43);
-                  break;
-               case 43:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(43, 8);
-                  break;
-               case 44:
-                  if (curChar != 48)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddStates(12, 14);
-                  break;
-               case 46:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(46, 2);
-                  break;
-               case 47:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(47, 2);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-               case 28:
-                  if ((0x7fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 2:
-                  if ((0x100000001000L & l) != 0L && kind > 66)
-                     kind = 66;
-                  break;
-               case 5:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(28, 29);
-                  break;
-               case 8:
-                  if ((0x5000000050L & l) != 0L && kind > 70)
-                     kind = 70;
-                  break;
-               case 10:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 12:
-                  if (curChar == 92)
-                     jjAddStates(30, 32);
-                  break;
-               case 13:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 19:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 20:
-                  if (curChar == 92)
-                     jjAddStates(33, 35);
-                  break;
-               case 21:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 33:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(36, 37);
-                  break;
-               case 37:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(38, 39);
-                  break;
-               case 41:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(40, 41);
-                  break;
-               case 45:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(46);
-                  break;
-               case 46:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(46, 2);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 10:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  break;
-               case 19:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(7, 9);
-                  break;
-               case 28:
-                  if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 48 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
-   switch (pos)
-   {
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
-   return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private int jjMoveStringLiteralDfa0_2()
-{
-   switch(curChar)
-   {
-      case 42:
-         return jjMoveStringLiteralDfa1_2(0x800L);
-      default :
-         return jjMoveNfa_2(0, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_2(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_2(0, active0);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 47:
-         if ((active0 & 0x800L) != 0L)
-            return jjStopAtPos(1, 11);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_2(0, active0);
-}
-private int jjMoveNfa_2(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 3;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((0x2400L & l) != 0L)
-                  {
-                     if (kind > 10)
-                        kind = 10;
-                  }
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 1:
-                  if (curChar == 10 && kind > 10)
-                     kind = 10;
-                  break;
-               case 2:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private int jjMoveStringLiteralDfa0_1()
-{
-   return jjMoveNfa_1(4, 0);
-}
-private int jjMoveNfa_1(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 4;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-                  if ((0xffffffffffffdbffL & l) != 0L)
-                  {
-                     if (kind > 9)
-                        kind = 9;
-                     jjCheckNAddStates(42, 44);
-                  }
-                  else if ((0x2400L & l) != 0L)
-                  {
-                     if (kind > 9)
-                        kind = 9;
-                  }
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 2;
-                  break;
-               case 0:
-                  if ((0xffffffffffffdbffL & l) == 0L)
-                     break;
-                  kind = 9;
-                  jjCheckNAddStates(42, 44);
-                  break;
-               case 1:
-                  if ((0x2400L & l) != 0L && kind > 9)
-                     kind = 9;
-                  break;
-               case 2:
-                  if (curChar == 10 && kind > 9)
-                     kind = 9;
-                  break;
-               case 3:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 2;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-               case 0:
-                  kind = 9;
-                  jjCheckNAddStates(42, 44);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-               case 0:
-                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 9)
-                     kind = 9;
-                  jjCheckNAddStates(42, 44);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 4 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-static final int[] jjnextStates = {
-   30, 31, 36, 37, 40, 41, 8, 19, 20, 22, 10, 12, 45, 47, 2, 4, 
-   5, 8, 19, 20, 24, 22, 32, 33, 8, 40, 41, 8, 6, 7, 13, 14, 
-   16, 21, 23, 25, 34, 35, 38, 39, 42, 43, 0, 1, 3, 
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec2[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec0[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec4[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec6[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec7[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec8[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec9[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec10[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec11[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec12[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec13[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec14[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec15[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec16[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec17[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec18[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec21[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec23[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec24[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec27[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec29[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec36[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec38[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec39[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec4[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec6[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec7[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec8[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec40[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec10[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec41[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec42[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec43[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec44[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec45[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec46[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec17[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec47[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec21[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec23[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec24[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec27[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec29[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec36[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec38[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec39[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-
-/** Token literal values. */
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, null, null, null, null, null, 
-"\141\142\163\164\162\141\143\164", "\141\163\163\145\162\164", "\142\157\157\154\145\141\156", 
-"\142\162\145\141\153", "\142\171\164\145", "\143\141\163\145", "\143\141\164\143\150", 
-"\143\150\141\162", "\143\154\141\163\163", "\143\157\156\163\164", 
-"\143\157\156\164\151\156\165\145", "\144\145\146\141\165\154\164", "\144\157", "\144\157\165\142\154\145", 
-"\145\154\163\145", "\145\156\165\155", "\145\170\164\145\156\144\163", "\146\141\154\163\145", 
-"\146\151\156\141\154", "\146\151\156\141\154\154\171", "\146\154\157\141\164", "\146\157\162", 
-"\147\157\164\157", "\151\146", "\151\155\160\154\145\155\145\156\164\163", 
-"\151\155\160\157\162\164", "\151\156\163\164\141\156\143\145\157\146", "\151\156\164", 
-"\151\156\164\145\162\146\141\143\145", "\154\157\156\147", "\156\141\164\151\166\145", "\156\145\167", 
-"\156\165\154\154", "\160\141\143\153\141\147\145", "\160\162\151\166\141\164\145", 
-"\160\162\157\164\145\143\164\145\144", "\160\165\142\154\151\143", "\162\145\164\165\162\156", 
-"\163\150\157\162\164", "\163\164\141\164\151\143", "\163\164\162\151\143\164\146\160", 
-"\163\165\160\145\162", "\163\167\151\164\143\150", 
-"\163\171\156\143\150\162\157\156\151\172\145\144", "\164\150\151\163", "\164\150\162\157\167", "\164\150\162\157\167\163", 
-"\164\162\141\156\163\151\145\156\164", "\164\162\165\145", "\164\162\171", "\166\157\151\144", 
-"\166\157\154\141\164\151\154\145", "\167\150\151\154\145", null, null, null, null, null, null, null, null, null, 
-null, null, "\50", "\51", "\173", "\175", "\133", "\135", "\73", "\54", "\56", 
-"\100", "\75", "\76", "\74", "\41", "\176", "\77", "\72", "\75\75", "\74\75", 
-"\76\75", "\41\75", "\174\174", "\46\46", "\53\53", "\55\55", "\53", "\55", "\52", 
-"\57", "\46", "\174", "\136", "\45", "\74\74", "\53\75", "\55\75", "\52\75", 
-"\57\75", "\46\75", "\174\75", "\136\75", "\45\75", "\74\74\75", "\76\76\75", 
-"\76\76\76\75", "\56\56\56", };
-
-/** Lexer state names. */
-public static final String[] lexStateNames = {
-   "DEFAULT",
-   "IN_SINGLE_LINE_COMMENT",
-   "IN_MULTI_LINE_COMMENT",
-};
-
-/** Lex State array. */
-public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, -1, 2, 1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xffffffffffffe001L, 0x7ffffffffffe747L, 
-};
-static final long[] jjtoSkip = {
-   0xf7eL, 0x0L, 
-};
-static final long[] jjtoSpecial = {
-   0xf00L, 0x0L, 
-};
-static final long[] jjtoMore = {
-   0x1080L, 0x0L, 
-};
-protected JavaCharStream input_stream;
-private final int[] jjrounds = new int[48];
-private final int[] jjstateSet = new int[96];
-private final StringBuffer jjimage = new StringBuffer();
-private StringBuffer image = jjimage;
-private int jjimageLen;
-private int lengthOfMatch;
-protected char curChar;
-/** Constructor. */
-public JavaParserTokenManager(JavaCharStream stream){
-   if (JavaCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-
-/** Constructor. */
-public JavaParserTokenManager(JavaCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
-
-/** Reinitialise parser. */
-public void ReInit(JavaCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 48; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-
-/** Reinitialise parser. */
-public void ReInit(JavaCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-
-/** Switch to specified lex state. */
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 3 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   final Token t;
-   final String curTokenImage;
-   final int beginLine;
-   final int endLine;
-   final int beginColumn;
-   final int endColumn;
-   if (jjmatchedPos < 0)
-   {
-      if (image == null)
-         curTokenImage = "";
-      else
-         curTokenImage = image.toString();
-      beginLine = endLine = input_stream.getBeginLine();
-      beginColumn = endColumn = input_stream.getBeginColumn();
-   }
-   else
-   {
-      String im = jjstrLiteralImages[jjmatchedKind];
-      curTokenImage = (im == null) ? input_stream.GetImage() : im;
-      beginLine = input_stream.getBeginLine();
-      beginColumn = input_stream.getBeginColumn();
-      endLine = input_stream.getEndLine();
-      endColumn = input_stream.getEndColumn();
-   }
-   t = Token.newToken(jjmatchedKind, curTokenImage);
-
-   t.beginLine = beginLine;
-   t.endLine = endLine;
-   t.beginColumn = beginColumn;
-   t.endColumn = endColumn;
-
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-/** Get the next Token. */
-public Token getNextToken() 
-{
-  Token specialToken = null;
-  Token matchedToken;
-  int curPos = 0;
-
-  EOFLoop :
-  for (;;)
-  {
-   try
-   {
-      curChar = input_stream.BeginToken();
-   }
-   catch(java.io.IOException e)
-   {
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      matchedToken.specialToken = specialToken;
-      return matchedToken;
-   }
-   image = jjimage;
-   image.setLength(0);
-   jjimageLen = 0;
-
-   for (;;)
-   {
-     switch(curLexState)
-     {
-       case 0:
-         try { input_stream.backup(0);
-            while (curChar <= 32 && (0x104003600L & (1L << curChar)) != 0L)
-               curChar = input_stream.BeginToken();
-         }
-         catch (java.io.IOException e1) { continue EOFLoop; }
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_0();
-         break;
-       case 1:
-         jjmatchedKind = 9;
-         jjmatchedPos = -1;
-         curPos = 0;
-         curPos = jjMoveStringLiteralDfa0_1();
-         if (jjmatchedPos < 0 || (jjmatchedPos == 0 && jjmatchedKind > 12))
-         {
-            jjmatchedKind = 12;
-            jjmatchedPos = 0;
-         }
-         break;
-       case 2:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_2();
-         if (jjmatchedPos == 0 && jjmatchedKind > 12)
-         {
-            jjmatchedKind = 12;
-         }
-         break;
-     }
-     if (jjmatchedKind != 0x7fffffff)
-     {
-        if (jjmatchedPos + 1 < curPos)
-           input_stream.backup(curPos - jjmatchedPos - 1);
-        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           matchedToken = jjFillToken();
-           matchedToken.specialToken = specialToken;
-       if (jjnewLexState[jjmatchedKind] != -1)
-         curLexState = jjnewLexState[jjmatchedKind];
-           return matchedToken;
-        }
-        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-           {
-              matchedToken = jjFillToken();
-              if (specialToken == null)
-                 specialToken = matchedToken;
-              else
-              {
-                 matchedToken.specialToken = specialToken;
-                 specialToken = (specialToken.next = matchedToken);
-              }
-              SkipLexicalActions(matchedToken);
-           }
-           else
-              SkipLexicalActions(null);
-         if (jjnewLexState[jjmatchedKind] != -1)
-           curLexState = jjnewLexState[jjmatchedKind];
-           continue EOFLoop;
-        }
-        MoreLexicalActions();
-      if (jjnewLexState[jjmatchedKind] != -1)
-        curLexState = jjnewLexState[jjmatchedKind];
-        curPos = 0;
-        jjmatchedKind = 0x7fffffff;
-        try {
-           curChar = input_stream.readChar();
-           continue;
-        }
-        catch (java.io.IOException e1) { }
-     }
-     int error_line = input_stream.getEndLine();
-     int error_column = input_stream.getEndColumn();
-     String error_after = null;
-     boolean EOFSeen = false;
-     try { input_stream.readChar(); input_stream.backup(1); }
-     catch (java.io.IOException e1) {
-        EOFSeen = true;
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-        if (curChar == '\n' || curChar == '\r') {
-           error_line++;
-           error_column = 0;
-        }
-        else
-           error_column++;
-     }
-     if (!EOFSeen) {
-        input_stream.backup(1);
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-     }
-     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-   }
-  }
-}
-
-void SkipLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      case 8 :
-         image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 _iSingleComments++;
-         break;
-      case 10 :
-         image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                               _iMultiComments++; _iMultiCommentsLast++;
-         break;
-      case 11 :
-         image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                  _iMultiComments++; _iMultiCommentsLast++;
-         break;
-      default :
-         break;
-   }
-}
-void MoreLexicalActions()
-{
-   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
-   switch(jjmatchedKind)
-   {
-      case 7 :
-         image.append(input_stream.GetSuffix(jjimageLen));
-         jjimageLen = 0;
-         _iMultiCommentsLast = 0;
-         break;
-      default :
-         break;
-   }
-}
-private void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-
-private void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/ParseException.java b/src/net/sourceforge/cobertura/javancss/parser/ParseException.java
deleted file mode 100644
index e24df64..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/ParseException.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 4.1 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
-package net.sourceforge.cobertura.javancss.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.  The boolean
-   * flag "specialConstructor" is also set to true to indicate that
-   * this constructor was used to create this object.
-   * This constructor calls its super class with the empty string
-   * to force the "toString" method of parent class "Throwable" to
-   * print the error message in the form:
-   *     ParseException: <result of getMessage>
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super("");
-    specialConstructor = true;
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-    specialConstructor = false;
-  }
-
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-    specialConstructor = false;
-  }
-
-  /**
-   * This variable determines which constructor was used to create
-   * this object and thereby affects the semantics of the
-   * "getMessage" method (see below).
-   */
-  protected boolean specialConstructor;
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * This method has the standard behavior when this object has been
-   * created using the standard constructors.  Otherwise, it uses
-   * "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser), then this method is called during the printing
-   * of the final stack trace, and hence the correct error message
-   * gets displayed.
-   */
-  public String getMessage() {
-    if (!specialConstructor) {
-      return super.getMessage();
-    }
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-    retval += expected.toString();
-    return retval;
-  }
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  protected String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-}
-/* JavaCC - OriginalChecksum=849b618d99607c5b3309cfe8560c9c1d (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/Token.java b/src/net/sourceforge/cobertura/javancss/parser/Token.java
deleted file mode 100644
index 8838df3..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/Token.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 4.1 */
-/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null */
-package net.sourceforge.cobertura.javancss.parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /** The line number of the first character of this Token. */
-  public int beginLine;
-  /** The column number of the first character of this Token. */
-  public int beginColumn;
-  /** The line number of the last character of this Token. */
-  public int endLine;
-  /** The column number of the last character of this Token. */
-  public int endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * An optional attribute value of the Token.
-   * Tokens which are not used as syntactic sugar will often contain
-   * meaningful values that will be used later on by the compiler or
-   * interpreter. This attribute value is often different from the image.
-   * Any subclass of Token that actually wants to return a non-null value can
-   * override this method as appropriate.
-   */
-  public Object getValue() {
-    return null;
-  }
-
-  /**
-   * No-argument constructor
-   */
-  public Token() {}
-
-  /**
-   * Constructs a new token for the specified Image.
-   */
-  public Token(int kind)
-  {
-     this(kind, null);
-  }
-
-  /**
-   * Constructs a new token for the specified Image and Kind.
-   */
-  public Token(int kind, String image)
-  {
-     this.kind = kind;
-     this.image = image;
-  }
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-     return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simply add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use sit in your lexical actions.
-   */
-  public static Token newToken(int ofKind, String image)
-  {
-     switch(ofKind)
-     {
-       default : return new Token(ofKind, image);
-     }
-  }
-
-  public static Token newToken(int ofKind)
-  {
-     return newToken(ofKind, null);
-  }
-
-}
-/* JavaCC - OriginalChecksum=48c8965b1d2c7366d2b53a19209a1660 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/TokenMgrError.java b/src/net/sourceforge/cobertura/javancss/parser/TokenMgrError.java
deleted file mode 100644
index 9fefaf3..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/TokenMgrError.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 4.1 */
-/* JavaCCOptions: */
-package net.sourceforge.cobertura.javancss.parser;
-
-/** Token Manager Error. */
-public class TokenMgrError extends Error
-{
-
-   /*
-    * Ordinals for various reasons why an Error of this type can be thrown.
-    */
-
-   /**
-    * Lexical error occurred.
-    */
-   static final int LEXICAL_ERROR = 0;
-
-   /**
-    * An attempt was made to create a second instance of a static token manager.
-    */
-   static final int STATIC_LEXER_ERROR = 1;
-
-   /**
-    * Tried to change to an invalid lexical state.
-    */
-   static final int INVALID_LEXICAL_STATE = 2;
-
-   /**
-    * Detected (and bailed out of) an infinite loop in the token manager.
-    */
-   static final int LOOP_DETECTED = 3;
-
-   /**
-    * Indicates the reason why the exception is thrown. It will have
-    * one of the above 4 values.
-    */
-   int errorCode;
-
-   /**
-    * Replaces unprintable characters by their escaped (or unicode escaped)
-    * equivalents in the given string
-    */
-   protected static final String addEscapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-   /**
-    * Returns a detailed message for the Error when it is thrown by the
-    * token manager to indicate a lexical error.
-    * Parameters :
-    *    EOFSeen     : indicates if EOF caused the lexical error
-    *    curLexState : lexical state in which this error occurred
-    *    errorLine   : line number when the error occurred
-    *    errorColumn : column number when the error occurred
-    *    errorAfter  : prefix that was seen before this error occurred
-    *    curchar     : the offending character
-    * Note: You can customize the lexical error message by modifying this method.
-    */
-   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-      return("Lexical error at line " +
-           errorLine + ", column " +
-           errorColumn + ".  Encountered: " +
-           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-           "after : \"" + addEscapes(errorAfter) + "\"");
-   }
-
-   /**
-    * You can also modify the body of this method to customize your error messages.
-    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-    * of end-users concern, so you can return something like :
-    *
-    *     "Internal Error : Please file a bug report .... "
-    *
-    * from this method for such cases in the release version of your parser.
-    */
-   public String getMessage() {
-      return super.getMessage();
-   }
-
-   /*
-    * Constructors of various flavors follow.
-    */
-
-   /** No arg constructor. */
-   public TokenMgrError() {
-   }
-
-   /** Constructor with message and reason. */
-   public TokenMgrError(String message, int reason) {
-      super(message);
-      errorCode = reason;
-   }
-
-   /** Full Constructor. */
-   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-   }
-}
-/* JavaCC - OriginalChecksum=941a67c25d5172a42378412878e36619 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaCharStream.java b/src/net/sourceforge/cobertura/javancss/parser/debug/JavaCharStream.java
deleted file mode 100644
index 41289a7..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaCharStream.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 4.1 */
-/* JavaCCOptions:STATIC=false */
-//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
-package net.sourceforge.cobertura.javancss.parser.debug;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (with java-like unicode escape processing).
- */
-
-public class JavaCharStream
-{
-/** Whether parser is static. */
-  public static final boolean staticFlag = false;
-  static final int hexval(char c) throws java.io.IOException {
-    switch(c)
-    {
-       case '0' :
-          return 0;
-       case '1' :
-          return 1;
-       case '2' :
-          return 2;
-       case '3' :
-          return 3;
-       case '4' :
-          return 4;
-       case '5' :
-          return 5;
-       case '6' :
-          return 6;
-       case '7' :
-          return 7;
-       case '8' :
-          return 8;
-       case '9' :
-          return 9;
-
-       case 'a' :
-       case 'A' :
-          return 10;
-       case 'b' :
-       case 'B' :
-          return 11;
-       case 'c' :
-       case 'C' :
-          return 12;
-       case 'd' :
-       case 'D' :
-          return 13;
-       case 'e' :
-       case 'E' :
-          return 14;
-       case 'f' :
-       case 'F' :
-          return 15;
-    }
-
-    throw new java.io.IOException(); // Should never come here
-  }
-
-/** Position in buffer. */
-  public int bufpos = -1;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] nextCharBuf;
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int nextCharInd = -1;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-     char[] newbuffer = new char[bufsize + 2048];
-     int newbufline[] = new int[bufsize + 2048];
-     int newbufcolumn[] = new int[bufsize + 2048];
-
-     try
-     {
-        if (wrapAround)
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           System.arraycopy(buffer, 0, newbuffer,
-                                             bufsize - tokenBegin, bufpos);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-           bufcolumn = newbufcolumn;
-
-           bufpos += (bufsize - tokenBegin);
-        }
-        else
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           bufcolumn = newbufcolumn;
-
-           bufpos -= tokenBegin;
-        }
-     }
-     catch (Throwable t)
-     {
-        throw new Error(t.getMessage());
-     }
-
-     available = (bufsize += 2048);
-     tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-     int i;
-     if (maxNextCharInd == 4096)
-        maxNextCharInd = nextCharInd = 0;
-
-     try {
-        if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
-                                            4096 - maxNextCharInd)) == -1)
-        {
-           inputStream.close();
-           throw new java.io.IOException();
-        }
-        else
-           maxNextCharInd += i;
-        return;
-     }
-     catch(java.io.IOException e) {
-        if (bufpos != 0)
-        {
-           --bufpos;
-           backup(0);
-        }
-        else
-        {
-           bufline[bufpos] = line;
-           bufcolumn[bufpos] = column;
-        }
-        throw e;
-     }
-  }
-
-  protected char ReadByte() throws java.io.IOException
-  {
-     if (++nextCharInd >= maxNextCharInd)
-        FillBuff();
-
-     return nextCharBuf[nextCharInd];
-  }
-
-/** @return starting character for token. */
-  public char BeginToken() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        tokenBegin = bufpos;
-        return buffer[bufpos];
-     }
-
-     tokenBegin = 0;
-     bufpos = -1;
-
-     return readChar();
-  }
-
-  protected void AdjustBuffSize()
-  {
-     if (available == bufsize)
-     {
-        if (tokenBegin > 2048)
-        {
-           bufpos = 0;
-           available = tokenBegin;
-        }
-        else
-           ExpandBuff(false);
-     }
-     else if (available > tokenBegin)
-        available = bufsize;
-     else if ((tokenBegin - available) < 2048)
-        ExpandBuff(true);
-     else
-        available = tokenBegin;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-     column++;
-
-     if (prevCharIsLF)
-     {
-        prevCharIsLF = false;
-        line += (column = 1);
-     }
-     else if (prevCharIsCR)
-     {
-        prevCharIsCR = false;
-        if (c == '\n')
-        {
-           prevCharIsLF = true;
-        }
-        else
-           line += (column = 1);
-     }
-
-     switch (c)
-     {
-        case '\r' :
-           prevCharIsCR = true;
-           break;
-        case '\n' :
-           prevCharIsLF = true;
-           break;
-        case '\t' :
-           column--;
-           column += (tabSize - (column % tabSize));
-           break;
-        default :
-           break;
-     }
-
-     bufline[bufpos] = line;
-     bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        return buffer[bufpos];
-     }
-
-     char c;
-
-     if (++bufpos == available)
-        AdjustBuffSize();
-
-     if ((buffer[bufpos] = c = ReadByte()) == '\\')
-     {
-        UpdateLineColumn(c);
-
-        int backSlashCnt = 1;
-
-        for (;;) // Read all the backslashes
-        {
-           if (++bufpos == available)
-              AdjustBuffSize();
-
-           try
-           {
-              if ((buffer[bufpos] = c = ReadByte()) != '\\')
-              {
-                 UpdateLineColumn(c);
-                 // found a non-backslash char.
-                 if ((c == 'u') && ((backSlashCnt & 1) == 1))
-                 {
-                    if (--bufpos < 0)
-                       bufpos = bufsize - 1;
-
-                    break;
-                 }
-
-                 backup(backSlashCnt);
-                 return '\\';
-              }
-           }
-           catch(java.io.IOException e)
-           {
-              if (backSlashCnt > 1)
-                 backup(backSlashCnt-1);
-
-              return '\\';
-           }
-
-           UpdateLineColumn(c);
-           backSlashCnt++;
-        }
-
-        // Here, we have seen an odd number of backslash's followed by a 'u'
-        try
-        {
-           while ((c = ReadByte()) == 'u')
-              ++column;
-
-           buffer[bufpos] = c = (char)(hexval(c) << 12 |
-                                       hexval(ReadByte()) << 8 |
-                                       hexval(ReadByte()) << 4 |
-                                       hexval(ReadByte()));
-
-           column += 4;
-        }
-        catch(java.io.IOException e)
-        {
-           throw new Error("Invalid escape character at line " + line +
-                                         " column " + column + ".");
-        }
-
-        if (backSlashCnt == 1)
-           return c;
-        else
-        {
-           backup(backSlashCnt - 1);
-           return '\\';
-        }
-     }
-     else
-     {
-        UpdateLineColumn(c);
-        return c;
-     }
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-  public int getColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-  public int getLine() {
-     return bufline[bufpos];
-  }
-
-/** Get end column. */
-  public int getEndColumn() {
-     return bufcolumn[bufpos];
-  }
-
-/** Get end line. */
-  public int getEndLine() {
-     return bufline[bufpos];
-  }
-
-/** @return column of token start */
-  public int getBeginColumn() {
-     return bufcolumn[tokenBegin];
-  }
-
-/** @return line number of token start */
-  public int getBeginLine() {
-     return bufline[tokenBegin];
-  }
-
-/** Retreat. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-       bufpos += bufsize;
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-    nextCharBuf = new char[4096];
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-      nextCharBuf = new char[4096];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    nextCharInd = bufpos = -1;
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-                        int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-                        int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-
-  /** @return token image as String */
-  public String GetImage()
-  {
-     if (bufpos >= tokenBegin)
-        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-     else
-        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  /** @return suffix */
-  public char[] GetSuffix(int len)
-  {
-     char[] ret = new char[len];
-
-     if ((bufpos + 1) >= len)
-        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-     else
-     {
-        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                          len - bufpos - 1);
-        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-     }
-
-     return ret;
-  }
-
-  /** Set buffers back to null when finished. */
-  public void Done()
-  {
-     nextCharBuf = null;
-     buffer = null;
-     bufline = null;
-     bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-     int start = tokenBegin;
-     int len;
-
-     if (bufpos >= tokenBegin)
-     {
-        len = bufpos - tokenBegin + inBuf + 1;
-     }
-     else
-     {
-        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-     }
-
-     int i = 0, j = 0, k = 0;
-     int nextColDiff = 0, columnDiff = 0;
-
-     while (i < len &&
-            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-     {
-        bufline[j] = newLine;
-        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-        bufcolumn[j] = newCol + columnDiff;
-        columnDiff = nextColDiff;
-        i++;
-     }
-
-     if (i < len)
-     {
-        bufline[j] = newLine++;
-        bufcolumn[j] = newCol + columnDiff;
-
-        while (i++ < len)
-        {
-           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-              bufline[j] = newLine++;
-           else
-              bufline[j] = newLine;
-        }
-     }
-
-     line = bufline[j];
-     column = bufcolumn[j];
-  }
-
-}
-/* JavaCC - OriginalChecksum=52e51dbf6ad22b1d0caf753e276d8904 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebug.java b/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebug.java
deleted file mode 100644
index dc7a203..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebug.java
+++ /dev/null
@@ -1,11082 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParserDebug.java */
-//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
-package net.sourceforge.cobertura.javancss.parser.debug;
-
-import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
-
-import java.util.*;
-
-import net.sourceforge.cobertura.javancss.ccl.Util;
-
-import net.sourceforge.cobertura.javancss.FunctionMetric;
-import net.sourceforge.cobertura.javancss.ObjectMetric;
-import net.sourceforge.cobertura.javancss.PackageMetric;
-
-/**
- * Java source code parser based on a grammar compiled by
- * JavaCC from Java1.1.jj to the JavaParserDebug class.<p>
- *
- * This class is responsible for parsing Java code and counting
- * all metrics during this parsing process.
- * The rest of the application is only responsible for invoking
- * this parser in a convenient way and to present the results
- * to the user.<p>
- *
- * This grammar is based on the Java grammar that comes as an
- * example with JavaCC, but has been extended to collect the
- * metrics data (and adapted to support real life and jdk 1.4
- * Java sources as well).
- *
- * @author    Sriram Sankar (original JavaCC grammar)
- *            , Chr. Clemens Lee <clemens at kclee.com> (JavaNCSS metrics)
- *            , additional counting of javadoc comments done by
- *              Emilio Gongora, <emilio at sms.nl> and
- *              Guillermo Rodriguez, <guille at sms.nl>.
- *            Anonymous class count patch by Vesa Karvonnen, <vesa_karvonen at hotmail.com> 2002-10-30.
- * @version   2000-01-31 $Id: Java1.1.jj 159 2009-05-27 22:18:55Z hboutemy $
- */
-public class JavaParserDebug implements JavaParserInterface, JavaParserDebugConstants {
-    {
-        //* // DEBUG MODE
-        Util.setDebug( true );
-        // */
-    }
-    private boolean _bReturn         = false;
-    private int     _ncss            = 0;     // general counter
-    private int     _loc             = 0;
-    private int     _cyc             = 1;
-    private int     _localCases      = 0;
-    private String  _sName           = "";    // name of last token
-    private String  _sParameter      = "";
-    private String  _sPackage        = "";
-    private String  _sClass          = "";
-    private String  _sFunction       = "";
-    private int     _functions       = 0;     // number of functions in this class
-    //private int     _topLevelClasses = 0;
-    private int     _classes         = 0;
-    private int     _classLevel      = 0;
-    private int     _anonClassCount  = 1;
-
-    private int     _jvdcLines = 0;           // added by SMS
-    private int     _jvdc      = 0;
-    private boolean _bPrivate  = true;//false;        // added by SMS
-    private boolean _bPublic   = true;        // added by SMS
-
-    /**
-     * For each class the number of formal
-     * comments in toplevel methods, constructors, inner
-     * classes, and for the class itself are counted.
-     * The top level comment has to be directly before
-     * the class definition, not before the package or
-     * import statement as it is often seen in source code
-     * examples (at the beginning of your source files you
-     * should instead put your copyright notice).
-     */
-    private int    _javadocs   = 0;              // global javadocs
-    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
-
-    /**
-     * Metrics for each class/interface are stored in this
-     * vector.
-     */
-    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
-    private List _vImports = new ArrayList();
-    private Object[] _aoPackage = null;
-    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
-    private PackageMetric _pPackageMetric;
-
-    private Token _tmpToken = null;
-    /** Argh, too much of a state machine. */
-    private Token _tmpResultToken = null;
-
-    private String _formatPackage(String sPackage_) {
-        if (sPackage_.equals("")) {
-            return ".";
-        }
-
-        return sPackage_.substring(0, sPackage_.length() - 1);
-    }
-
-    public void parse() throws Exception {
-      CompilationUnit();
-    }
-
-    public void parseImportUnit() throws Exception {
-      ImportUnit();
-    }
-
-    public int getNcss() {
-        return _ncss;
-    }
-
-    public int getLOC() {
-        return _loc;
-    }
-
-    // added by SMS
-    public int getJvdc() {
-        return _jvdc;
-    }
-
-    /*public int getTopLevelClasses() {
-      return _topLevelClasses;
-      }*/
-
-    public List/*<FunctionMetric>*/ getFunction() {
-        return _vFunctions;
-    }
-
-    /**
-     * @return Top level classes in sorted order
-     */
-    public List/*<ObjectMetric>*/ getObject() {
-        Collections.sort(_vClasses);
-        return _vClasses;
-    }
-
-    /**
-     * @return The empty package consists of the name ".".
-     */
-    public Map/*<String,PackageMetric>*/ getPackage() {
-        return _htPackage;
-    }
-
-    public List getImports() {
-        return _vImports;
-    }
-
-    /**
-     * name, beginLine, ...
-     */
-    public Object[] getPackageObjects() {
-        return _aoPackage;
-    }
-
-    /**
-     * if javancss is used with cat *.java a long
-     * input stream might get generated, so line
-     * number information in case of an parse exception
-     * is not very useful.
-     */
-    public String getLastFunction() {
-        return _sPackage + _sClass + _sFunction;
-    }
-
-   /**
-    * Class to hold modifiers.
-    */
-   static public final class ModifierSet
-   {
-     /* Definitions of the bits in the modifiers field.  */
-     public static final int PUBLIC = 0x0001;
-     public static final int PROTECTED = 0x0002;
-     public static final int PRIVATE = 0x0004;
-     public static final int ABSTRACT = 0x0008;
-     public static final int STATIC = 0x0010;
-     public static final int FINAL = 0x0020;
-     public static final int SYNCHRONIZED = 0x0040;
-     public static final int NATIVE = 0x0080;
-     public static final int TRANSIENT = 0x0100;
-     public static final int VOLATILE = 0x0200;
-     public static final int STRICTFP = 0x1000;
-
-     /** A set of accessors that indicate whether the specified modifier
-         is in the set. */
-
-     public boolean isPublic(int modifiers)
-     {
-       return (modifiers & PUBLIC) != 0;
-     }
-
-     public boolean isProtected(int modifiers)
-     {
-       return (modifiers & PROTECTED) != 0;
-     }
-
-     public boolean isPrivate(int modifiers)
-     {
-       return (modifiers & PRIVATE) != 0;
-     }
-
-     public boolean isStatic(int modifiers)
-     {
-       return (modifiers & STATIC) != 0;
-     }
-
-     public boolean isAbstract(int modifiers)
-     {
-       return (modifiers & ABSTRACT) != 0;
-     }
-
-     public boolean isFinal(int modifiers)
-     {
-       return (modifiers & FINAL) != 0;
-     }
-
-     public boolean isNative(int modifiers)
-     {
-       return (modifiers & NATIVE) != 0;
-     }
-
-     public boolean isStrictfp(int modifiers)
-     {
-       return (modifiers & STRICTFP) != 0;
-     }
-
-     public boolean isSynchronized(int modifiers)
-     {
-       return (modifiers & SYNCHRONIZED) != 0;
-     }
-
-     public boolean isTransient(int modifiers)
-      {
-       return (modifiers & TRANSIENT) != 0;
-     }
-
-     public boolean isVolatile(int modifiers)
-     {
-       return (modifiers & VOLATILE) != 0;
-     }
-
-     /**
-      * Removes the given modifier.
-      */
-     static int removeModifier(int modifiers, int mod)
-     {
-        return modifiers & ~mod;
-     }
-   }
-
-/*****************************************
- * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
- *****************************************/
-
-/*
- * Program structuring syntax follows.
- */
-  final public void CompilationUnit() throws ParseException {
-    trace_call("CompilationUnit");
-    try {
-    int oldNcss = 0;
-
-    // added by SMS
-    int oldFormal = 0;
-    int oldSingle = 0;
-    int oldMulti  = 0;
-
-    JavaParserDebugTokenManager._iSingleComments = 0;
-    JavaParserDebugTokenManager._iMultiComments = 0;
-    JavaParserDebugTokenManager._iFormalComments = 0;
-
-    JavaParserDebugTokenManager._iMultiCommentsLast = 0;
-
-    _bPrivate = true;
-                _sPackage = "";
-                _pPackageMetric = new PackageMetric();      // this object manages the metrics
-
-      if (jj_2_1(2147483647)) {
-        PackageDeclaration();
-      } else {
-        ;
-      }
-      label_1:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPORT:
-          ;
-          break;
-        default:
-          jj_la1[0] = jj_gen;
-          break label_1;
-        }
-        ImportDeclaration();
-      }
-      label_2:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case CLASS:
-        case ENUM:
-        case FINAL:
-        case INTERFACE:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case SEMICOLON:
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[1] = jj_gen;
-          break label_2;
-        }
-        TypeDeclaration();
-      }
-             // Package classes and functions are set inside
-             // class and interface bodies.
-             _pPackageMetric.ncss = _ncss;
-
-             // added by SMS
-             _pPackageMetric.javadocsLn = JavaParserDebugTokenManager._iFormalComments;
-             _pPackageMetric.singleLn   = JavaParserDebugTokenManager._iSingleComments;
-             _pPackageMetric.multiLn    = JavaParserDebugTokenManager._iMultiComments;
-             //
-
-             _htPackage.put(_formatPackage(_sPackage),
-                            _pPackageMetric);
-      label_3:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPORT:
-        case PACKAGE:
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[2] = jj_gen;
-          break label_3;
-        }
-      oldNcss = _ncss;
-      _sPackage = "";
-      _pPackageMetric = new PackageMetric();
-
-      // added by SMS
-      oldFormal = JavaParserDebugTokenManager._iFormalComments;
-      oldSingle = JavaParserDebugTokenManager._iSingleComments;
-      oldMulti  = JavaParserDebugTokenManager._iMultiComments;
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PACKAGE:
-        case AT:
-          PackageDeclaration();
-          break;
-        case IMPORT:
-          ImportDeclaration();
-          break;
-        default:
-          jj_la1[3] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        label_4:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case IMPORT:
-            ;
-            break;
-          default:
-            jj_la1[4] = jj_gen;
-            break label_4;
-          }
-          ImportDeclaration();
-        }
-        label_5:
-        while (true) {
-          TypeDeclaration();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case CLASS:
-          case ENUM:
-          case FINAL:
-          case INTERFACE:
-          case NATIVE:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case STATIC:
-          case TESTAAAA:
-          case SYNCHRONIZED:
-          case TRANSIENT:
-          case VOLATILE:
-          case SEMICOLON:
-          case AT:
-            ;
-            break;
-          default:
-            jj_la1[5] = jj_gen;
-            break label_5;
-          }
-        }
-      // Package classes and functions are set inside
-      // class and interface bodies.
-      _pPackageMetric.ncss = _ncss - oldNcss;
-
-      // added by SMS
-      _pPackageMetric.javadocsLn = JavaParserDebugTokenManager._iFormalComments - oldFormal;
-      _pPackageMetric.singleLn   = JavaParserDebugTokenManager._iSingleComments - oldSingle;
-      _pPackageMetric.multiLn    = JavaParserDebugTokenManager._iMultiComments  - oldMulti;
-      //
-
-      PackageMetric pckmPrevious = (PackageMetric)_htPackage.
-             get(_formatPackage(_sPackage));
-      _pPackageMetric.add(pckmPrevious);
-      _htPackage.put(_formatPackage(_sPackage),
-                     _pPackageMetric);
-      }
-      jj_consume_token(0);
-             Token pToken = getToken(1);
-             _loc = pToken.endLine;
-    } finally {
-      trace_return("CompilationUnit");
-    }
-  }
-
-  final public void ImportUnit() throws ParseException {
-    trace_call("ImportUnit");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PACKAGE:
-      case AT:
-        PackageDeclaration();
-        break;
-      default:
-        jj_la1[6] = jj_gen;
-        ;
-      }
-      label_6:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPORT:
-          ;
-          break;
-        default:
-          jj_la1[7] = jj_gen;
-          break label_6;
-        }
-        ImportDeclaration();
-      }
-      label_7:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case PUBLIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-          ;
-          break;
-        default:
-          jj_la1[8] = jj_gen;
-          break label_7;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-          break;
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-          break;
-        case SYNCHRONIZED:
-          jj_consume_token(SYNCHRONIZED);
-          break;
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-          break;
-        default:
-          jj_la1[9] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CLASS:
-        jj_consume_token(CLASS);
-        break;
-      case INTERFACE:
-        jj_consume_token(INTERFACE);
-        break;
-      default:
-        jj_la1[10] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("ImportUnit");
-    }
-  }
-
-  final public void PackageDeclaration() throws ParseException {
-    trace_call("PackageDeclaration");
-    try {
-    int beginLine = 1;
-    int beginColumn = 1;
-      label_8:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[11] = jj_gen;
-          break label_8;
-        }
-        Annotation();
-      }
-      jj_consume_token(PACKAGE);
-      _anonClassCount = 1;
-
-      Token pToken = getToken( 0 );
-      beginLine = pToken.beginLine ;
-      beginColumn = pToken.beginColumn;
-      _aoPackage = new Object[ 5 ];
-      Name();
-      _aoPackage[ 0 ] = _sName;
-      _aoPackage[ 1 ] = new Integer( beginLine );
-      _aoPackage[ 2 ] = new Integer( beginColumn );
-      jj_consume_token(SEMICOLON);
-      _aoPackage[ 3 ] = new Integer( getToken( 0 ).endLine );
-      _aoPackage[ 4 ] = new Integer( getToken( 0 ).endColumn );
-      _ncss++;
-      Util.debug( "_ncss++" );
-      _sPackage = _sName + ".";
-    } finally {
-      trace_return("PackageDeclaration");
-    }
-  }
-
-  final public void ImportDeclaration() throws ParseException {
-    trace_call("ImportDeclaration");
-    try {
-    int beginLine = 1;
-    int beginColumn = 1;
-    Object[] aoImport = null;
-      jj_consume_token(IMPORT);
-      Token pToken = getToken( 0 );
-      beginLine = pToken.beginLine ;
-      beginColumn = pToken.beginColumn;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      default:
-        jj_la1[12] = jj_gen;
-        ;
-      }
-      Name();
-      aoImport = new Object[ 5 ];
-      aoImport[ 0 ] = _sName;
-      aoImport[ 1 ] = new Integer( beginLine );
-      aoImport[ 2 ] = new Integer( beginColumn );
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case DOT:
-        jj_consume_token(DOT);
-        jj_consume_token(STAR);
-              aoImport[ 0 ] = aoImport[ 0 ].toString() + ".*";
-        break;
-      default:
-        jj_la1[13] = jj_gen;
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-      aoImport[ 3 ] = new Integer( getToken( 0 ).endLine );
-      aoImport[ 4 ] = new Integer( getToken( 0 ).endColumn );
-      _vImports.add( aoImport );
-      _ncss++;
-      Util.debug( "_ncss++" );
-    } finally {
-      trace_return("ImportDeclaration");
-    }
-  }
-
-  final public void TypeDeclaration() throws ParseException {
-    trace_call("TypeDeclaration");
-    try {
-   int modifiers;
-      if (jj_2_2(2147483647)) {
-        ClassDeclaration();
-      } else if (jj_2_3(2147483647)) {
-        modifiers = Modifiers();
-        EnumDeclaration(modifiers);
-      } else if (jj_2_4(2147483647)) {
-        InterfaceDeclaration();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case AT:
-          modifiers = Modifiers();
-          AnnotationTypeDeclaration(modifiers);
-          break;
-        case SEMICOLON:
-          jj_consume_token(SEMICOLON);
-          break;
-        default:
-          jj_la1[14] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("TypeDeclaration");
-    }
-  }
-
-/*
- * Declaration syntax follows.
- */
-  final public void ClassDeclaration() throws ParseException {
-    trace_call("ClassDeclaration");
-    try {
-    Token tmpToken = null;
-    _javadocs = 0;
-    ObjectMetric metric = null;
-
-    // added by SMS
-    int oldSingle = 0;
-    int oldMulti  = 0;
-
-    _jvdcLines    = 0;
-    boolean bTemp = _bPublic;
-    _bPublic      = false;
-    //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-         myToken = getToken(1);
-        Annotation();
-         tmpToken = myToken;
-        break;
-      default:
-        jj_la1[15] = jj_gen;
-        ;
-      }
-      label_9:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[16] = jj_gen;
-          break label_9;
-        }
-        Annotation();
-      }
-      label_10:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case PUBLIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-          ;
-          break;
-        default:
-          jj_la1[17] = jj_gen;
-          break label_10;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-      _bPublic = true;         // added by SMS
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case SYNCHRONIZED:
-          jj_consume_token(SYNCHRONIZED);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        default:
-          jj_la1[18] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 1 );
-      }
-      while( tmpToken.specialToken != null ) {
-          if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-              _javadocs++;
-              Util.debug( "ClassDeclaration()._javadocs++" );
-              if (_bPublic || _bPrivate) {
-                  Util.debug( "_jvdc++" );
-                  _jvdc++;
-                  _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
-                  JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
-              }
-              JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
-              break;
-          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-              break;
-          }
-
-          //System.out.println("\n"+tmpToken.specialToken.image);
-
-          tmpToken = tmpToken.specialToken;
-      }
-
-      oldSingle = JavaParserDebugTokenManager._iSingleComments;
-      oldMulti = JavaParserDebugTokenManager._iMultiComments;
-      UnmodifiedClassDeclaration();
-             /* removed by SMS
-             while( tmpToken.specialToken != null ) {
-                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                     _javadocs++;
-                 }
-                 tmpToken = tmpToken.specialToken;
-             }
-             */
-             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1);
-             metric.javadocs = _javadocs;
-
-             // added by SMS
-             metric.javadocsLn = _jvdcLines;
-             metric.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
-             metric.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
-             //
-
-            // added by SMS
-            _bPublic = bTemp;
-    } finally {
-      trace_return("ClassDeclaration");
-    }
-  }
-
-  final public void UnmodifiedClassDeclaration() throws ParseException {
-    trace_call("UnmodifiedClassDeclaration");
-    try {
-        String sOldClass = _sClass;
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        int oldClasses = _classes;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                int oldJavadocs = _javadocs;
-                if (!_sClass.equals("")) {
-                        _sClass += ".";
-                }
-                _sClass += getToken(2).image;
-                _classLevel ++;
-      Modifiers();
-      jj_consume_token(CLASS);
-      Identifier();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        jj_la1[19] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        jj_consume_token(EXTENDS);
-        Name();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-          TypeArguments();
-          break;
-        default:
-          jj_la1[20] = jj_gen;
-          ;
-        }
-        label_11:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case DOT:
-            ;
-            break;
-          default:
-            jj_la1[21] = jj_gen;
-            break label_11;
-          }
-          jj_consume_token(DOT);
-          Name();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LT:
-            TypeArguments();
-            break;
-          default:
-            jj_la1[22] = jj_gen;
-            ;
-          }
-        }
-        break;
-      default:
-        jj_la1[23] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPLEMENTS:
-        jj_consume_token(IMPLEMENTS);
-        NameList();
-        break;
-      default:
-        jj_la1[24] = jj_gen;
-        ;
-      }
-      ClassBody();
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _classLevel--;
-                if (_classLevel == 0) {
-                        //_topLevelClasses++;
-                        ObjectMetric metric = new ObjectMetric();
-                        metric.name = _sPackage + _sClass;
-                        metric.ncss = _ncss - oldNcss;
-                        metric.functions = _functions - oldFunctions;
-                        metric.classes = _classes - oldClasses;
-                        Token lastToken = getToken( 0 );
-                        //metric.add( new Integer( lastToken.endLine ) );
-                        //metric.add( new Integer( lastToken.endColumn ) );
-                        //metric.add( new Integer( _javadocs ) );
-                        _vClasses.add( metric );
-                        _pPackageMetric.functions += _functions - oldFunctions;
-                        _pPackageMetric.classes++;
-
-                        // added by SMS
-                        _pPackageMetric.javadocs += _javadocs;
-                        //_pPackageMetric.javadocsLn += JavaParserDebugTokenManager._iFormalComments - oldFormal;
-                        //_pPackageMetric.singleLn += JavaParserDebugTokenManager._iSingleComments - oldSingle;
-                        //_pPackageMetric.multiLn += JavaParserDebugTokenManager._iMultiComments - oldMulti;
-                        //
-                }
-                        //Added by REYNAUD Sebastien (LOGICA)
-                        else
-                        {
-                        ObjectMetric metric1 = new ObjectMetric();
-                  metric1.name = _sPackage + _sClass ;
-                        metric1.ncss = _ncss - oldNcss;
-                  metric1.functions = _functions - oldFunctions;
-                  metric1.classes = _classes - oldClasses;
-                  Token lastToken = getToken( 0 );
-                  _vClasses.add( metric1 );
-                  _pPackageMetric.functions += _functions - oldFunctions;
-                  _pPackageMetric.classes++;
-                        metric1.javadocs = _javadocs - oldJavadocs;
-                        }
-                        //
-
-                _functions = oldFunctions;
-                _classes = oldClasses + 1;
-                _sClass = sOldClass;
-    } finally {
-      trace_return("UnmodifiedClassDeclaration");
-    }
-  }
-
-  final public void ClassBody() throws ParseException {
-    trace_call("ClassBody");
-    try {
-      jj_consume_token(LBRACE);
-      label_12:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case LT:
-          ;
-          break;
-        default:
-          jj_la1[25] = jj_gen;
-          break label_12;
-        }
-        ClassBodyDeclaration();
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("ClassBody");
-    }
-  }
-
-  final public void NestedClassDeclaration() throws ParseException {
-    trace_call("NestedClassDeclaration");
-    try {
-    // added by SMS
-    Token tmpToken = null;
-
-    boolean bTemp = _bPublic;
-    _bPublic = false;
-    boolean bPublic = false;
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-         myToken = getToken(1);
-        Annotation();
-         tmpToken = myToken;
-        break;
-      default:
-        jj_la1[26] = jj_gen;
-        ;
-      }
-      label_13:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[27] = jj_gen;
-          break label_13;
-        }
-        Annotation();
-      }
-        if(tmpToken==null)
-        {
-                tmpToken = getToken( 1 );
-        }
-      label_14:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-          ;
-          break;
-        default:
-          jj_la1[28] = jj_gen;
-          break label_14;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STATIC:
-          jj_consume_token(STATIC);
-          break;
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-          break;
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-               bPublic = true;
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-                  bPublic = true;
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-          break;
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-          break;
-        default:
-          jj_la1[29] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-                        //tmpToken = getToken( 0 );//Removed by REYNAUD Sebastien (LOGICA)
-
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        Util.debug( "NestedClassDeclaration()._javadocs++" );
-                        if ((_bPublic && bPublic) || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
-                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-      UnmodifiedClassDeclaration();
-       //added by SMS
-      _bPublic = bTemp;
-    } finally {
-      trace_return("NestedClassDeclaration");
-    }
-  }
-
-  final public void ClassBodyDeclaration() throws ParseException {
-    trace_call("ClassBodyDeclaration");
-    try {
-    int modifiers;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SEMICOLON:
-        EmptyStatement();
-        break;
-      default:
-        jj_la1[31] = jj_gen;
-        if (jj_2_5(2)) {
-          Initializer();
-        } else if (jj_2_6(2147483647)) {
-          modifiers = Modifiers();
-          AnnotationTypeDeclaration(modifiers);
-        } else if (jj_2_7(2147483647)) {
-          CreationAnnotation();
-        } else if (jj_2_8(2147483647)) {
-          NestedClassDeclaration();
-        } else if (jj_2_9(2147483647)) {
-          //LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface" )
-            modifiers = Modifiers();
-          NestedInterfaceDeclaration();
-        } else if (jj_2_10(2147483647)) {
-          modifiers = Modifiers();
-          EnumDeclaration(modifiers);
-        } else if (jj_2_11(2147483647)) {
-          ConstructorDeclaration();
-        } else if (jj_2_12(2147483647)) {
-          MethodDeclaration();
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FINAL:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case SHORT:
-          case STATIC:
-          case TRANSIENT:
-          case VOLATILE:
-          case IDENTIFIER:
-          case AT:
-            label_15:
-            while (true) {
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case AT:
-                ;
-                break;
-              default:
-                jj_la1[30] = jj_gen;
-                break label_15;
-              }
-              Annotation();
-            }
-            FieldDeclaration();
-            break;
-          default:
-            jj_la1[32] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    } finally {
-      trace_return("ClassBodyDeclaration");
-    }
-  }
-
-// This production is to determine lookahead only.
-  final public void MethodDeclarationLookahead() throws ParseException {
-    trace_call("MethodDeclarationLookahead");
-    try {
-      label_16:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[33] = jj_gen;
-          break label_16;
-        }
-        Annotation();
-      }
-      label_17:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-          ;
-          break;
-        default:
-          jj_la1[34] = jj_gen;
-          break label_17;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-          break;
-        case STATIC:
-          jj_consume_token(STATIC);
-          break;
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-          break;
-        case NATIVE:
-          jj_consume_token(NATIVE);
-          break;
-        case SYNCHRONIZED:
-          jj_consume_token(SYNCHRONIZED);
-          break;
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-          break;
-        default:
-          jj_la1[35] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      label_18:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[36] = jj_gen;
-          break label_18;
-        }
-        Annotation();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        jj_la1[37] = jj_gen;
-        ;
-      }
-      ResultType();
-      Identifier();
-      jj_consume_token(LPAREN);
-    } finally {
-      trace_return("MethodDeclarationLookahead");
-    }
-  }
-
-  final public void InterfaceDeclaration() throws ParseException {
-    trace_call("InterfaceDeclaration");
-    try {
-        Token tmpToken = null;
-        _javadocs = 0;
-        //boolean bClassComment = false;
-        ObjectMetric metric = null;
-
-        // added by SMS
-        int oldSingle;
-        int oldMulti;
-
-        _jvdcLines = 0;
-        boolean bTemp = _bPublic;
-        _bPublic = false;
-        //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken=null;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-         myToken = getToken(1);
-        Annotation();
-         tmpToken = myToken;
-        break;
-      default:
-        jj_la1[38] = jj_gen;
-        ;
-      }
-      label_19:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[39] = jj_gen;
-          break label_19;
-        }
-        Annotation();
-      }
-      label_20:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case PUBLIC:
-        case TESTAAAA:
-          ;
-          break;
-        default:
-          jj_la1[40] = jj_gen;
-          break label_20;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-          break;
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-      _bPublic = true;         // added by SMS
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        default:
-          jj_la1[41] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 1 );
-      }
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        Util.debug( "InterfaceDeclaration()._javadocs++" );
-                        if (_bPublic || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
-                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-
-                oldSingle = JavaParserDebugTokenManager._iSingleComments;
-                oldMulti = JavaParserDebugTokenManager._iMultiComments;
-      UnmodifiedInterfaceDeclaration();
-             /* removed by SMS
-             while( tmpToken.specialToken != null ) {
-                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                     _javadocs++;
-                     bClassComment = true;
-                 }
-                 tmpToken = tmpToken.specialToken;
-                 }*/
-             metric = (ObjectMetric)_vClasses.get( _vClasses.size() - 1 );
-             metric.javadocs = _javadocs;
-
-             // added by SMS
-             metric.javadocsLn = _jvdcLines;
-             metric.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
-             metric.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
-             //
-
-            // added by SMS
-            _bPublic = bTemp;
-    } finally {
-      trace_return("InterfaceDeclaration");
-    }
-  }
-
-  final public void NestedInterfaceDeclaration() throws ParseException {
-    trace_call("NestedInterfaceDeclaration");
-    try {
-    // added by SMS
-    Token tmpToken = null;
-
-    boolean bTemp = _bPublic;
-    _bPublic = false;
-    boolean bPublic = false;
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken=null;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-         myToken = getToken(1);
-        Annotation();
-         tmpToken = myToken;
-        break;
-      default:
-        jj_la1[42] = jj_gen;
-        ;
-      }
-      label_21:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[43] = jj_gen;
-          break label_21;
-        }
-        Annotation();
-      }
-        if(tmpToken==null)
-        {
-                tmpToken = getToken( 1 );
-        }
-      label_22:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-          ;
-          break;
-        default:
-          jj_la1[44] = jj_gen;
-          break label_22;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STATIC:
-          jj_consume_token(STATIC);
-          break;
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-          break;
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-               bPublic = true;
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-                  bPublic = true;
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-          break;
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-          break;
-        default:
-          jj_la1[45] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-                        //tmpToken = getToken( 0 );	//Removed by REYNAUD Sebastien (LOGICA)
-
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        if ((_bPublic && bPublic) || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
-                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-      UnmodifiedInterfaceDeclaration();
-      // added by SMS
-      _bPublic = bTemp;
-    } finally {
-      trace_return("NestedInterfaceDeclaration");
-    }
-  }
-
-  final public void UnmodifiedInterfaceDeclaration() throws ParseException {
-    trace_call("UnmodifiedInterfaceDeclaration");
-    try {
-        String sOldClass = _sClass;
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        int oldClasses = _classes;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                int oldJavadocs = _javadocs;
-                if (!_sClass.equals("")) {
-                        _sClass += ".";
-                }
-                _sClass += getToken(2).image;
-                _classLevel ++;
-      jj_consume_token(INTERFACE);
-      Identifier();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        jj_la1[46] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        jj_consume_token(EXTENDS);
-        NameList();
-        break;
-      default:
-        jj_la1[47] = jj_gen;
-        ;
-      }
-      jj_consume_token(LBRACE);
-      label_23:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case SEMICOLON:
-        case AT:
-        case LT:
-          ;
-          break;
-        default:
-          jj_la1[48] = jj_gen;
-          break label_23;
-        }
-        InterfaceMemberDeclaration();
-      }
-      jj_consume_token(RBRACE);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _classLevel--;
-                if (_classLevel == 0)
-                {
-                        //_topLevelClasses++;
-                        ObjectMetric metric = new ObjectMetric();
-                        metric.name = _sPackage + _sClass;
-                        metric.ncss = _ncss - oldNcss;
-                        metric.functions = _functions - oldFunctions;
-                        metric.classes = _classes - oldClasses;
-                        //metric.add( Util.getConstantObject() );
-                        //metric.add( Util.getConstantObject() );
-                        _vClasses.add( metric );
-                        _pPackageMetric.functions += _functions - oldFunctions;
-                        _pPackageMetric.classes++;
-
-                        // added by SMS
-                        _pPackageMetric.javadocs += _javadocs;
-                        //_pPackageMetric.javadocsLn += JavaParserDebugTokenManager._iFormalComments - oldFormal;
-                        //_pPackageMetric.singleLn += JavaParserDebugTokenManager._iSingleComments - oldSingle;
-                        //_pPackageMetric.multiLn += JavaParserDebugTokenManager._iMultiComments - oldMulti;
-                        //
-                }
-                        //Added by REYNAUD Sebastien (LOGICA)
-                        else
-                        {
-                        ObjectMetric metric1 = new ObjectMetric();
-                  metric1.name = _sPackage + _sClass;
-                        metric1.ncss = _ncss - oldNcss;
-                  metric1.functions = _functions - oldFunctions;
-                  metric1.classes = _classes - oldClasses;
-                  Token lastToken = getToken( 0 );
-                  _vClasses.add( metric1 );
-                  _pPackageMetric.functions += _functions - oldFunctions;
-                  _pPackageMetric.classes++;
-                        //_pPackageMetric.javadocs += _javadocs;
-                        metric1.javadocs = _javadocs - oldJavadocs;
-                        }
-                        //
-
-                _functions = oldFunctions;
-                _classes = oldClasses + 1;
-                _sClass = sOldClass;
-    } finally {
-      trace_return("UnmodifiedInterfaceDeclaration");
-    }
-  }
-
-  final public void InterfaceMemberDeclaration() throws ParseException {
-    trace_call("InterfaceMemberDeclaration");
-    try {
-   int modifiers;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SEMICOLON:
-        EmptyStatement();
-        break;
-      default:
-        jj_la1[49] = jj_gen;
-        if (jj_2_13(2147483647)) {
-          NestedClassDeclaration();
-        } else if (jj_2_14(2147483647)) {
-          NestedInterfaceDeclaration();
-        } else if (jj_2_15(2147483647)) {
-          modifiers = Modifiers();
-          EnumDeclaration(modifiers);
-        } else if (jj_2_16(2147483647)) {
-          MethodDeclaration();
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FINAL:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NATIVE:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case SHORT:
-          case STATIC:
-          case TESTAAAA:
-          case SYNCHRONIZED:
-          case TRANSIENT:
-          case VOLATILE:
-          case IDENTIFIER:
-          case AT:
-            modifiers = Modifiers();
-            FieldDeclaration();
-            break;
-          default:
-            jj_la1[50] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    } finally {
-      trace_return("InterfaceMemberDeclaration");
-    }
-  }
-
-  final public void FieldDeclaration() throws ParseException {
-    trace_call("FieldDeclaration");
-    try {
-    // added by SMS
-    Token tmpToken = null;
-    boolean bPublic = false;
-      label_24:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FINAL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TRANSIENT:
-        case VOLATILE:
-          ;
-          break;
-        default:
-          jj_la1[51] = jj_gen;
-          break label_24;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-               bPublic = true;
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-                  bPublic = true;
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-          break;
-        case STATIC:
-          jj_consume_token(STATIC);
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-          break;
-        case TRANSIENT:
-          jj_consume_token(TRANSIENT);
-          break;
-        case VOLATILE:
-          jj_consume_token(VOLATILE);
-          break;
-        default:
-          jj_la1[52] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-                tmpToken = getToken( 0 );
-
-                while( tmpToken.specialToken != null )
-                {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) )
-                    {
-                        if ((bPublic && _bPublic) || _bPrivate)
-                        {
-                            //_javadocs++;
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            _jvdcLines += JavaParserDebugTokenManager._iMultiCommentsLast;
-                            JavaParserDebugTokenManager._iFormalComments += JavaParserDebugTokenManager._iMultiCommentsLast;
-                        }
-                        JavaParserDebugTokenManager._iMultiComments -= JavaParserDebugTokenManager._iMultiCommentsLast;
-                        break;
-                    }
-                    else if ( tmpToken.specialToken.image.startsWith( "/*" ) )
-                    {
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-      label_25:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[53] = jj_gen;
-          break label_25;
-        }
-        Annotation();
-      }
-      Type();
-      VariableDeclarator();
-      label_26:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[54] = jj_gen;
-          break label_26;
-        }
-        jj_consume_token(COMMA);
-        VariableDeclarator();
-      }
-      jj_consume_token(SEMICOLON);
-    _ncss++; Util.debug( "_ncss++" );
-    } finally {
-      trace_return("FieldDeclaration");
-    }
-  }
-
-  final public void VariableDeclarator() throws ParseException {
-    trace_call("VariableDeclarator");
-    try {
-      VariableDeclaratorId();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        jj_consume_token(ASSIGN);
-        VariableInitializer();
-        break;
-      default:
-        jj_la1[55] = jj_gen;
-        ;
-      }
-    } finally {
-      trace_return("VariableDeclarator");
-    }
-  }
-
-  final public void VariableDeclaratorId() throws ParseException {
-    trace_call("VariableDeclaratorId");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ENUM:
-        jj_consume_token(ENUM);
-        break;
-      case ASSERT:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[56] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      label_27:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ;
-          break;
-        default:
-          jj_la1[57] = jj_gen;
-          break label_27;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-                                          _sName += "[]";
-      }
-    } finally {
-      trace_return("VariableDeclaratorId");
-    }
-  }
-
-  final public void VariableInitializer() throws ParseException {
-    trace_call("VariableInitializer");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACE:
-        ArrayInitializer();
-        break;
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        Expression();
-        break;
-      default:
-        jj_la1[58] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("VariableInitializer");
-    }
-  }
-
-  final public void ArrayInitializer() throws ParseException {
-    trace_call("ArrayInitializer");
-    try {
-      jj_consume_token(LBRACE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        VariableInitializer();
-        label_28:
-        while (true) {
-          if (jj_2_17(2)) {
-            ;
-          } else {
-            break label_28;
-          }
-          jj_consume_token(COMMA);
-          VariableInitializer();
-        }
-        break;
-      default:
-        jj_la1[59] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        jj_consume_token(COMMA);
-        break;
-      default:
-        jj_la1[60] = jj_gen;
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("ArrayInitializer");
-    }
-  }
-
-  final public void MethodDeclaration() throws ParseException {
-    trace_call("MethodDeclaration");
-    try {
-    int oldNcss = _ncss;
-    int oldFunctions = _functions;
-    String sOldFunction = _sFunction;
-    int oldcyc = _cyc;
-    boolean bOldReturn = _bReturn;
-    Token tmpToken = null;
-    int jvdc = 0;
-
-    // added by SMS
-    int jvdcLines = 0;
-    int oldSingle;
-    int oldMulti;
-    boolean bPublic = false;
-    //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-        _tmpToken=null;
-    if ( _tmpToken != null )
-    {
-        tmpToken = _tmpToken;
-    }
-      label_29:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[61] = jj_gen;
-          break label_29;
-        }
-         myToken = getToken(1);
-        Annotation();
-      if ( tmpToken == null ) {
-
-          //tmpToken = getToken( 0 ); //Removed by REYNAUD Sebastien (LOGICA)
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                tmpToken = myToken;
-                //
-      }
-      }
-      label_30:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-          ;
-          break;
-        default:
-          jj_la1[62] = jj_gen;
-          break label_30;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-               bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-                    bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case STATIC:
-          jj_consume_token(STATIC);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case NATIVE:
-          jj_consume_token(NATIVE);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case SYNCHRONIZED:
-          jj_consume_token(SYNCHRONIZED);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        default:
-          jj_la1[63] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      label_31:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[64] = jj_gen;
-          break label_31;
-        }
-        Annotation();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        jj_la1[65] = jj_gen;
-        ;
-      }
-               _tmpResultToken = null;
-      ResultType();
-            if ( tmpToken == null )
-            {
-                tmpToken = _tmpResultToken;
-                if ( tmpToken == null )
-                {
-                    tmpToken = getToken( 0 );
-                }
-                Util.debug( "result type tmpToken: " + tmpToken );
-            }
-      MethodDeclarator();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case THROWS:
-        jj_consume_token(THROWS);
-        NameList();
-        break;
-      default:
-        jj_la1[66] = jj_gen;
-        ;
-      }
-                _cyc = 1;
-                _bReturn = false;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACE:
-        Block();
-        break;
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        break;
-      default:
-        jj_la1[67] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-  // added by SMS
-  {
-      Util.debug( "Token: " + String.valueOf( tmpToken.image ) );
-      while( tmpToken.specialToken != null )
-      {
-          Util.debug( "Token comment: " + String.valueOf( tmpToken.specialToken.image ) );
-          if ( tmpToken.specialToken.image.startsWith( "/**" ) )
-          {
-              _javadocs++;
-              Util.debug( "MethodDeclaration()._javadocs++" );
-              jvdc++;
-              if ((bPublic && _bPublic) || _bPrivate) {
-                  Util.debug( "_jvdc++" );
-                  _jvdc++;
-                  jvdcLines = JavaParserDebugTokenManager._iMultiCommentsLast;
-                  _jvdcLines += jvdcLines;
-                  JavaParserDebugTokenManager._iFormalComments += jvdcLines;
-              }
-              JavaParserDebugTokenManager._iMultiComments -= jvdcLines;
-              break;
-          }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-              jvdcLines = 0;
-              break;
-          }
-
-          //System.out.println("\n"+tmpToken.specialToken.image);
-
-          tmpToken = tmpToken.specialToken;
-      }
-
-      oldSingle = JavaParserDebugTokenManager._iSingleComments;
-      oldMulti = JavaParserDebugTokenManager._iMultiComments;
-  }
-
-
-             // removed by ccl
-             /*
-             while( tmpToken.specialToken != null ) {
-                 if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                     jvdc++;
-                     _javadocs++;
-                 }
-                 tmpToken = tmpToken.specialToken;
-             }
-             */
-             // removed by SMS
-             /*
-               while( tmpToken.specialToken != null ) {
-               if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-               jvdc++;
-               _javadocs++;
-               _bJavadoc = true;
-               }
-
-               tmpToken = tmpToken.specialToken;
-               }
-             */
-
-             if (_bReturn)
-             {
-                 _cyc--;
-             }
-             _ncss++;
-             Util.debug( "MethodDeclaration()._ncss++" );
-
-             FunctionMetric functionMetrics = new FunctionMetric();
-             functionMetrics.name = _sPackage + _sClass + _sFunction;
-             functionMetrics.ncss = _ncss - oldNcss;
-             functionMetrics.ccn = _cyc;
-             functionMetrics.javadocs = jvdc;
-
-             // added by SMS
-             functionMetrics.javadocsLn = 0; //jvdcLines;
-             functionMetrics.singleLn = 0; //JavaParserDebugTokenManager._iSingleComments - oldSingle;
-             functionMetrics.multiLn = 0; //JavaParserDebugTokenManager._iMultiComments - oldMulti;
-             //
-
-             _vFunctions.add(functionMetrics);
-             _sFunction = sOldFunction;
-             _functions = oldFunctions + 1;
-             _cyc = oldcyc;
-             _bReturn = bOldReturn;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                _tmpToken = null;
-                //
-
-    } finally {
-      trace_return("MethodDeclaration");
-    }
-  }
-
-  final public void MethodDeclarator() throws ParseException {
-    trace_call("MethodDeclarator");
-    try {
-                _sFunction = "." + getToken(1).image;
-      Identifier();
-      FormalParameters();
-                _sFunction += _sParameter;
-      label_32:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ;
-          break;
-        default:
-          jj_la1[68] = jj_gen;
-          break label_32;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-              _sFunction += "[]";
-      }
-    } finally {
-      trace_return("MethodDeclarator");
-    }
-  }
-
-  final public void FormalParameters() throws ParseException {
-    trace_call("FormalParameters");
-    try {
-                _sParameter = "(";
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-        FormalParameter();
-                            _sParameter += _sName;
-        label_33:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case COMMA:
-            ;
-            break;
-          default:
-            jj_la1[69] = jj_gen;
-            break label_33;
-          }
-          jj_consume_token(COMMA);
-          FormalParameter();
-                            _sParameter += "," + _sName;
-        }
-        break;
-      default:
-        jj_la1[70] = jj_gen;
-        ;
-      }
-      jj_consume_token(RPAREN);
-                _sParameter += ")";
-    } finally {
-      trace_return("FormalParameters");
-    }
-  }
-
-  final public void FormalParameter() throws ParseException {
-    trace_call("FormalParameter");
-    try {
-      Modifiers();
-      Type();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ELLIPSIS:
-        jj_consume_token(ELLIPSIS);
-        break;
-      default:
-        jj_la1[71] = jj_gen;
-        ;
-      }
-      VariableDeclaratorId();
-    } finally {
-      trace_return("FormalParameter");
-    }
-  }
-
-  final public void ConstructorDeclaration() throws ParseException {
-    trace_call("ConstructorDeclaration");
-    try {
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        String sOldFunction = _sFunction;
-        int oldcyc = _cyc;
-        boolean bOldReturn = _bReturn;
-        Token tmpToken = null;
-        int jvdc = 0;
-
-        // added by SMS
-        int oldSingle;
-        int oldMulti;
-        int jvdcLines = 0;
-        boolean bPublic = false;
-        //
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        Token myToken = null;
-      label_34:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[72] = jj_gen;
-          break label_34;
-        }
-         myToken = getToken(1);
-        Annotation();
-        if ( tmpToken == null )
-                {
-                        tmpToken = myToken;
-        }
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-               bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-                 bPublic = true;
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-      if ( tmpToken == null ) {
-          tmpToken = getToken( 0 );
-      }
-          break;
-        default:
-          jj_la1[73] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_la1[74] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        jj_la1[75] = jj_gen;
-        ;
-      }
-      Identifier();
-            if ( tmpToken == null ) {
-                tmpToken = getToken( 0 );
-            }
-                _cyc = 1;
-                _sFunction = _sPackage + _sClass + "." + getToken(0).image;
-      FormalParameters();
-                _sFunction += _sParameter;
-                _bReturn = false;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case THROWS:
-        jj_consume_token(THROWS);
-        NameList();
-        break;
-      default:
-        jj_la1[76] = jj_gen;
-        ;
-      }
-      jj_consume_token(LBRACE);
-      if (jj_2_18(2147483647)) {
-        ExplicitConstructorInvocation();
-      } else {
-        ;
-      }
-      if (jj_2_19(2147483647)) {
-        ExplicitConstructorInvocation();
-      } else {
-        ;
-      }
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        _javadocs++;
-                        jvdc++;
-                        if ((bPublic && _bPublic) || _bPrivate) {
-                            Util.debug( "_jvdc++" );
-                            _jvdc++;
-                            jvdcLines = JavaParserDebugTokenManager._iMultiCommentsLast;
-                            _jvdcLines += jvdcLines;
-                            JavaParserDebugTokenManager._iFormalComments += jvdcLines;
-                        }
-                        JavaParserDebugTokenManager._iMultiComments -= jvdcLines;
-                        break;
-                    }  else if ( tmpToken.specialToken.image.startsWith( "/*" ) ) {
-                        jvdcLines = 0;
-                        break;
-                    }
-
-                    //System.out.println("\n"+tmpToken.specialToken.image);
-
-                    tmpToken = tmpToken.specialToken;
-                }
-
-
-                oldSingle = JavaParserDebugTokenManager._iSingleComments;
-                oldMulti = JavaParserDebugTokenManager._iMultiComments;
-      label_35:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case RETURN:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRANSIENT:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case VOLATILE:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          ;
-          break;
-        default:
-          jj_la1[77] = jj_gen;
-          break label_35;
-        }
-        BlockStatement();
-      }
-      jj_consume_token(RBRACE);
-            /*
-                while( tmpToken.specialToken != null ) {
-                    if ( tmpToken.specialToken.image.startsWith( "/**" ) ) {
-                        jvdc++;
-                        _javadocs++;
-                    }
-                    tmpToken = tmpToken.specialToken;
-                }
-            */
-                if (_bReturn) {
-                        _cyc--;
-                }
-                _ncss++;
-                Util.debug( "_ncss++" );
-
-                FunctionMetric functionMetrics = new FunctionMetric();
-                functionMetrics.name = _sFunction;
-                functionMetrics.ncss = _ncss - oldNcss;
-                functionMetrics.ccn = _cyc;
-                functionMetrics.javadocs = jvdc;
-
-                // added by SMS
-                functionMetrics.javadocsLn = jvdcLines;
-                functionMetrics.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
-                functionMetrics.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
-                //
-
-                _vFunctions.add(functionMetrics);
-                _sFunction = sOldFunction;
-                _functions = oldFunctions + 1;
-                _cyc = oldcyc;
-                _bReturn = bOldReturn;
-
-                //Added by REYNAUD Sebastien (LOGICA)
-                _tmpToken = null;
-                //
-
-    } finally {
-      trace_return("ConstructorDeclaration");
-    }
-  }
-
-  final public void ExplicitConstructorInvocation() throws ParseException {
-    trace_call("ExplicitConstructorInvocation");
-    try {
-      if (jj_2_21(2147483647)) {
-        jj_consume_token(THIS);
-        Arguments();
-        jj_consume_token(SEMICOLON);
-           _ncss++;       Util.debug( "_ncss++" );
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-          if (jj_2_20(2147483647)) {
-            PrimaryExpression();
-            jj_consume_token(DOT);
-          } else {
-            ;
-          }
-          jj_consume_token(SUPER);
-          Arguments();
-          jj_consume_token(SEMICOLON);
-    _ncss++;       Util.debug( "_ncss++" );
-//System.out.println( "\n\nAfter ExplicitConstructorInvocation\n" );
-
-          break;
-        default:
-          jj_la1[78] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("ExplicitConstructorInvocation");
-    }
-  }
-
-  final public void Initializer() throws ParseException {
-    trace_call("Initializer");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      default:
-        jj_la1[79] = jj_gen;
-        ;
-      }
-      Block();
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("Initializer");
-    }
-  }
-
-/*
- * Type, name and expression syntax follows.
- */
-  final public void Type() throws ParseException {
-    trace_call("Type");
-    try {
-      if (jj_2_22(2)) {
-        ReferenceType();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case SHORT:
-          PrimitiveType();
-                  _sName = getToken(0).image;
-          break;
-        default:
-          jj_la1[80] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("Type");
-    }
-  }
-
-/*
-ccl 2008-01-24
-{
-  ( PrimitiveType()
-          {
-                  _sName = getToken(0).image;
-          }
-    | Name()
-    [TypeArguments() ["." Identifier()] ]
-) ( "[" "]" { _sName += "[]"; } )*
-}
-*/
-
-/*
- * Takes special consideration for assert.
- */
-  final public void FieldTypeLookahead() throws ParseException {
-    trace_call("FieldTypeLookahead");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-        PrimitiveType();
-        break;
-      case IDENTIFIER:
-        FieldTypeNameLookahead();
-        break;
-      default:
-        jj_la1[81] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      label_36:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ;
-          break;
-        default:
-          jj_la1[82] = jj_gen;
-          break label_36;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-    } finally {
-      trace_return("FieldTypeLookahead");
-    }
-  }
-
-  final public void PrimitiveType() throws ParseException {
-    trace_call("PrimitiveType");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-        jj_consume_token(BOOLEAN);
-        break;
-      case CHAR:
-        jj_consume_token(CHAR);
-        break;
-      case BYTE:
-        jj_consume_token(BYTE);
-        break;
-      case SHORT:
-        jj_consume_token(SHORT);
-        break;
-      case INT:
-        jj_consume_token(INT);
-        break;
-      case LONG:
-        jj_consume_token(LONG);
-        break;
-      case FLOAT:
-        jj_consume_token(FLOAT);
-        break;
-      case DOUBLE:
-        jj_consume_token(DOUBLE);
-        break;
-      default:
-        jj_la1[83] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("PrimitiveType");
-    }
-  }
-
-  final public void ResultType() throws ParseException {
-    trace_call("ResultType");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case VOID:
-        jj_consume_token(VOID);
-        break;
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-      case IDENTIFIER:
-        Type();
-        break;
-      default:
-        jj_la1[84] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("ResultType");
-    }
-  }
-
-  final public void Name() throws ParseException {
-    trace_call("Name");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ENUM:
-        jj_consume_token(ENUM);
-        break;
-      case ASSERT:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[85] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-                _sName = getToken(0).image;
-                _tmpResultToken = getToken( 0 );
-                Util.debug( "Name._tmpResultToken: " + _tmpResultToken );
-      label_37:
-      while (true) {
-        if (jj_2_23(2)) {
-          ;
-        } else {
-          break label_37;
-        }
-        jj_consume_token(DOT);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ENUM:
-          jj_consume_token(ENUM);
-          break;
-        case ASSERT:
-        case IDENTIFIER:
-          Identifier();
-          break;
-        default:
-          jj_la1[86] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-                _sName += "." + getToken(0).image;
-      }
-    } finally {
-      trace_return("Name");
-    }
-  }
-
-/**
- * Takes special consideration for assert.
- */
-  final public void FieldTypeNameLookahead() throws ParseException {
-    trace_call("FieldTypeNameLookahead");
-    try {
-      jj_consume_token(IDENTIFIER);
-      label_38:
-      while (true) {
-        if (jj_2_24(2)) {
-          ;
-        } else {
-          break label_38;
-        }
-        jj_consume_token(DOT);
-        Identifier();
-      }
-    } finally {
-      trace_return("FieldTypeNameLookahead");
-    }
-  }
-
-  final public void NameList() throws ParseException {
-    trace_call("NameList");
-    try {
-      Name();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeArguments();
-        break;
-      default:
-        jj_la1[87] = jj_gen;
-        ;
-      }
-      label_39:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[88] = jj_gen;
-          break label_39;
-        }
-        jj_consume_token(COMMA);
-        Name();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-          TypeArguments();
-          break;
-        default:
-          jj_la1[89] = jj_gen;
-          ;
-        }
-      }
-    } finally {
-      trace_return("NameList");
-    }
-  }
-
-/*
- * Expression syntax follows.
- */
-  final public void Expression() throws ParseException {
-    trace_call("Expression");
-    try {
-      if (jj_2_25(2147483647)) {
-        Assignment();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case BANG:
-        case TILDE:
-        case INCR:
-        case DECR:
-        case PLUS:
-        case MINUS:
-          ConditionalExpression();
-          break;
-        default:
-          jj_la1[90] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("Expression");
-    }
-  }
-
-  final public void Assignment() throws ParseException {
-    trace_call("Assignment");
-    try {
-      PrimaryExpression();
-      AssignmentOperator();
-      Expression();
-    } finally {
-      trace_return("Assignment");
-    }
-  }
-
-  final public void AssignmentOperator() throws ParseException {
-    trace_call("AssignmentOperator");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        jj_consume_token(ASSIGN);
-        break;
-      case STARASSIGN:
-        jj_consume_token(STARASSIGN);
-        break;
-      case SLASHASSIGN:
-        jj_consume_token(SLASHASSIGN);
-        break;
-      case REMASSIGN:
-        jj_consume_token(REMASSIGN);
-        break;
-      case PLUSASSIGN:
-        jj_consume_token(PLUSASSIGN);
-        break;
-      case MINUSASSIGN:
-        jj_consume_token(MINUSASSIGN);
-        break;
-      case LSHIFTASSIGN:
-        jj_consume_token(LSHIFTASSIGN);
-        break;
-      case RSIGNEDSHIFTASSIGN:
-        jj_consume_token(RSIGNEDSHIFTASSIGN);
-        break;
-      case RUNSIGNEDSHIFTASSIGN:
-        jj_consume_token(RUNSIGNEDSHIFTASSIGN);
-        break;
-      case ANDASSIGN:
-        jj_consume_token(ANDASSIGN);
-        break;
-      case XORASSIGN:
-        jj_consume_token(XORASSIGN);
-        break;
-      case ORASSIGN:
-        jj_consume_token(ORASSIGN);
-        break;
-      default:
-        jj_la1[91] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("AssignmentOperator");
-    }
-  }
-
-  final public void ConditionalExpression() throws ParseException {
-    trace_call("ConditionalExpression");
-    try {
-      ConditionalOrExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case HOOK:
-        jj_consume_token(HOOK);
-        Expression();
-        jj_consume_token(COLON);
-        ConditionalExpression();
-                                                                             _cyc++;
-        break;
-      default:
-        jj_la1[92] = jj_gen;
-        ;
-      }
-    } finally {
-      trace_return("ConditionalExpression");
-    }
-  }
-
-  final public void ConditionalOrExpression() throws ParseException {
-    trace_call("ConditionalOrExpression");
-    try {
-      ConditionalAndExpression();
-      label_40:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_OR:
-          ;
-          break;
-        default:
-          jj_la1[93] = jj_gen;
-          break label_40;
-        }
-        jj_consume_token(SC_OR);
-                                      _cyc++;
-        ConditionalAndExpression();
-      }
-    } finally {
-      trace_return("ConditionalOrExpression");
-    }
-  }
-
-  final public void ConditionalAndExpression() throws ParseException {
-    trace_call("ConditionalAndExpression");
-    try {
-      InclusiveOrExpression();
-      label_41:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_AND:
-          ;
-          break;
-        default:
-          jj_la1[94] = jj_gen;
-          break label_41;
-        }
-        jj_consume_token(SC_AND);
-                                   _cyc++;
-        InclusiveOrExpression();
-      }
-    } finally {
-      trace_return("ConditionalAndExpression");
-    }
-  }
-
-  final public void InclusiveOrExpression() throws ParseException {
-    trace_call("InclusiveOrExpression");
-    try {
-      ExclusiveOrExpression();
-      label_42:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_OR:
-          ;
-          break;
-        default:
-          jj_la1[95] = jj_gen;
-          break label_42;
-        }
-        jj_consume_token(BIT_OR);
-        ExclusiveOrExpression();
-      }
-    } finally {
-      trace_return("InclusiveOrExpression");
-    }
-  }
-
-  final public void ExclusiveOrExpression() throws ParseException {
-    trace_call("ExclusiveOrExpression");
-    try {
-      AndExpression();
-      label_43:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case XOR:
-          ;
-          break;
-        default:
-          jj_la1[96] = jj_gen;
-          break label_43;
-        }
-        jj_consume_token(XOR);
-        AndExpression();
-      }
-    } finally {
-      trace_return("ExclusiveOrExpression");
-    }
-  }
-
-  final public void AndExpression() throws ParseException {
-    trace_call("AndExpression");
-    try {
-      EqualityExpression();
-      label_44:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_AND:
-          ;
-          break;
-        default:
-          jj_la1[97] = jj_gen;
-          break label_44;
-        }
-        jj_consume_token(BIT_AND);
-        EqualityExpression();
-      }
-    } finally {
-      trace_return("AndExpression");
-    }
-  }
-
-  final public void EqualityExpression() throws ParseException {
-    trace_call("EqualityExpression");
-    try {
-      InstanceOfExpression();
-      label_45:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EQ:
-        case NE:
-          ;
-          break;
-        default:
-          jj_la1[98] = jj_gen;
-          break label_45;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EQ:
-          jj_consume_token(EQ);
-          break;
-        case NE:
-          jj_consume_token(NE);
-          break;
-        default:
-          jj_la1[99] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        InstanceOfExpression();
-      }
-    } finally {
-      trace_return("EqualityExpression");
-    }
-  }
-
-  final public void InstanceOfExpression() throws ParseException {
-    trace_call("InstanceOfExpression");
-    try {
-      RelationalExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INSTANCEOF:
-        jj_consume_token(INSTANCEOF);
-        Type();
-        break;
-      default:
-        jj_la1[100] = jj_gen;
-        ;
-      }
-    } finally {
-      trace_return("InstanceOfExpression");
-    }
-  }
-
-  final public void RelationalExpression() throws ParseException {
-    trace_call("RelationalExpression");
-    try {
-      ShiftExpression();
-      label_46:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case GT:
-        case LT:
-        case LE:
-        case GE:
-          ;
-          break;
-        default:
-          jj_la1[101] = jj_gen;
-          break label_46;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-          jj_consume_token(LT);
-          break;
-        case GT:
-          jj_consume_token(GT);
-          break;
-        case LE:
-          jj_consume_token(LE);
-          break;
-        case GE:
-          jj_consume_token(GE);
-          break;
-        default:
-          jj_la1[102] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        ShiftExpression();
-      }
-    } finally {
-      trace_return("RelationalExpression");
-    }
-  }
-
-  final public void ShiftExpression() throws ParseException {
-    trace_call("ShiftExpression");
-    try {
-      AdditiveExpression();
-      label_47:
-      while (true) {
-        if (jj_2_26(3)) {
-          ;
-        } else {
-          break label_47;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LSHIFT:
-          jj_consume_token(LSHIFT);
-          break;
-        case GT:
-          jj_consume_token(GT);
-          jj_consume_token(GT);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case GT:
-            jj_consume_token(GT);
-            break;
-          default:
-            jj_la1[103] = jj_gen;
-            ;
-          }
-          break;
-        default:
-          jj_la1[104] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        AdditiveExpression();
-      }
-    } finally {
-      trace_return("ShiftExpression");
-    }
-  }
-
-  final public void AdditiveExpression() throws ParseException {
-    trace_call("AdditiveExpression");
-    try {
-      MultiplicativeExpression();
-      label_48:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-        case MINUS:
-          ;
-          break;
-        default:
-          jj_la1[105] = jj_gen;
-          break label_48;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-          jj_consume_token(PLUS);
-          break;
-        case MINUS:
-          jj_consume_token(MINUS);
-          break;
-        default:
-          jj_la1[106] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        MultiplicativeExpression();
-      }
-    } finally {
-      trace_return("AdditiveExpression");
-    }
-  }
-
-  final public void MultiplicativeExpression() throws ParseException {
-    trace_call("MultiplicativeExpression");
-    try {
-      UnaryExpression();
-      label_49:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STAR:
-        case SLASH:
-        case REM:
-          ;
-          break;
-        default:
-          jj_la1[107] = jj_gen;
-          break label_49;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STAR:
-          jj_consume_token(STAR);
-          break;
-        case SLASH:
-          jj_consume_token(SLASH);
-          break;
-        case REM:
-          jj_consume_token(REM);
-          break;
-        default:
-          jj_la1[108] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        UnaryExpression();
-      }
-    } finally {
-      trace_return("MultiplicativeExpression");
-    }
-  }
-
-  final public void UnaryExpression() throws ParseException {
-    trace_call("UnaryExpression");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-      case MINUS:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-          jj_consume_token(PLUS);
-          break;
-        case MINUS:
-          jj_consume_token(MINUS);
-          break;
-        default:
-          jj_la1[109] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        UnaryExpression();
-        break;
-      case INCR:
-        PreIncrementExpression();
-        break;
-      case DECR:
-        PreDecrementExpression();
-        break;
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-        UnaryExpressionNotPlusMinus();
-        break;
-      default:
-        jj_la1[110] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("UnaryExpression");
-    }
-  }
-
-  final public void PreIncrementExpression() throws ParseException {
-    trace_call("PreIncrementExpression");
-    try {
-      jj_consume_token(INCR);
-      PrimaryExpression();
-    } finally {
-      trace_return("PreIncrementExpression");
-    }
-  }
-
-  final public void PreDecrementExpression() throws ParseException {
-    trace_call("PreDecrementExpression");
-    try {
-      jj_consume_token(DECR);
-      PrimaryExpression();
-    } finally {
-      trace_return("PreDecrementExpression");
-    }
-  }
-
-  final public void UnaryExpressionNotPlusMinus() throws ParseException {
-    trace_call("UnaryExpressionNotPlusMinus");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BANG:
-      case TILDE:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case TILDE:
-          jj_consume_token(TILDE);
-          break;
-        case BANG:
-          jj_consume_token(BANG);
-          break;
-        default:
-          jj_la1[111] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        UnaryExpression();
-        break;
-      default:
-        jj_la1[112] = jj_gen;
-        if (jj_2_27(2147483647)) {
-          CastExpression();
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ASSERT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case ENUM:
-          case FALSE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NEW:
-          case NULL:
-          case SHORT:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case VOID:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-            PostfixExpression();
-            break;
-          default:
-            jj_la1[113] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    } finally {
-      trace_return("UnaryExpressionNotPlusMinus");
-    }
-  }
-
-// This production is to determine lookahead only.  The LOOKAHEAD specifications
-// below are not used, but they are there just to indicate that we know about
-// this.
-  final public void CastLookahead() throws ParseException {
-    trace_call("CastLookahead");
-    try {
-      if (jj_2_28(2)) {
-        jj_consume_token(LPAREN);
-        PrimitiveType();
-      } else if (jj_2_29(2147483647)) {
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          Type();
-          jj_consume_token(RPAREN);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case TILDE:
-            jj_consume_token(TILDE);
-            break;
-          case BANG:
-            jj_consume_token(BANG);
-            break;
-          case LPAREN:
-            jj_consume_token(LPAREN);
-            break;
-          case ASSERT:
-          case IDENTIFIER:
-            Identifier();
-            break;
-          case THIS:
-            jj_consume_token(THIS);
-            break;
-          case SUPER:
-            jj_consume_token(SUPER);
-            break;
-          case NEW:
-            jj_consume_token(NEW);
-            break;
-          case FALSE:
-          case NULL:
-          case TRUE:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-            Literal();
-            break;
-          default:
-            jj_la1[114] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          jj_la1[115] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("CastLookahead");
-    }
-  }
-
-// To fix bug Test48.java. Clemens [2000-10-03]
-  final public void PostfixLookahead() throws ParseException {
-    trace_call("PostfixLookahead");
-    try {
-      jj_consume_token(LPAREN);
-      Name();
-      label_50:
-      while (true) {
-        if (jj_2_30(2)) {
-          ;
-        } else {
-          break label_50;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-      jj_consume_token(DOT);
-    } finally {
-      trace_return("PostfixLookahead");
-    }
-  }
-
-  final public void PostfixExpression() throws ParseException {
-    trace_call("PostfixExpression");
-    try {
-      PrimaryExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INCR:
-      case DECR:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case INCR:
-          jj_consume_token(INCR);
-          break;
-        case DECR:
-          jj_consume_token(DECR);
-          break;
-        default:
-          jj_la1[116] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_la1[117] = jj_gen;
-        ;
-      }
-    } finally {
-      trace_return("PostfixExpression");
-    }
-  }
-
-  final public void CastExpression() throws ParseException {
-    trace_call("CastExpression");
-    try {
-      if (jj_2_31(2147483647)) {
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(RPAREN);
-        UnaryExpression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          Type();
-          jj_consume_token(RPAREN);
-          UnaryExpressionNotPlusMinus();
-          break;
-        default:
-          jj_la1[118] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("CastExpression");
-    }
-  }
-
-  final public void PrimaryExpression() throws ParseException {
-    trace_call("PrimaryExpression");
-    try {
-      PrimaryPrefix();
-      label_51:
-      while (true) {
-        if (jj_2_32(2)) {
-          ;
-        } else {
-          break label_51;
-        }
-        PrimarySuffix();
-      }
-    } finally {
-      trace_return("PrimaryExpression");
-    }
-  }
-
-  final public void PrimaryPrefix() throws ParseException {
-    trace_call("PrimaryPrefix");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case FALSE:
-      case NULL:
-      case TRUE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-        Literal();
-        break;
-      case THIS:
-        jj_consume_token(THIS);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case DOT:
-          jj_consume_token(DOT);
-          break;
-        default:
-          jj_la1[119] = jj_gen;
-          ;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case IDENTIFIER:
-          Identifier();
-          break;
-        default:
-          jj_la1[120] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[123] = jj_gen;
-        if (jj_2_34(2)) {
-          jj_consume_token(SUPER);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case DOT:
-            jj_consume_token(DOT);
-            break;
-          default:
-            jj_la1[121] = jj_gen;
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ASSERT:
-          case IDENTIFIER:
-            Identifier();
-            break;
-          default:
-            jj_la1[122] = jj_gen;
-            ;
-          }
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LPAREN:
-            jj_consume_token(LPAREN);
-            Expression();
-            jj_consume_token(RPAREN);
-            break;
-          case NEW:
-            AllocationExpression();
-            break;
-          default:
-            jj_la1[124] = jj_gen;
-            if (jj_2_35(2147483647)) {
-              ResultType();
-              jj_consume_token(DOT);
-              jj_consume_token(CLASS);
-            } else {
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case ASSERT:
-              case ENUM:
-              case IDENTIFIER:
-                Name();
-                if (jj_2_33(3)) {
-                  jj_consume_token(DOT);
-                  jj_consume_token(SUPER);
-                  jj_consume_token(DOT);
-                  Identifier();
-                } else {
-                  ;
-                }
-                break;
-              default:
-                jj_la1[125] = jj_gen;
-                jj_consume_token(-1);
-                throw new ParseException();
-              }
-            }
-          }
-        }
-      }
-    } finally {
-      trace_return("PrimaryPrefix");
-    }
-  }
-
-  final public void PrimarySuffix() throws ParseException {
-    trace_call("PrimarySuffix");
-    try {
-      if (jj_2_36(2)) {
-        jj_consume_token(DOT);
-        jj_consume_token(THIS);
-      } else if (jj_2_37(2)) {
-        jj_consume_token(DOT);
-        AllocationExpression();
-      } else if (jj_2_38(3)) {
-        MemberSelector();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          jj_consume_token(LBRACKET);
-          Expression();
-          jj_consume_token(RBRACKET);
-          break;
-        case DOT:
-          jj_consume_token(DOT);
-          Identifier();
-          break;
-        case LPAREN:
-          Arguments();
-          break;
-        default:
-          jj_la1[126] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("PrimarySuffix");
-    }
-  }
-
-  final public void Literal() throws ParseException {
-    trace_call("Literal");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INTEGER_LITERAL:
-        jj_consume_token(INTEGER_LITERAL);
-        break;
-      case FLOATING_POINT_LITERAL:
-        jj_consume_token(FLOATING_POINT_LITERAL);
-        break;
-      case CHARACTER_LITERAL:
-        jj_consume_token(CHARACTER_LITERAL);
-        break;
-      case STRING_LITERAL:
-        jj_consume_token(STRING_LITERAL);
-        break;
-      case FALSE:
-      case TRUE:
-        BooleanLiteral();
-        break;
-      case NULL:
-        NullLiteral();
-        break;
-      default:
-        jj_la1[127] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("Literal");
-    }
-  }
-
-  final public void BooleanLiteral() throws ParseException {
-    trace_call("BooleanLiteral");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case TRUE:
-        jj_consume_token(TRUE);
-        break;
-      case FALSE:
-        jj_consume_token(FALSE);
-        break;
-      default:
-        jj_la1[128] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("BooleanLiteral");
-    }
-  }
-
-  final public void NullLiteral() throws ParseException {
-    trace_call("NullLiteral");
-    try {
-      jj_consume_token(NULL);
-    } finally {
-      trace_return("NullLiteral");
-    }
-  }
-
-  final public void Arguments() throws ParseException {
-    trace_call("Arguments");
-    try {
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        ArgumentList();
-        break;
-      default:
-        jj_la1[129] = jj_gen;
-        ;
-      }
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("Arguments");
-    }
-  }
-
-  final public void ArgumentList() throws ParseException {
-    trace_call("ArgumentList");
-    try {
-      Expression();
-      label_52:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[130] = jj_gen;
-          break label_52;
-        }
-        jj_consume_token(COMMA);
-        Expression();
-      }
-    } finally {
-      trace_return("ArgumentList");
-    }
-  }
-
-  final public void AllocationExpression() throws ParseException {
-    trace_call("AllocationExpression");
-    try {
-        String sOldClass = _sClass;
-        //int oldNcss = _ncss;
-        int oldFunctions = _functions;
-        int oldClasses = _classes;
-        String sName;
-
-        //Added by REYNAUD Sebastien (LOGICA)
-        int oldJavadocs = _javadocs;
-        int oldNcss = _ncss;
-      if (jj_2_39(2)) {
-        jj_consume_token(NEW);
-        PrimitiveType();
-        ArrayDimsAndInits();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case NEW:
-          jj_consume_token(NEW);
-          Name();
-                          sName = _sName;
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LT:
-            TypeArguments();
-            break;
-          default:
-            jj_la1[131] = jj_gen;
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LBRACKET:
-            ArrayDimsAndInits();
-            break;
-          case LPAREN:
-            Arguments();
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case LBRACE:
-                         if (!_sClass.equals("")) {
-                                 _sClass += ".";
-                         }
-                         /*_sClass += sName;*/
-                         //_sClass += sName + "$" + _anonClassCount ;//Removed by REYNAUD Sebastien (LOGICA)
-
-                                //Added by REYNAUD Sebastien (LOGICA)
-                                _sClass += sName;
-                                //
-                         _classLevel ++;
-              ClassBody();
-                                //Added by REYNAUD Sebastien (LOGICA)
-                                ObjectMetric metric = new ObjectMetric();
-                                metric.name = _sPackage + _sClass;
-                                metric.ncss = _ncss - oldNcss;
-                            metric.functions = _functions - oldFunctions;
-                      metric.classes = _classes - oldClasses;
-                        Token lastToken = getToken( 0 );
-                        _vClasses.add( metric );
-                        _pPackageMetric.functions += _functions - oldFunctions;
-                        _pPackageMetric.classes++;
-                                metric.javadocs = _javadocs - oldJavadocs;
-                                //
-                                _classLevel--;
-                                _functions = oldFunctions;
-                                _classes = oldClasses + 1;
-                                _sClass = sOldClass;
-              break;
-            default:
-              jj_la1[132] = jj_gen;
-              ;
-            }
-            break;
-          default:
-            jj_la1[133] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          jj_la1[134] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("AllocationExpression");
-    }
-  }
-
-/*
- * The third LOOKAHEAD specification below is to parse to PrimarySuffix
- * if there is an expression between the "[...]".
- */
-  final public void ArrayDimsAndInits() throws ParseException {
-    trace_call("ArrayDimsAndInits");
-    try {
-      if (jj_2_42(2)) {
-        label_53:
-        while (true) {
-          jj_consume_token(LBRACKET);
-          Expression();
-          jj_consume_token(RBRACKET);
-          if (jj_2_40(2)) {
-            ;
-          } else {
-            break label_53;
-          }
-        }
-        label_54:
-        while (true) {
-          if (jj_2_41(2)) {
-            ;
-          } else {
-            break label_54;
-          }
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-        }
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          label_55:
-          while (true) {
-            jj_consume_token(LBRACKET);
-            jj_consume_token(RBRACKET);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case LBRACKET:
-              ;
-              break;
-            default:
-              jj_la1[135] = jj_gen;
-              break label_55;
-            }
-          }
-          ArrayInitializer();
-          break;
-        default:
-          jj_la1[136] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("ArrayDimsAndInits");
-    }
-  }
-
-/*
- * Statement syntax follows.
- */
-  final public void Statement() throws ParseException {
-    trace_call("Statement");
-    try {
-        _bReturn = false;
-      if (jj_2_43(2)) {
-        LabeledStatement();
-      } else if (jj_2_44(2147483647)) {
-        AssertStatement();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACE:
-          Block();
-          break;
-        case SEMICOLON:
-          EmptyStatement();
-          break;
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case INCR:
-        case DECR:
-          StatementExpression();
-          jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-          break;
-        case SWITCH:
-          SwitchStatement();
-          break;
-        case IF:
-          IfStatement();
-          _cyc++;
-          break;
-        case WHILE:
-          WhileStatement();
-          _cyc++;
-          break;
-        case DO:
-          DoStatement();
-          _cyc++;
-          break;
-        case FOR:
-          ForStatement();
-          _cyc++;
-          break;
-        case BREAK:
-          BreakStatement();
-          break;
-        case CONTINUE:
-          ContinueStatement();
-          break;
-        case RETURN:
-          ReturnStatement();
-          break;
-        case THROW:
-          ThrowStatement();
-          break;
-        case SYNCHRONIZED:
-          SynchronizedStatement();
-          break;
-        case TRY:
-          TryStatement();
-          break;
-        default:
-          jj_la1[137] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("Statement");
-    }
-  }
-
-  final public void LabeledStatement() throws ParseException {
-    trace_call("LabeledStatement");
-    try {
-      Identifier();
-      jj_consume_token(COLON);
-      Statement();
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("LabeledStatement");
-    }
-  }
-
-  final public void AssertStatementLookahead() throws ParseException {
-    trace_call("AssertStatementLookahead");
-    try {
-      jj_consume_token(ASSERT);
-      Expression();
-    } finally {
-      trace_return("AssertStatementLookahead");
-    }
-  }
-
-  final public void AssertStatement() throws ParseException {
-    trace_call("AssertStatement");
-    try {
-      jj_consume_token(ASSERT);
-      Expression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COLON:
-        jj_consume_token(COLON);
-        Expression();
-        break;
-      default:
-        jj_la1[138] = jj_gen;
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-    _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("AssertStatement");
-    }
-  }
-
-  final public void Block() throws ParseException {
-    trace_call("Block");
-    try {
-      jj_consume_token(LBRACE);
-      label_56:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case RETURN:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRANSIENT:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case VOLATILE:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          ;
-          break;
-        default:
-          jj_la1[139] = jj_gen;
-          break label_56;
-        }
-        BlockStatement();
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("Block");
-    }
-  }
-
-  final public void BlockStatement() throws ParseException {
-    trace_call("BlockStatement");
-    try {
-      if (jj_2_45(2147483647)) {
-        LocalVariableDeclaration();
-        jj_consume_token(SEMICOLON);
-                _ncss++;       Util.debug( "_ncss++" );
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case RETURN:
-        case SHORT:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case INCR:
-        case DECR:
-          Statement();
-          break;
-        case ABSTRACT:
-        case CLASS:
-        case FINAL:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case TESTAAAA:
-        case TRANSIENT:
-        case VOLATILE:
-        case AT:
-          UnmodifiedClassDeclaration();
-          break;
-        case INTERFACE:
-          UnmodifiedInterfaceDeclaration();
-          break;
-        default:
-          jj_la1[140] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("BlockStatement");
-    }
-  }
-
-/*void LocalVariableDeclaration() :
-{}
-{
-  [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )*
-}*/
-  final public void LocalVariableDeclaration() throws ParseException {
-    trace_call("LocalVariableDeclaration");
-    try {
-      Modifiers();
-      Type();
-      VariableDeclarator();
-      label_57:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[141] = jj_gen;
-          break label_57;
-        }
-        jj_consume_token(COMMA);
-        VariableDeclarator();
-      }
-    } finally {
-      trace_return("LocalVariableDeclaration");
-    }
-  }
-
-  final public void EmptyStatement() throws ParseException {
-    trace_call("EmptyStatement");
-    try {
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("EmptyStatement");
-    }
-  }
-
-  final public void StatementExpression() throws ParseException {
-    trace_call("StatementExpression");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INCR:
-        PreIncrementExpression();
-        break;
-      case DECR:
-        PreDecrementExpression();
-        break;
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-        PrimaryExpression();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSIGN:
-        case INCR:
-        case DECR:
-        case PLUSASSIGN:
-        case MINUSASSIGN:
-        case STARASSIGN:
-        case SLASHASSIGN:
-        case ANDASSIGN:
-        case ORASSIGN:
-        case XORASSIGN:
-        case REMASSIGN:
-        case LSHIFTASSIGN:
-        case RSIGNEDSHIFTASSIGN:
-        case RUNSIGNEDSHIFTASSIGN:
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case INCR:
-            jj_consume_token(INCR);
-            break;
-          case DECR:
-            jj_consume_token(DECR);
-            break;
-          case ASSIGN:
-          case PLUSASSIGN:
-          case MINUSASSIGN:
-          case STARASSIGN:
-          case SLASHASSIGN:
-          case ANDASSIGN:
-          case ORASSIGN:
-          case XORASSIGN:
-          case REMASSIGN:
-          case LSHIFTASSIGN:
-          case RSIGNEDSHIFTASSIGN:
-          case RUNSIGNEDSHIFTASSIGN:
-            AssignmentOperator();
-            Expression();
-            break;
-          default:
-            jj_la1[142] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          jj_la1[143] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[144] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("StatementExpression");
-    }
-  }
-
-  final public void SwitchStatement() throws ParseException {
-    trace_call("SwitchStatement");
-    try {
-                _localCases = 0;
-      jj_consume_token(SWITCH);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      jj_consume_token(LBRACE);
-      label_58:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CASE:
-        case _DEFAULT:
-          ;
-          break;
-        default:
-          jj_la1[145] = jj_gen;
-          break label_58;
-        }
-        SwitchLabel();
-        label_59:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case ASSERT:
-          case BOOLEAN:
-          case BREAK:
-          case BYTE:
-          case CHAR:
-          case CLASS:
-          case CONTINUE:
-          case DO:
-          case DOUBLE:
-          case ENUM:
-          case FALSE:
-          case FINAL:
-          case FLOAT:
-          case FOR:
-          case IF:
-          case INT:
-          case INTERFACE:
-          case LONG:
-          case NATIVE:
-          case NEW:
-          case NULL:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case RETURN:
-          case SHORT:
-          case STATIC:
-          case TESTAAAA:
-          case SUPER:
-          case SWITCH:
-          case SYNCHRONIZED:
-          case THIS:
-          case THROW:
-          case TRANSIENT:
-          case TRUE:
-          case TRY:
-          case VOID:
-          case VOLATILE:
-          case WHILE:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case LBRACE:
-          case SEMICOLON:
-          case AT:
-          case INCR:
-          case DECR:
-            ;
-            break;
-          default:
-            jj_la1[146] = jj_gen;
-            break label_59;
-          }
-          BlockStatement();
-        }
-      }
-      jj_consume_token(RBRACE);
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("SwitchStatement");
-    }
-  }
-
-  final public void SwitchLabel() throws ParseException {
-    trace_call("SwitchLabel");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CASE:
-        jj_consume_token(CASE);
-        Expression();
-        jj_consume_token(COLON);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _localCases++;
-                _cyc++;
-        break;
-      case _DEFAULT:
-        jj_consume_token(_DEFAULT);
-        jj_consume_token(COLON);
-                _ncss++;       Util.debug( "_ncss++" );
-        break;
-      default:
-        jj_la1[147] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("SwitchLabel");
-    }
-  }
-
-  final public void IfStatement() throws ParseException {
-    trace_call("IfStatement");
-    try {
-      jj_consume_token(IF);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      Statement();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ELSE:
-        jj_consume_token(ELSE);
-                                                                _ncss++;       Util.debug( "_ncss++" );
-        Statement();
-        break;
-      default:
-        jj_la1[148] = jj_gen;
-        ;
-      }
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("IfStatement");
-    }
-  }
-
-  final public void WhileStatement() throws ParseException {
-    trace_call("WhileStatement");
-    try {
-      jj_consume_token(WHILE);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      Statement();
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("WhileStatement");
-    }
-  }
-
-  final public void DoStatement() throws ParseException {
-    trace_call("DoStatement");
-    try {
-      jj_consume_token(DO);
-      Statement();
-      jj_consume_token(WHILE);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("DoStatement");
-    }
-  }
-
-  final public void ForStatement() throws ParseException {
-    trace_call("ForStatement");
-    try {
-      jj_consume_token(FOR);
-      jj_consume_token(LPAREN);
-      if (jj_2_46(2147483647)) {
-        Modifiers();
-        Type();
-        jj_consume_token(IDENTIFIER);
-        jj_consume_token(COLON);
-        Expression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SUPER:
-        case SYNCHRONIZED:
-        case THIS:
-        case TRANSIENT:
-        case TRUE:
-        case VOID:
-        case VOLATILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case ASSERT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case ENUM:
-          case FALSE:
-          case FINAL:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NATIVE:
-          case NEW:
-          case NULL:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case SHORT:
-          case STATIC:
-          case TESTAAAA:
-          case SUPER:
-          case SYNCHRONIZED:
-          case THIS:
-          case TRANSIENT:
-          case TRUE:
-          case VOID:
-          case VOLATILE:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case AT:
-          case INCR:
-          case DECR:
-            ForInit();
-            break;
-          default:
-            jj_la1[149] = jj_gen;
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ASSERT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case ENUM:
-          case FALSE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NEW:
-          case NULL:
-          case SHORT:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case VOID:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case BANG:
-          case TILDE:
-          case INCR:
-          case DECR:
-          case PLUS:
-          case MINUS:
-            Expression();
-            break;
-          default:
-            jj_la1[150] = jj_gen;
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ASSERT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case ENUM:
-          case FALSE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NEW:
-          case NULL:
-          case SHORT:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case VOID:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case INCR:
-          case DECR:
-            ForUpdate();
-            break;
-          default:
-            jj_la1[151] = jj_gen;
-            ;
-          }
-          break;
-        default:
-          jj_la1[152] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      jj_consume_token(RPAREN);
-      Statement();
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("ForStatement");
-    }
-  }
-
-  final public void ForInit() throws ParseException {
-    trace_call("ForInit");
-    try {
-      if (jj_2_47(2147483647)) {
-        LocalVariableDeclaration();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case ENUM:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case INCR:
-        case DECR:
-          StatementExpressionList();
-          break;
-        default:
-          jj_la1[153] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("ForInit");
-    }
-  }
-
-  final public void StatementExpressionList() throws ParseException {
-    trace_call("StatementExpressionList");
-    try {
-      StatementExpression();
-      label_60:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[154] = jj_gen;
-          break label_60;
-        }
-        jj_consume_token(COMMA);
-        StatementExpression();
-      }
-    } finally {
-      trace_return("StatementExpressionList");
-    }
-  }
-
-  final public void ForUpdate() throws ParseException {
-    trace_call("ForUpdate");
-    try {
-      StatementExpressionList();
-    } finally {
-      trace_return("ForUpdate");
-    }
-  }
-
-  final public void BreakStatement() throws ParseException {
-    trace_call("BreakStatement");
-    try {
-      jj_consume_token(BREAK);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[155] = jj_gen;
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("BreakStatement");
-    }
-  }
-
-  final public void ContinueStatement() throws ParseException {
-    trace_call("ContinueStatement");
-    try {
-      jj_consume_token(CONTINUE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[156] = jj_gen;
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("ContinueStatement");
-    }
-  }
-
-  final public void ReturnStatement() throws ParseException {
-    trace_call("ReturnStatement");
-    try {
-      jj_consume_token(RETURN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        Expression();
-        break;
-      default:
-        jj_la1[157] = jj_gen;
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _cyc++;
-                _bReturn = true;
-    } finally {
-      trace_return("ReturnStatement");
-    }
-  }
-
-  final public void ThrowStatement() throws ParseException {
-    trace_call("ThrowStatement");
-    try {
-      jj_consume_token(THROW);
-      Expression();
-      jj_consume_token(SEMICOLON);
-                _ncss++;
-                Util.debug( "_ncss++" );
-                _cyc++;
-    } finally {
-      trace_return("ThrowStatement");
-    }
-  }
-
-  final public void SynchronizedStatement() throws ParseException {
-    trace_call("SynchronizedStatement");
-    try {
-      jj_consume_token(SYNCHRONIZED);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      Block();
-          _ncss++;       Util.debug( "_ncss++" );
-    } finally {
-      trace_return("SynchronizedStatement");
-    }
-  }
-
-  final public void TryStatement() throws ParseException {
-    trace_call("TryStatement");
-    try {
-      jj_consume_token(TRY);
-      Block();
-      label_61:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CATCH:
-          ;
-          break;
-        default:
-          jj_la1[158] = jj_gen;
-          break label_61;
-        }
-        jj_consume_token(CATCH);
-        jj_consume_token(LPAREN);
-        FormalParameter();
-        jj_consume_token(RPAREN);
-        Block();
-                                                _ncss++;       Util.debug( "_ncss++" ); _cyc++;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case FINALLY:
-        jj_consume_token(FINALLY);
-        Block();
-                        _ncss++;       Util.debug( "_ncss++" );
-        break;
-      default:
-        jj_la1[159] = jj_gen;
-        ;
-      }
-    } finally {
-      trace_return("TryStatement");
-    }
-  }
-
-  final public void Identifier() throws ParseException {
-    trace_call("Identifier");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IDENTIFIER:
-        jj_consume_token(IDENTIFIER);
-        break;
-      case ASSERT:
-        jj_consume_token(ASSERT);
-        break;
-      default:
-        jj_la1[160] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("Identifier");
-    }
-  }
-
-/* Annotation syntax follows. */
-  final public void Annotation() throws ParseException {
-    trace_call("Annotation");
-    try {
-      if (jj_2_48(2147483647)) {
-        NormalAnnotation();
-      } else if (jj_2_49(2147483647)) {
-        SingleMemberAnnotation();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          MarkerAnnotation();
-          break;
-        default:
-          jj_la1[161] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("Annotation");
-    }
-  }
-
-  final public void NormalAnnotation() throws ParseException {
-    trace_call("NormalAnnotation");
-    try {
-      jj_consume_token(AT);
-      Name();
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IDENTIFIER:
-        MemberValuePairs();
-        break;
-      default:
-        jj_la1[162] = jj_gen;
-        ;
-      }
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("NormalAnnotation");
-    }
-  }
-
-  final public void MarkerAnnotation() throws ParseException {
-    trace_call("MarkerAnnotation");
-    try {
-      jj_consume_token(AT);
-      Name();
-    } finally {
-      trace_return("MarkerAnnotation");
-    }
-  }
-
-  final public void SingleMemberAnnotation() throws ParseException {
-    trace_call("SingleMemberAnnotation");
-    try {
-      jj_consume_token(AT);
-      Name();
-      jj_consume_token(LPAREN);
-      MemberValue();
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("SingleMemberAnnotation");
-    }
-  }
-
-  final public void MemberValuePairs() throws ParseException {
-    trace_call("MemberValuePairs");
-    try {
-      MemberValuePair();
-      label_62:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[163] = jj_gen;
-          break label_62;
-        }
-        jj_consume_token(COMMA);
-        MemberValuePair();
-      }
-    } finally {
-      trace_return("MemberValuePairs");
-    }
-  }
-
-  final public void MemberValuePair() throws ParseException {
-    trace_call("MemberValuePair");
-    try {
-      jj_consume_token(IDENTIFIER);
-      jj_consume_token(ASSIGN);
-      MemberValue();
-    } finally {
-      trace_return("MemberValuePair");
-    }
-  }
-
-  final public void MemberValue() throws ParseException {
-    trace_call("MemberValue");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        Annotation();
-        break;
-      case LBRACE:
-        MemberValueArrayInitializer();
-        break;
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        ConditionalExpression();
-        break;
-      default:
-        jj_la1[164] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("MemberValue");
-    }
-  }
-
-  final public void MemberValueArrayInitializer() throws ParseException {
-    trace_call("MemberValueArrayInitializer");
-    try {
-      jj_consume_token(LBRACE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case ENUM:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case AT:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        MemberValue();
-        break;
-      default:
-        jj_la1[165] = jj_gen;
-        ;
-      }
-      label_63:
-      while (true) {
-        if (jj_2_50(2)) {
-          ;
-        } else {
-          break label_63;
-        }
-        jj_consume_token(COMMA);
-        MemberValue();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        jj_consume_token(COMMA);
-        break;
-      default:
-        jj_la1[166] = jj_gen;
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("MemberValueArrayInitializer");
-    }
-  }
-
-/*
- =================================================
- Java 1.5 stuff starts here
- =================================================
-*/
-
-/* Annotation Types. */
-
-//Added by REYNAUD Sebastien (LOGICA)
-  final public void CreationAnnotation() throws ParseException {
-    trace_call("CreationAnnotation");
-    try {
-      jj_consume_token(AT);
-      jj_consume_token(INTERFACE);
-      jj_consume_token(IDENTIFIER);
-      jj_consume_token(LBRACE);
-      label_64:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case IDENTIFIER:
-        case SEMICOLON:
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[167] = jj_gen;
-          break label_64;
-        }
-        AnnotationTypeMemberDeclaration();
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("CreationAnnotation");
-    }
-  }
-
-//
-  final public void AnnotationTypeDeclaration(int modifiers) throws ParseException {
-    trace_call("AnnotationTypeDeclaration");
-    try {
-      jj_consume_token(AT);
-      jj_consume_token(INTERFACE);
-      jj_consume_token(IDENTIFIER);
-      AnnotationTypeBody();
-    } finally {
-      trace_return("AnnotationTypeDeclaration");
-    }
-  }
-
-  final public void AnnotationTypeBody() throws ParseException {
-    trace_call("AnnotationTypeBody");
-    try {
-      jj_consume_token(LBRACE);
-       _ncss++;       Util.debug( "_ncss++" );
-      label_65:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case IDENTIFIER:
-        case SEMICOLON:
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[168] = jj_gen;
-          break label_65;
-        }
-        AnnotationTypeMemberDeclaration();
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("AnnotationTypeBody");
-    }
-  }
-
-  final public void AnnotationTypeMemberDeclaration() throws ParseException {
-    trace_call("AnnotationTypeMemberDeclaration");
-    try {
-   int modifiers;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-        modifiers = Modifiers();
-        if (jj_2_51(2147483647)) {
-          Type();
-          jj_consume_token(IDENTIFIER);
-          jj_consume_token(LPAREN);
-          jj_consume_token(RPAREN);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case _DEFAULT:
-            DefaultValue();
-            break;
-          default:
-            jj_la1[169] = jj_gen;
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-            _ncss++;
-            Util.debug( "_ncss++" );
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case CLASS:
-          case INTERFACE:
-            ClassOrInterfaceDeclaration(modifiers);
-            break;
-          case ENUM:
-            EnumDeclaration(modifiers);
-            break;
-          case AT:
-            AnnotationTypeDeclaration(modifiers);
-            break;
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case SHORT:
-          case IDENTIFIER:
-            FieldDeclaration15(modifiers);
-            break;
-          default:
-            jj_la1[170] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-        break;
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-            _ncss++;
-            Util.debug( "_ncss++" );
-        break;
-      default:
-        jj_la1[171] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("AnnotationTypeMemberDeclaration");
-    }
-  }
-
-  final public void DefaultValue() throws ParseException {
-    trace_call("DefaultValue");
-    try {
-      jj_consume_token(_DEFAULT);
-      MemberValue();
-    } finally {
-      trace_return("DefaultValue");
-    }
-  }
-
-/*
- * Modifiers. We match all modifiers in a single rule to reduce the chances of
- * syntax errors for simple modifier mistakes. It will also enable us to give
- * better error messages.
- */
-  final public int Modifiers() throws ParseException {
-    trace_call("Modifiers");
-    try {
-   int modifiers = 0;
-   _tmpToken = null;
-      label_66:
-      while (true) {
-        if (jj_2_52(2)) {
-          ;
-        } else {
-          break label_66;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-              modifiers |= ModifierSet.PUBLIC;
-      if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case STATIC:
-          jj_consume_token(STATIC);
-              modifiers |= ModifierSet.STATIC;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-                 modifiers |= ModifierSet.PROTECTED;       if ( _tmpToken == null ) {
-       _tmpToken = getToken( 0 );
-      }
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-               modifiers |= ModifierSet.PRIVATE;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-             modifiers |= ModifierSet.FINAL;       if ( _tmpToken == null ) {
-       _tmpToken = getToken( 0 );
-      }
-          break;
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-                modifiers |= ModifierSet.ABSTRACT;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case SYNCHRONIZED:
-          jj_consume_token(SYNCHRONIZED);
-                    modifiers |= ModifierSet.SYNCHRONIZED;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case NATIVE:
-          jj_consume_token(NATIVE);
-              modifiers |= ModifierSet.NATIVE;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case TRANSIENT:
-          jj_consume_token(TRANSIENT);
-                 modifiers |= ModifierSet.TRANSIENT;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case VOLATILE:
-          jj_consume_token(VOLATILE);
-                modifiers |= ModifierSet.VOLATILE;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case TESTAAAA:
-          jj_consume_token(TESTAAAA);
-                modifiers |= ModifierSet.STRICTFP;       if ( _tmpToken == null ) {
-          _tmpToken = getToken( 0 );
-      }
-          break;
-        case AT:
-          Annotation();
-          break;
-        default:
-          jj_la1[172] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    {if (true) return modifiers;}
-    throw new Error("Missing return statement in function");
-    } finally {
-      trace_return("Modifiers");
-    }
-  }
-
-  final public void ClassOrInterfaceDeclaration(int modifiers) throws ParseException {
-    trace_call("ClassOrInterfaceDeclaration");
-    try {
-   boolean isInterface = false;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CLASS:
-        jj_consume_token(CLASS);
-        break;
-      case INTERFACE:
-        jj_consume_token(INTERFACE);
-                            isInterface = true;
-        break;
-      default:
-        jj_la1[173] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      jj_consume_token(IDENTIFIER);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        jj_la1[174] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        ExtendsList(isInterface);
-        break;
-      default:
-        jj_la1[175] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPLEMENTS:
-        ImplementsList(isInterface);
-        break;
-      default:
-        jj_la1[176] = jj_gen;
-        ;
-      }
-      ClassOrInterfaceBody(isInterface);
-    } finally {
-      trace_return("ClassOrInterfaceDeclaration");
-    }
-  }
-
-  final public void EnumDeclaration(int modifiers) throws ParseException {
-    trace_call("EnumDeclaration");
-    try {
-        String sOldClass = _sClass;
-        int oldClasses = _classes;
-        int oldNcss = _ncss;
-        int oldFunctions = _functions;
-
-        // Chris Povirk
-        int oldSingle;
-        int oldMulti;
-      Util.debug( "EnumDeclaration().START" );
-      jj_consume_token(ENUM);
-      jj_consume_token(IDENTIFIER);
-                if (!_sClass.equals("")) {
-                        _sClass += ".";
-                }
-                _sClass += getToken(0).image;
-                _classLevel ++;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPLEMENTS:
-        ImplementsList(false);
-        break;
-      default:
-        jj_la1[177] = jj_gen;
-        ;
-      }
-        // Chris Povirk
-      oldSingle = JavaParserDebugTokenManager._iSingleComments;
-      oldMulti = JavaParserDebugTokenManager._iMultiComments;
-      EnumBody();
-             _classLevel--;
-             if (_classLevel == 0) {
-                 //_topLevelClasses++;
-                 ObjectMetric metric = new ObjectMetric();
-                 metric.name = _sPackage + _sClass;
-                 metric.ncss = _ncss - oldNcss;
-                 metric.functions = _functions - oldFunctions;
-                 metric.classes = _classes - oldClasses;
-                 Token lastToken = getToken( 0 );
-                 //metric.add( new Integer( lastToken.endLine ) );
-                 //metric.add( new Integer( lastToken.endColumn ) );
-                 metric.javadocs = _javadocs;
-
-                 // Chris Povirk
-                 metric.javadocsLn = _jvdcLines;
-                 metric.singleLn = JavaParserDebugTokenManager._iSingleComments - oldSingle;
-                 metric.multiLn = JavaParserDebugTokenManager._iMultiComments - oldMulti;
-
-                 _vClasses.add(metric);
-                 _pPackageMetric.functions += _functions - oldFunctions;
-                 _pPackageMetric.classes++;
-
-                 // added by SMS
-                 _pPackageMetric.javadocs += _javadocs;
-                 //_pPackageMetric.javadocsLn += JavaParserDebugTokenManager._iFormalComments - oldFormal;
-                 //_pPackageMetric.singleLn += JavaParserDebugTokenManager._iSingleComments - oldSingle;
-                 //_pPackageMetric.multiLn += Manager._iMultiComments - oldMulti;
-                 //
-             }
-             _functions = oldFunctions;
-             _classes = oldClasses + 1;
-             _sClass = sOldClass;
-    } finally {
-      trace_return("EnumDeclaration");
-    }
-  }
-
-  final public void TypeParameters() throws ParseException {
-    trace_call("TypeParameters");
-    try {
-      jj_consume_token(LT);
-      TypeParameter();
-      label_67:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[178] = jj_gen;
-          break label_67;
-        }
-        jj_consume_token(COMMA);
-        TypeParameter();
-      }
-      jj_consume_token(GT);
-    } finally {
-      trace_return("TypeParameters");
-    }
-  }
-
-  final public void ExtendsList(boolean isInterface) throws ParseException {
-    trace_call("ExtendsList");
-    try {
-   boolean extendsMoreThanOne = false;
-      jj_consume_token(EXTENDS);
-      ClassOrInterfaceType();
-      label_68:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[179] = jj_gen;
-          break label_68;
-        }
-        jj_consume_token(COMMA);
-        ClassOrInterfaceType();
-                                  extendsMoreThanOne = true;
-      }
-      if (extendsMoreThanOne && !isInterface)
-         {if (true) throw new ParseException("A class cannot extend more than one other class");}
-    } finally {
-      trace_return("ExtendsList");
-    }
-  }
-
-  final public void ImplementsList(boolean isInterface) throws ParseException {
-    trace_call("ImplementsList");
-    try {
-      jj_consume_token(IMPLEMENTS);
-      ClassOrInterfaceType();
-      label_69:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[180] = jj_gen;
-          break label_69;
-        }
-        jj_consume_token(COMMA);
-        ClassOrInterfaceType();
-      }
-      if (isInterface)
-         {if (true) throw new ParseException("An interface cannot implement other interfaces");}
-    } finally {
-      trace_return("ImplementsList");
-    }
-  }
-
-  final public void ClassOrInterfaceBody(boolean isInterface) throws ParseException {
-    trace_call("ClassOrInterfaceBody");
-    try {
-      jj_consume_token(LBRACE);
-           _ncss++; Util.debug( "ClassOrInterfaceBody()._ncss++" );
-      label_70:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case LT:
-          ;
-          break;
-        default:
-          jj_la1[181] = jj_gen;
-          break label_70;
-        }
-        ClassOrInterfaceBodyDeclaration(isInterface);
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("ClassOrInterfaceBody");
-    }
-  }
-
-  final public void EnumBody() throws ParseException {
-    trace_call("EnumBody");
-    try {
-      jj_consume_token(LBRACE);
-               _ncss++;
-               Util.debug( "_ncss++" );
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-        EnumConstant();
-        label_71:
-        while (true) {
-          if (jj_2_53(2)) {
-            ;
-          } else {
-            break label_71;
-          }
-          jj_consume_token(COMMA);
-          EnumConstant();
-        }
-        break;
-      default:
-        jj_la1[182] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        jj_consume_token(COMMA);
-        break;
-      default:
-        jj_la1[183] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        label_72:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case ASSERT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case CLASS:
-          case DOUBLE:
-          case ENUM:
-          case FINAL:
-          case FLOAT:
-          case INT:
-          case INTERFACE:
-          case LONG:
-          case NATIVE:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case SHORT:
-          case STATIC:
-          case TESTAAAA:
-          case SYNCHRONIZED:
-          case TRANSIENT:
-          case VOID:
-          case VOLATILE:
-          case IDENTIFIER:
-          case LBRACE:
-          case SEMICOLON:
-          case AT:
-          case LT:
-            ;
-            break;
-          default:
-            jj_la1[184] = jj_gen;
-            break label_72;
-          }
-          ClassOrInterfaceBodyDeclaration(false);
-        }
-        break;
-      default:
-        jj_la1[185] = jj_gen;
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("EnumBody");
-    }
-  }
-
-  final public void TypeParameter() throws ParseException {
-    trace_call("TypeParameter");
-    try {
-      jj_consume_token(IDENTIFIER);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        TypeBound();
-        break;
-      default:
-        jj_la1[186] = jj_gen;
-        ;
-      }
-    } finally {
-      trace_return("TypeParameter");
-    }
-  }
-
-  final public void ClassOrInterfaceType() throws ParseException {
-    trace_call("ClassOrInterfaceType");
-    try {
-      jj_consume_token(IDENTIFIER);
-                _sName = getToken(0).image;
-                if ( _tmpResultToken == null )
-                {
-                  _tmpResultToken = getToken( 0 );
-                  Util.debug( "ClassOrInterfaceType._tmpResultToken: " + _tmpResultToken );
-                }
-      if (jj_2_54(4)) {
-        TypeArguments();
-      } else {
-        ;
-      }
-      label_73:
-      while (true) {
-        if (jj_2_55(2)) {
-          ;
-        } else {
-          break label_73;
-        }
-        jj_consume_token(DOT);
-        jj_consume_token(IDENTIFIER);
-                _sName += "." + getToken(0).image;
-        if (jj_2_56(2)) {
-          TypeArguments();
-        } else {
-          ;
-        }
-      }
-    } finally {
-      trace_return("ClassOrInterfaceType");
-    }
-  }
-
-  final public void ClassOrInterfaceBodyDeclaration(boolean isInterface) throws ParseException {
-    trace_call("ClassOrInterfaceBodyDeclaration");
-    try {
-   //boolean isNestedInterface = false;
-   int modifiers;
-      if (jj_2_59(2)) {
-        Initializer();
-     if (isInterface)
-        {if (true) throw new ParseException("An interface cannot have initializers");}
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case TESTAAAA:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case AT:
-        case LT:
-          modifiers = Modifiers();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case CLASS:
-          case INTERFACE:
-            ClassOrInterfaceDeclaration(modifiers);
-            break;
-          case ENUM:
-            EnumDeclaration(modifiers);
-            break;
-          default:
-            jj_la1[187] = jj_gen;
-            if (jj_2_57(2147483647)) {
-              ConstructorDeclaration();
-            } else if (jj_2_58(2147483647)) {
-              FieldDeclaration15(modifiers);
-            } else {
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case ABSTRACT:
-              case BOOLEAN:
-              case BYTE:
-              case CHAR:
-              case DOUBLE:
-              case FINAL:
-              case FLOAT:
-              case INT:
-              case LONG:
-              case NATIVE:
-              case PRIVATE:
-              case PROTECTED:
-              case PUBLIC:
-              case SHORT:
-              case STATIC:
-              case TESTAAAA:
-              case SYNCHRONIZED:
-              case VOID:
-              case IDENTIFIER:
-              case AT:
-              case LT:
-                MethodDeclaration15(modifiers);
-                break;
-              default:
-                jj_la1[188] = jj_gen;
-                jj_consume_token(-1);
-                throw new ParseException();
-              }
-            }
-          }
-          break;
-        case SEMICOLON:
-          jj_consume_token(SEMICOLON);
-          break;
-        default:
-          jj_la1[189] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("ClassOrInterfaceBodyDeclaration");
-    }
-  }
-
-  final public void EnumConstant() throws ParseException {
-    trace_call("EnumConstant");
-    try {
-      Modifiers();
-      jj_consume_token(IDENTIFIER);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        Arguments();
-        break;
-      default:
-        jj_la1[190] = jj_gen;
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACE:
-        ClassOrInterfaceBody(false);
-        break;
-      default:
-        jj_la1[191] = jj_gen;
-        ;
-      }
-    } finally {
-      trace_return("EnumConstant");
-    }
-  }
-
-  final public void TypeBound() throws ParseException {
-    trace_call("TypeBound");
-    try {
-      jj_consume_token(EXTENDS);
-      ClassOrInterfaceType();
-      label_74:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_AND:
-          ;
-          break;
-        default:
-          jj_la1[192] = jj_gen;
-          break label_74;
-        }
-        jj_consume_token(BIT_AND);
-        ClassOrInterfaceType();
-      }
-    } finally {
-      trace_return("TypeBound");
-    }
-  }
-
-  final public void TypeArguments() throws ParseException {
-    trace_call("TypeArguments");
-    try {
-      jj_consume_token(LT);
-      TypeArgument();
-      label_75:
-      while (true) {
-        if (jj_2_60(2)) {
-          ;
-        } else {
-          break label_75;
-        }
-        jj_consume_token(COMMA);
-        TypeArgument();
-      }
-      jj_consume_token(GT);
-    } finally {
-      trace_return("TypeArguments");
-    }
-  }
-
-  final public void TypeArgument() throws ParseException {
-    trace_call("TypeArgument");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-      case IDENTIFIER:
-        ReferenceType();
-        break;
-      case HOOK:
-        jj_consume_token(HOOK);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EXTENDS:
-        case SUPER:
-          WildcardBounds();
-          break;
-        default:
-          jj_la1[193] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[194] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("TypeArgument");
-    }
-  }
-
-  final public void ReferenceType() throws ParseException {
-    trace_call("ReferenceType");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-        PrimitiveType();
-        label_76:
-        while (true) {
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-                                            _sName += "[]";
-          if (jj_2_61(2)) {
-            ;
-          } else {
-            break label_76;
-          }
-        }
-        break;
-      case IDENTIFIER:
-        ClassOrInterfaceType();
-        label_77:
-        while (true) {
-          if (jj_2_62(2)) {
-            ;
-          } else {
-            break label_77;
-          }
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-                                                       _sName += "[]";
-        }
-        break;
-      default:
-        jj_la1[195] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("ReferenceType");
-    }
-  }
-
-  final public void WildcardBounds() throws ParseException {
-    trace_call("WildcardBounds");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        jj_consume_token(EXTENDS);
-        ReferenceType();
-        break;
-      case SUPER:
-        jj_consume_token(SUPER);
-        ReferenceType();
-        break;
-      default:
-        jj_la1[196] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("WildcardBounds");
-    }
-  }
-
-  final public void FieldDeclaration15(int modifiers) throws ParseException {
-    trace_call("FieldDeclaration15");
-    try {
-      Type();
-      VariableDeclarator();
-      label_78:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[197] = jj_gen;
-          break label_78;
-        }
-        jj_consume_token(COMMA);
-        VariableDeclarator();
-      }
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("FieldDeclaration15");
-    }
-  }
-
-  final public void MethodDeclaration15(int modifiers) throws ParseException {
-    trace_call("MethodDeclaration15");
-    try {
-      MethodDeclaration();
-    } finally {
-      trace_return("MethodDeclaration15");
-    }
-  }
-
-  final public void MethodDeclarator15() throws ParseException {
-    trace_call("MethodDeclarator15");
-    try {
-      jj_consume_token(IDENTIFIER);
-      FormalParameters();
-      label_79:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ;
-          break;
-        default:
-          jj_la1[198] = jj_gen;
-          break label_79;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-    } finally {
-      trace_return("MethodDeclarator15");
-    }
-  }
-
-  final public void FormalParameters15() throws ParseException {
-    trace_call("FormalParameters15");
-    try {
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case TESTAAAA:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-        FormalParameter15();
-        label_80:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case COMMA:
-            ;
-            break;
-          default:
-            jj_la1[199] = jj_gen;
-            break label_80;
-          }
-          jj_consume_token(COMMA);
-          FormalParameter15();
-        }
-        break;
-      default:
-        jj_la1[200] = jj_gen;
-        ;
-      }
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("FormalParameters15");
-    }
-  }
-
-  final public void FormalParameter15() throws ParseException {
-    trace_call("FormalParameter15");
-    try {
-      Modifiers();
-      Type();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ELLIPSIS:
-        jj_consume_token(ELLIPSIS);
-        break;
-      default:
-        jj_la1[201] = jj_gen;
-        ;
-      }
-      VariableDeclaratorId();
-    } finally {
-      trace_return("FormalParameter15");
-    }
-  }
-
-  final public void MemberSelector() throws ParseException {
-    trace_call("MemberSelector");
-    try {
-      jj_consume_token(DOT);
-      TypeArguments();
-      jj_consume_token(IDENTIFIER);
-    } finally {
-      trace_return("MemberSelector");
-    }
-  }
-
-  private boolean jj_2_1(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(0, xla); }
-  }
-
-  private boolean jj_2_2(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_2(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(1, xla); }
-  }
-
-  private boolean jj_2_3(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_3(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(2, xla); }
-  }
-
-  private boolean jj_2_4(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_4(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(3, xla); }
-  }
-
-  private boolean jj_2_5(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_5(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(4, xla); }
-  }
-
-  private boolean jj_2_6(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_6(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(5, xla); }
-  }
-
-  private boolean jj_2_7(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_7(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(6, xla); }
-  }
-
-  private boolean jj_2_8(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_8(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(7, xla); }
-  }
-
-  private boolean jj_2_9(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_9(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(8, xla); }
-  }
-
-  private boolean jj_2_10(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_10(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(9, xla); }
-  }
-
-  private boolean jj_2_11(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_11(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(10, xla); }
-  }
-
-  private boolean jj_2_12(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_12(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(11, xla); }
-  }
-
-  private boolean jj_2_13(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_13(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(12, xla); }
-  }
-
-  private boolean jj_2_14(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_14(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(13, xla); }
-  }
-
-  private boolean jj_2_15(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_15(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(14, xla); }
-  }
-
-  private boolean jj_2_16(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_16(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(15, xla); }
-  }
-
-  private boolean jj_2_17(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_17(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(16, xla); }
-  }
-
-  private boolean jj_2_18(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_18(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(17, xla); }
-  }
-
-  private boolean jj_2_19(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_19(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(18, xla); }
-  }
-
-  private boolean jj_2_20(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_20(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(19, xla); }
-  }
-
-  private boolean jj_2_21(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_21(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(20, xla); }
-  }
-
-  private boolean jj_2_22(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_22(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(21, xla); }
-  }
-
-  private boolean jj_2_23(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_23(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(22, xla); }
-  }
-
-  private boolean jj_2_24(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_24(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(23, xla); }
-  }
-
-  private boolean jj_2_25(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_25(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(24, xla); }
-  }
-
-  private boolean jj_2_26(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_26(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(25, xla); }
-  }
-
-  private boolean jj_2_27(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_27(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(26, xla); }
-  }
-
-  private boolean jj_2_28(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_28(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(27, xla); }
-  }
-
-  private boolean jj_2_29(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_29(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(28, xla); }
-  }
-
-  private boolean jj_2_30(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_30(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(29, xla); }
-  }
-
-  private boolean jj_2_31(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_31(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(30, xla); }
-  }
-
-  private boolean jj_2_32(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_32(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(31, xla); }
-  }
-
-  private boolean jj_2_33(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_33(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(32, xla); }
-  }
-
-  private boolean jj_2_34(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_34(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(33, xla); }
-  }
-
-  private boolean jj_2_35(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_35(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(34, xla); }
-  }
-
-  private boolean jj_2_36(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_36(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(35, xla); }
-  }
-
-  private boolean jj_2_37(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_37(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(36, xla); }
-  }
-
-  private boolean jj_2_38(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_38(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(37, xla); }
-  }
-
-  private boolean jj_2_39(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_39(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(38, xla); }
-  }
-
-  private boolean jj_2_40(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_40(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(39, xla); }
-  }
-
-  private boolean jj_2_41(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_41(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(40, xla); }
-  }
-
-  private boolean jj_2_42(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_42(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(41, xla); }
-  }
-
-  private boolean jj_2_43(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_43(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(42, xla); }
-  }
-
-  private boolean jj_2_44(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_44(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(43, xla); }
-  }
-
-  private boolean jj_2_45(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_45(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(44, xla); }
-  }
-
-  private boolean jj_2_46(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_46(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(45, xla); }
-  }
-
-  private boolean jj_2_47(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_47(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(46, xla); }
-  }
-
-  private boolean jj_2_48(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_48(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(47, xla); }
-  }
-
-  private boolean jj_2_49(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_49(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(48, xla); }
-  }
-
-  private boolean jj_2_50(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_50(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(49, xla); }
-  }
-
-  private boolean jj_2_51(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_51(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(50, xla); }
-  }
-
-  private boolean jj_2_52(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_52(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(51, xla); }
-  }
-
-  private boolean jj_2_53(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_53(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(52, xla); }
-  }
-
-  private boolean jj_2_54(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_54(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(53, xla); }
-  }
-
-  private boolean jj_2_55(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_55(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(54, xla); }
-  }
-
-  private boolean jj_2_56(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_56(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(55, xla); }
-  }
-
-  private boolean jj_2_57(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_57(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(56, xla); }
-  }
-
-  private boolean jj_2_58(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_58(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(57, xla); }
-  }
-
-  private boolean jj_2_59(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_59(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(58, xla); }
-  }
-
-  private boolean jj_2_60(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_60(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(59, xla); }
-  }
-
-  private boolean jj_2_61(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_61(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(60, xla); }
-  }
-
-  private boolean jj_2_62(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_62(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(61, xla); }
-  }
-
-  private boolean jj_3R_379() {
-    if (jj_3R_84()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_394()) {
-    jj_scanpos = xsp;
-    if (jj_3R_395()) {
-    jj_scanpos = xsp;
-    if (jj_3R_396()) {
-    jj_scanpos = xsp;
-    if (jj_3R_397()) {
-    jj_scanpos = xsp;
-    if (jj_3R_398()) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_345() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_379()) {
-    jj_scanpos = xsp;
-    if (jj_3R_380()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_165() {
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_408() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_117() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_164()) {
-    jj_scanpos = xsp;
-    if (jj_3R_165()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_164() {
-    if (jj_3R_190()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_314() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_344()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_388() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_352() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_351() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_321() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_3R_351()) {
-    jj_scanpos = xsp;
-    if (jj_3R_352()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_303() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_3R_314()) return true;
-    return false;
-  }
-
-  private boolean jj_3_50() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_389() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_408()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_104() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_363() {
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_388()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_389()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_320() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_304() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_315()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_319() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_24() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_306() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_319()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_320()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_321()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_225()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_261() {
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_192() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_261()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_50()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_240() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_239()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_144() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_23() {
-    if (jj_scan_token(DOT)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_104()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_168() {
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_167() {
-    if (jj_3R_192()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_123() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_166()) {
-    jj_scanpos = xsp;
-    if (jj_3R_167()) {
-    jj_scanpos = xsp;
-    if (jj_3R_168()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_166() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_94() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_144()) return true;
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_23()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_239() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_221() {
-    if (jj_3R_239()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_240()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_207() {
-    if (jj_3R_221()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_122() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_162() {
-    if (jj_3R_111()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_114() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(63)) {
-    jj_scanpos = xsp;
-    if (jj_3R_162()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_194() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_123()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_195() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    return false;
-  }
-
-  private boolean jj_3_49() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_193() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_207()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_48() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_122()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(78)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_173() {
-    if (jj_3R_195()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_110() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(15)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(20)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(17)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(51)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(40)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(42)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(33)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(26)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_172() {
-    if (jj_3R_194()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_141() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_171()) {
-    jj_scanpos = xsp;
-    if (jj_3R_172()) {
-    jj_scanpos = xsp;
-    if (jj_3R_173()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_171() {
-    if (jj_3R_193()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_105() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(74)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(14)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_439() {
-    if (jj_scan_token(FINALLY)) return true;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_93() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_438() {
-    if (jj_scan_token(CATCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_386()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_274() {
-    if (jj_scan_token(TRY)) return true;
-    if (jj_3R_142()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_438()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_439()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_158() {
-    if (jj_3R_110()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_111() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_22()) {
-    jj_scanpos = xsp;
-    if (jj_3R_158()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_22() {
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_273() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_85() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) jj_scanpos = xsp;
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_272() {
-    if (jj_scan_token(THROW)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_437() {
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3_20() {
-    if (jj_3R_102()) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_436() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_21() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_121() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_409() {
-    if (jj_3R_102()) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_271() {
-    if (jj_scan_token(RETURN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_437()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_391() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_409()) jj_scanpos = xsp;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_3R_189()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_92() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_455() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_263()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_446() {
-    if (jj_3R_451()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_435() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_390() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_3R_189()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_364() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_390()) {
-    jj_scanpos = xsp;
-    if (jj_3R_391()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_270() {
-    if (jj_scan_token(CONTINUE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_436()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_147() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_148() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_146() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(43)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_269() {
-    if (jj_scan_token(BREAK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_435()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_145() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_95() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_145()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_146()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_147()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_148()) jj_scanpos = xsp;
-    if (jj_3R_114()) return true;
-    if (jj_3R_105()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_91() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_11() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_91()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_92()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_93()) jj_scanpos = xsp;
-    if (jj_3R_94()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_12() {
-    if (jj_3R_95()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_451() {
-    if (jj_3R_454()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_90() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_47() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(31)) jj_scanpos = xsp;
-    if (jj_3R_111()) return true;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_121()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_445() {
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_310() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_454() {
-    if (jj_3R_263()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_455()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_300() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_310()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_311()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_432() {
-    if (jj_scan_token(ELSE)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_299() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_298() {
-    if (jj_3R_308()) return true;
-    return false;
-  }
-
-  private boolean jj_3_10() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(ENUM)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_453() {
-    if (jj_3R_454()) return true;
-    return false;
-  }
-
-  private boolean jj_3_46() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_87() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_452() {
-    if (jj_3R_222()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_450() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_452()) {
-    jj_scanpos = xsp;
-    if (jj_3R_453()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_9() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_297() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_89() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_8() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_89()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_90()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_444() {
-    if (jj_3R_450()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_433() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_350() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_434() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_444()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_445()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_446()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_296() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_306()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_88() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_7() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_88()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_268() {
-    if (jj_scan_token(FOR)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_433()) {
-    jj_scanpos = xsp;
-    if (jj_3R_434()) return true;
-    }
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_86() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_6() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_86()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_87()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(AT)) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_295() {
-    if (jj_3R_305()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_331() {
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_267() {
-    if (jj_scan_token(DO)) return true;
-    if (jj_3R_223()) return true;
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_294() {
-    if (jj_3R_304()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_293() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_303()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_266() {
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_3R_85()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_290() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_3_5()) {
-    jj_scanpos = xsp;
-    if (jj_3R_293()) {
-    jj_scanpos = xsp;
-    if (jj_3R_294()) {
-    jj_scanpos = xsp;
-    if (jj_3R_295()) {
-    jj_scanpos = xsp;
-    if (jj_3R_296()) {
-    jj_scanpos = xsp;
-    if (jj_3R_297()) {
-    jj_scanpos = xsp;
-    if (jj_3R_298()) {
-    jj_scanpos = xsp;
-    if (jj_3R_299()) {
-    jj_scanpos = xsp;
-    if (jj_3R_300()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_265() {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_223()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_432()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_399() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_101() {
-    if (jj_3R_102()) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_443() {
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3_19() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_101()) jj_scanpos = xsp;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_18() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_449() {
-    if (jj_scan_token(_DEFAULT)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_382() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_399()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_330() {
-    if (jj_3R_364()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_329() {
-    if (jj_3R_364()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_448() {
-    if (jj_scan_token(CASE)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_442() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_448()) {
-    jj_scanpos = xsp;
-    if (jj_3R_449()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_431() {
-    if (jj_3R_442()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_443()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_120() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_264() {
-    if (jj_scan_token(SWITCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_431()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_415() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_341()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_328() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_447() {
-    if (jj_3R_106()) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_347() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_346() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_318() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_3R_346()) {
-    jj_scanpos = xsp;
-    if (jj_3R_347()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_441() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(100)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(101)) {
-    jj_scanpos = xsp;
-    if (jj_3R_447()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_326() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_317() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_285() {
-    if (jj_3R_102()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_441()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_284() {
-    if (jj_3R_215()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_361() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_263() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_283()) {
-    jj_scanpos = xsp;
-    if (jj_3R_284()) {
-    jj_scanpos = xsp;
-    if (jj_3R_285()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_283() {
-    if (jj_3R_214()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_316() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_305() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_316()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_317()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_318()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_360() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_359() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_325() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_359()) {
-    jj_scanpos = xsp;
-    if (jj_3R_360()) {
-    jj_scanpos = xsp;
-    if (jj_3R_361()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_324() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_222() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    if (jj_3R_341()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_415()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_381() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_308() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_324()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_325()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_326()) jj_scanpos = xsp;
-    if (jj_3R_105()) return true;
-    if (jj_3R_327()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_328()) jj_scanpos = xsp;
-    if (jj_scan_token(LBRACE)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_329()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_330()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_331()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_287() {
-    if (jj_3R_290()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_276() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_287()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_45() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(74)) return true;
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(87)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(84)) {
-    jj_scanpos = xsp;
-    if (jj_3R_120()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_211() {
-    if (jj_3R_225()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_210() {
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_209() {
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_349() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_381()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_382()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_196() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_208()) {
-    jj_scanpos = xsp;
-    if (jj_3R_209()) {
-    jj_scanpos = xsp;
-    if (jj_3R_210()) {
-    jj_scanpos = xsp;
-    if (jj_3R_211()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_208() {
-    if (jj_3R_222()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_174() {
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_386() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_111()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(122)) jj_scanpos = xsp;
-    if (jj_3R_377()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_142() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_174()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_430() {
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_348() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_362() {
-    if (jj_3R_386()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_387()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_262() {
-    if (jj_scan_token(ASSERT)) return true;
-    if (jj_3R_117()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_430()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_387() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_386()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_327() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_362()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_119() {
-    if (jj_scan_token(ASSERT)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_374() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_336() {
-    if (jj_3R_105()) return true;
-    if (jj_3R_327()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_374()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_118() {
-    if (jj_3R_105()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_224() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(CLASS)) return true;
-    if (jj_3R_105()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_348()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_349()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_350()) jj_scanpos = xsp;
-    if (jj_3R_276()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_254() {
-    if (jj_3R_274()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_253() {
-    if (jj_3R_273()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_252() {
-    if (jj_3R_272()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_251() {
-    if (jj_3R_271()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_250() {
-    if (jj_3R_270()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_249() {
-    if (jj_3R_269()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_248() {
-    if (jj_3R_268()) return true;
-    return false;
-  }
-
-  private boolean jj_3_41() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_247() {
-    if (jj_3R_267()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_246() {
-    if (jj_3R_266()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_116() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_137()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_245() {
-    if (jj_3R_265()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_244() {
-    if (jj_3R_264()) return true;
-    return false;
-  }
-
-  private boolean jj_3_44() {
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_421() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_341()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_243() {
-    if (jj_3R_263()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_242() {
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_241() {
-    if (jj_3R_262()) return true;
-    return false;
-  }
-
-  private boolean jj_3_43() {
-    if (jj_3R_118()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_223() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_43()) {
-    jj_scanpos = xsp;
-    if (jj_3R_241()) {
-    jj_scanpos = xsp;
-    if (jj_3R_242()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_3R_243()) {
-    jj_scanpos = xsp;
-    if (jj_3R_244()) {
-    jj_scanpos = xsp;
-    if (jj_3R_245()) {
-    jj_scanpos = xsp;
-    if (jj_3R_246()) {
-    jj_scanpos = xsp;
-    if (jj_3R_247()) {
-    jj_scanpos = xsp;
-    if (jj_3R_248()) {
-    jj_scanpos = xsp;
-    if (jj_3R_249()) {
-    jj_scanpos = xsp;
-    if (jj_3R_250()) {
-    jj_scanpos = xsp;
-    if (jj_3R_251()) {
-    jj_scanpos = xsp;
-    if (jj_3R_252()) {
-    jj_scanpos = xsp;
-    if (jj_3R_253()) {
-    jj_scanpos = xsp;
-    if (jj_3R_254()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_62() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_429() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_275() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_40() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_255() {
-    Token xsp;
-    if (jj_3R_275()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_275()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_177()) return true;
-    return false;
-  }
-
-  private boolean jj_3_42() {
-    Token xsp;
-    if (jj_3_40()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_40()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_41()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_228() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_42()) {
-    jj_scanpos = xsp;
-    if (jj_3R_255()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_61() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_412() {
-    if (jj_3R_111()) return true;
-    if (jj_3R_341()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_421()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_238() {
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_220() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_237()) {
-    jj_scanpos = xsp;
-    if (jj_3R_238()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_237() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_406() {
-    if (jj_3R_413()) return true;
-    return false;
-  }
-
-  private boolean jj_3_60() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_140()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_226() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_153() {
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_62()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_152() {
-    if (jj_3R_110()) return true;
-    Token xsp;
-    if (jj_3_61()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_61()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_103() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_152()) {
-    jj_scanpos = xsp;
-    if (jj_3R_153()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_206() {
-    if (jj_3R_220()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_337() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_170() {
-    if (jj_scan_token(HOOK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_206()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_256() {
-    if (jj_3R_276()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_140() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_169()) {
-    jj_scanpos = xsp;
-    if (jj_3R_170()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_169() {
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_405() {
-    if (jj_3R_189()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_139() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_137() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_140()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_60()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_338() {
-    if (jj_3R_142()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_231() {
-    if (jj_3R_189()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_256()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_230() {
-    if (jj_3R_228()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_163() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_229()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_230()) {
-    jj_scanpos = xsp;
-    if (jj_3R_231()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_229() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_212() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_226()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_58() {
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_139()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(87)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_138() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_115() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_39()) {
-    jj_scanpos = xsp;
-    if (jj_3R_163()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_39() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_110()) return true;
-    if (jj_3R_228()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_136() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_405()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_406()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_57() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_138()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_277() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_427() {
-    if (jj_3R_429()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_335() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_426() {
-    if (jj_3R_412()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_425() {
-    if (jj_3R_308()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_424() {
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_334() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_423() {
-    if (jj_3R_411()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_217() {
-    if (jj_3R_117()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_277()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_204() {
-    if (jj_3R_217()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_414() {
-    if (jj_3R_84()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_423()) {
-    jj_scanpos = xsp;
-    if (jj_3R_424()) {
-    jj_scanpos = xsp;
-    if (jj_3R_425()) {
-    jj_scanpos = xsp;
-    if (jj_3R_426()) {
-    jj_scanpos = xsp;
-    if (jj_3R_427()) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_4() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_189() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_204()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_373() {
-    if (jj_scan_token(TESTAAAA)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_83() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_407() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_59()) {
-    jj_scanpos = xsp;
-    if (jj_3R_414()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_59() {
-    if (jj_3R_85()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_372() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_371() {
-    if (jj_scan_token(NATIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_3() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_56() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_227() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(61)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(30)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_55() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_56()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_197() {
-    if (jj_3R_212()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_82() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_370() {
-    if (jj_scan_token(FINAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_82()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_83()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3_54() {
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3_53() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_136()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_213() {
-    if (jj_3R_227()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_369() {
-    if (jj_scan_token(ABSTRACT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_184() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_54()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_55()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_368() {
-    if (jj_scan_token(STATIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_385() {
-    if (jj_3R_407()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_198() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(66)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(70)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(72)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(73)) {
-    jj_scanpos = xsp;
-    if (jj_3R_213()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(45)) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_175() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_197()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_367() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_358() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_385()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_366() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_161() {
-    if (jj_3R_189()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_357() {
-    if (jj_3R_136()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_53()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_160() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_159() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_365() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_333() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_365()) {
-    jj_scanpos = xsp;
-    if (jj_3R_366()) {
-    jj_scanpos = xsp;
-    if (jj_3R_367()) {
-    jj_scanpos = xsp;
-    if (jj_3R_368()) {
-    jj_scanpos = xsp;
-    if (jj_3R_369()) {
-    jj_scanpos = xsp;
-    if (jj_3R_370()) {
-    jj_scanpos = xsp;
-    if (jj_3R_371()) {
-    jj_scanpos = xsp;
-    if (jj_3R_372()) {
-    jj_scanpos = xsp;
-    if (jj_3R_373()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_323() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_357()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_358()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_38() {
-    if (jj_3R_116()) return true;
-    return false;
-  }
-
-  private boolean jj_3_33() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_37() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_115()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_112() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_36()) {
-    jj_scanpos = xsp;
-    if (jj_3_37()) {
-    jj_scanpos = xsp;
-    if (jj_3_38()) {
-    jj_scanpos = xsp;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
-    if (jj_3R_160()) {
-    jj_scanpos = xsp;
-    if (jj_3R_161()) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_36() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_422() {
-    if (jj_3R_407()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_413() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_422()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_35() {
-    if (jj_3R_114()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_183() {
-    if (jj_3R_94()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_33()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_332() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_188() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_384() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_113() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_356() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_384()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_17() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_100()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_182() {
-    if (jj_3R_114()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_176() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_175()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_309() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_332()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_333()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_334()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_335()) jj_scanpos = xsp;
-    if (jj_3R_114()) return true;
-    if (jj_3R_336()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_337()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_338()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(83)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_181() {
-    if (jj_3R_115()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_180() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_440() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_428() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_184()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_440()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_342() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_341()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_393() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_199() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3_34() {
-    if (jj_scan_token(SUPER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(85)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_113()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_32() {
-    if (jj_3R_112()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_143() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_175()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_176()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_286() {
-    if (jj_3R_100()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_17()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_378() {
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_100()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_179() {
-    if (jj_scan_token(THIS)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(85)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_199()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_392() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_177() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_286()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(84)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_151() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_178()) {
-    jj_scanpos = xsp;
-    if (jj_3R_179()) {
-    jj_scanpos = xsp;
-    if (jj_3_34()) {
-    jj_scanpos = xsp;
-    if (jj_3R_180()) {
-    jj_scanpos = xsp;
-    if (jj_3R_181()) {
-    jj_scanpos = xsp;
-    if (jj_3R_182()) {
-    jj_scanpos = xsp;
-    if (jj_3R_183()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_178() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_280() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(100)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(101)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_187() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_150() {
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_99() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_102() {
-    if (jj_3R_151()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_32()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_377() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
-    jj_scanpos = xsp;
-    if (jj_3R_392()) return true;
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_393()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_149() {
-    if (jj_3R_177()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_100() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_149()) {
-    jj_scanpos = xsp;
-    if (jj_3R_150()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_31() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_110()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_97() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(49)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(48)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_279() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_216()) return true;
-    return false;
-  }
-
-  private boolean jj_3_30() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_257() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_278()) {
-    jj_scanpos = xsp;
-    if (jj_3R_279()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_278() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_341() {
-    if (jj_3R_377()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_378()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_258() {
-    if (jj_3R_102()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_280()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_340() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_98() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_14() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_98()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_99()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_96() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3_13() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_96()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_97()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3_29() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_322() {
-    if (jj_3R_356()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_157() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(91)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(90)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(77)) {
-    jj_scanpos = xsp;
-    if (jj_3R_187()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(57)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(54)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(44)) {
-    jj_scanpos = xsp;
-    if (jj_3R_188()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_156() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_307() {
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_322()) jj_scanpos = xsp;
-    if (jj_3R_323()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_109() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_28()) {
-    jj_scanpos = xsp;
-    if (jj_3R_156()) {
-    jj_scanpos = xsp;
-    if (jj_3R_157()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_28() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_110()) return true;
-    return false;
-  }
-
-  private boolean jj_3_27() {
-    if (jj_3R_109()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_81() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_417() {
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_376() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_375() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_339() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_375()) {
-    jj_scanpos = xsp;
-    if (jj_3R_376()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(52)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(31)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(60)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(64)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_1() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_81()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(PACKAGE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_311() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_339()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_340()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_111()) return true;
-    if (jj_3R_341()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_342()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_234() {
-    if (jj_3R_258()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_420() {
-    if (jj_3R_356()) return true;
-    return false;
-  }
-
-  private boolean jj_3_16() {
-    if (jj_3R_95()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_419() {
-    if (jj_3R_428()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_233() {
-    if (jj_3R_257()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_418() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_107() {
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(88)) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_411() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(21)) {
-    jj_scanpos = xsp;
-    if (jj_3R_417()) return true;
-    }
-    if (jj_scan_token(IDENTIFIER)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_418()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_419()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_420()) jj_scanpos = xsp;
-    if (jj_3R_413()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_216() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_232()) {
-    jj_scanpos = xsp;
-    if (jj_3R_233()) {
-    jj_scanpos = xsp;
-    if (jj_3R_234()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_232() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(91)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(90)) return true;
-    }
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3_15() {
-    if (jj_3R_84()) return true;
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_404() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_311()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_403() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_215() {
-    if (jj_scan_token(DECR)) return true;
-    if (jj_3R_102()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_155() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(102)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(103)) return true;
-    }
-    if (jj_3R_154()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_186() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(104)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(105)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(109)) return true;
-    }
-    }
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_402() {
-    if (jj_3R_84()) return true;
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_214() {
-    if (jj_scan_token(INCR)) return true;
-    if (jj_3R_102()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_135() {
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_401() {
-    if (jj_3R_306()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_400() {
-    if (jj_3R_305()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_203() {
-    if (jj_3R_216()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_134() {
-    if (jj_scan_token(TESTAAAA)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_383() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(83)) {
-    jj_scanpos = xsp;
-    if (jj_3R_400()) {
-    jj_scanpos = xsp;
-    if (jj_3R_401()) {
-    jj_scanpos = xsp;
-    if (jj_3R_402()) {
-    jj_scanpos = xsp;
-    if (jj_3R_403()) {
-    jj_scanpos = xsp;
-    if (jj_3R_404()) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_202() {
-    if (jj_3R_215()) return true;
-    return false;
-  }
-
-  private boolean jj_3_26() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(110)) {
-    jj_scanpos = xsp;
-    if (jj_3R_107()) return true;
-    }
-    if (jj_3R_108()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_201() {
-    if (jj_3R_214()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_133() {
-    if (jj_scan_token(VOLATILE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_185() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_200()) {
-    jj_scanpos = xsp;
-    if (jj_3R_201()) {
-    jj_scanpos = xsp;
-    if (jj_3R_202()) {
-    jj_scanpos = xsp;
-    if (jj_3R_203()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_200() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(102)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(103)) return true;
-    }
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_132() {
-    if (jj_scan_token(TRANSIENT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_354() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_363()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_154() {
-    if (jj_3R_185()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_186()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_131() {
-    if (jj_scan_token(NATIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_343() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(89)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(88)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(95)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(96)) return true;
-    }
-    }
-    }
-    if (jj_3R_312()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_313() {
-    if (jj_scan_token(INSTANCEOF)) return true;
-    if (jj_3R_111()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_108() {
-    if (jj_3R_154()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_155()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_130() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_302() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(94)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(97)) return true;
-    }
-    if (jj_3R_291()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_129() {
-    if (jj_scan_token(ABSTRACT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_312() {
-    if (jj_3R_108()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_26()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_128() {
-    if (jj_scan_token(FINAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_353() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_292() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_288()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_127() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_301() {
-    if (jj_3R_312()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_343()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_282() {
-    if (jj_scan_token(BIT_OR)) return true;
-    if (jj_3R_259()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_126() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_289() {
-    if (jj_scan_token(XOR)) return true;
-    if (jj_3R_281()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_291() {
-    if (jj_3R_301()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_313()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_125() {
-    if (jj_scan_token(STATIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_260() {
-    if (jj_scan_token(SC_AND)) return true;
-    if (jj_3R_235()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_288() {
-    if (jj_3R_291()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_302()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_236() {
-    if (jj_scan_token(SC_OR)) return true;
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_355() {
-    if (jj_3R_383()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_124() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_281() {
-    if (jj_3R_288()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_292()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_52() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_124()) {
-    jj_scanpos = xsp;
-    if (jj_3R_125()) {
-    jj_scanpos = xsp;
-    if (jj_3R_126()) {
-    jj_scanpos = xsp;
-    if (jj_3R_127()) {
-    jj_scanpos = xsp;
-    if (jj_3R_128()) {
-    jj_scanpos = xsp;
-    if (jj_3R_129()) {
-    jj_scanpos = xsp;
-    if (jj_3R_130()) {
-    jj_scanpos = xsp;
-    if (jj_3R_131()) {
-    jj_scanpos = xsp;
-    if (jj_3R_132()) {
-    jj_scanpos = xsp;
-    if (jj_3R_133()) {
-    jj_scanpos = xsp;
-    if (jj_3R_134()) {
-    jj_scanpos = xsp;
-    if (jj_3R_135()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_219() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_117()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_84() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_52()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_225() {
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_3R_105()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_353()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_354()) jj_scanpos = xsp;
-    if (jj_scan_token(LBRACE)) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_355()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_344() {
-    if (jj_3R_345()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_259() {
-    if (jj_3R_281()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_289()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_410() {
-    if (jj_3R_416()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_235() {
-    if (jj_3R_259()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_282()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_416() {
-    if (jj_scan_token(_DEFAULT)) return true;
-    if (jj_3R_123()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_218() {
-    if (jj_3R_235()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_260()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_380() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_205() {
-    if (jj_3R_218()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_236()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_398() {
-    if (jj_3R_412()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_191() {
-    if (jj_3R_205()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_219()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_397() {
-    if (jj_3R_303()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_315() {
-    if (jj_3R_345()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_396() {
-    if (jj_3R_307()) return true;
-    return false;
-  }
-
-  private boolean jj_3_51() {
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_395() {
-    if (jj_3R_411()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_106() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(87)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(113)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(114)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(118)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(111)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(112)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(119)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(120)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(121)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(115)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(117)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(116)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_25() {
-    if (jj_3R_102()) return true;
-    if (jj_3R_106()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_190() {
-    if (jj_3R_102()) return true;
-    if (jj_3R_106()) return true;
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_394() {
-    if (jj_3R_111()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_410()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  /** Generated Token Manager. */
-  public JavaParserDebugTokenManager token_source;
-  JavaCharStream jj_input_stream;
-  /** Current token. */
-  public Token token;
-  /** Next token. */
-  public Token jj_nt;
-  private int jj_ntk;
-  private Token jj_scanpos, jj_lastpos;
-  private int jj_la;
-  private int jj_gen;
-  final private int[] jj_la1 = new int[202];
-  static private int[] jj_la1_0;
-  static private int[] jj_la1_1;
-  static private int[] jj_la1_2;
-  static private int[] jj_la1_3;
-  static {
-      jj_la1_init_0();
-      jj_la1_init_1();
-      jj_la1_init_2();
-      jj_la1_init_3();
-   }
-   private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x0,0x90202000,0x0,0x0,0x0,0x90202000,0x0,0x0,0x80002000,0x80002000,0x200000,0x0,0x0,0x0,0x80002000,0x0,0x0,0x80002000,0x80002000,0x0,0x0,0x0,0x0,0x20000000,0x0,0x9432e000,0x0,0x0,0x80002000,0x80002000,0x0,0x0,0x84128000,0x0,0x80002000,0x80002000,0x0,0x0,0x0,0x0,0x2000,0x2000,0x0,0x0,0x80002000,0x80002000,0x0,0x20000000,0x9432a000,0x0,0x8412a000,0x80000000,0x80000000,0x0,0x0,0x0,0x10004000,0x0,0x5412c000,0x5412c000,0x0,0x0,0x80002000,0x80002000,0x0,0x0,0x0,0x0 [...]
-   }
-   private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] {0x40,0x11338a00,0x4040,0x4040,0x40,0x11338a00,0x4000,0x40,0x1220000,0x1220000,0x200,0x0,0x100000,0x0,0x11338800,0x0,0x0,0x1220000,0x1220000,0x0,0x0,0x0,0x0,0x0,0x20,0x913b8f02,0x0,0x0,0x338000,0x338000,0x0,0x0,0x101b8502,0x0,0x1338800,0x1338800,0x0,0x0,0x0,0x0,0x220000,0x220000,0x0,0x0,0x338000,0x338000,0x0,0x0,0x913b8f02,0x0,0x113b8d02,0x10138000,0x10138000,0x0,0x0,0x0,0x0,0x0,0xa2483502,0xa2483502,0x0,0x0,0x1338800,0x1338800,0x0,0x0,0x8000000,0x0,0x0,0x0,0x1 [...]
-   }
-   private static void jj_la1_init_2() {
-      jj_la1_2 = new int[] {0x0,0x480001,0x400000,0x400000,0x0,0x480001,0x400000,0x0,0x0,0x0,0x0,0x400000,0x0,0x200000,0x480001,0x400000,0x400000,0x0,0x0,0x2000000,0x2000000,0x200000,0x2000000,0x0,0x0,0x2488401,0x400000,0x400000,0x0,0x0,0x400000,0x80000,0x400401,0x400000,0x0,0x0,0x400000,0x2000000,0x400000,0x400000,0x0,0x0,0x400000,0x400000,0x0,0x0,0x2000000,0x0,0x2480401,0x80000,0x400401,0x1,0x1,0x400000,0x100000,0x800000,0x400,0x20000,0xc00a744,0xc00a744,0x100000,0x400000,0x0,0x0,0x400 [...]
-   }
-   private static void jj_la1_init_3() {
-      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf0,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x0,0x0,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf0,0x3ff8000,0x0,0x4,0x8,0x800,0x1000,0x400,0x2,0x2,0x0,0x1,0x1,0x0,0x4000,0xc0,0xc0,0x2300,0 [...]
-   }
-  final private JJCalls[] jj_2_rtns = new JJCalls[62];
-  private boolean jj_rescan = false;
-  private int jj_gc = 0;
-
-  /** Constructor with InputStream. */
-  public JavaParserDebug(java.io.InputStream stream) {
-     this(stream, null);
-  }
-  /** Constructor with InputStream and supplied encoding */
-  public JavaParserDebug(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source = new JavaParserDebugTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream) {
-     ReInit(stream, null);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Constructor. */
-  public JavaParserDebug(java.io.Reader stream) {
-    jj_input_stream = new JavaCharStream(stream, 1, 1);
-    token_source = new JavaParserDebugTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Constructor with generated Token Manager. */
-  public JavaParserDebug(JavaParserDebugTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  /** Reinitialise. */
-  public void ReInit(JavaParserDebugTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 202; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      jj_gen++;
-      if (++jj_gc > 100) {
-        jj_gc = 0;
-        for (int i = 0; i < jj_2_rtns.length; i++) {
-          JJCalls c = jj_2_rtns[i];
-          while (c != null) {
-            if (c.gen < jj_gen) c.first = null;
-            c = c.next;
-          }
-        }
-      }
-      trace_token(token, "");
-      return token;
-    }
-    token = oldToken;
-    jj_kind = kind;
-    throw generateParseException();
-  }
-
-  static private final class LookaheadSuccess extends java.lang.Error { }
-  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
-  private boolean jj_scan_token(int kind) {
-    if (jj_scanpos == jj_lastpos) {
-      jj_la--;
-      if (jj_scanpos.next == null) {
-        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
-      } else {
-        jj_lastpos = jj_scanpos = jj_scanpos.next;
-      }
-    } else {
-      jj_scanpos = jj_scanpos.next;
-    }
-    if (jj_rescan) {
-      int i = 0; Token tok = token;
-      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
-      if (tok != null) jj_add_error_token(kind, i);
-    }
-    if (jj_scanpos.kind != kind) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
-    return false;
-  }
-
-
-/** Get the next Token. */
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    jj_gen++;
-      trace_token(token, " (in getNextToken)");
-    return token;
-  }
-
-/** Get the specific Token. */
-  final public Token getToken(int index) {
-    Token t = token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
-    }
-    return t;
-  }
-
-  private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
-
-  private java.util.List jj_expentries = new java.util.ArrayList();
-  private int[] jj_expentry;
-  private int jj_kind = -1;
-  private int[] jj_lasttokens = new int[100];
-  private int jj_endpos;
-
-  private void jj_add_error_token(int kind, int pos) {
-    if (pos >= 100) return;
-    if (pos == jj_endpos + 1) {
-      jj_lasttokens[jj_endpos++] = kind;
-    } else if (jj_endpos != 0) {
-      jj_expentry = new int[jj_endpos];
-      for (int i = 0; i < jj_endpos; i++) {
-        jj_expentry[i] = jj_lasttokens[i];
-      }
-      jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) {
-        int[] oldentry = (int[])(it.next());
-        if (oldentry.length == jj_expentry.length) {
-          for (int i = 0; i < jj_expentry.length; i++) {
-            if (oldentry[i] != jj_expentry[i]) {
-              continue jj_entries_loop;
-            }
-          }
-          jj_expentries.add(jj_expentry);
-          break jj_entries_loop;
-        }
-      }
-      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
-    }
-  }
-
-  /** Generate ParseException. */
-  public ParseException generateParseException() {
-    jj_expentries.clear();
-    boolean[] la1tokens = new boolean[123];
-    if (jj_kind >= 0) {
-      la1tokens[jj_kind] = true;
-      jj_kind = -1;
-    }
-    for (int i = 0; i < 202; i++) {
-      if (jj_la1[i] == jj_gen) {
-        for (int j = 0; j < 32; j++) {
-          if ((jj_la1_0[i] & (1<<j)) != 0) {
-            la1tokens[j] = true;
-          }
-          if ((jj_la1_1[i] & (1<<j)) != 0) {
-            la1tokens[32+j] = true;
-          }
-          if ((jj_la1_2[i] & (1<<j)) != 0) {
-            la1tokens[64+j] = true;
-          }
-          if ((jj_la1_3[i] & (1<<j)) != 0) {
-            la1tokens[96+j] = true;
-          }
-        }
-      }
-    }
-    for (int i = 0; i < 123; i++) {
-      if (la1tokens[i]) {
-        jj_expentry = new int[1];
-        jj_expentry[0] = i;
-        jj_expentries.add(jj_expentry);
-      }
-    }
-    jj_endpos = 0;
-    jj_rescan_token();
-    jj_add_error_token(0, 0);
-    int[][] exptokseq = new int[jj_expentries.size()][];
-    for (int i = 0; i < jj_expentries.size(); i++) {
-      exptokseq[i] = (int[])jj_expentries.get(i);
-    }
-    return new ParseException(token, exptokseq, tokenImage);
-  }
-
-  private int trace_indent = 0;
-  private boolean trace_enabled = true;
-
-/** Enable tracing. */
-  final public void enable_tracing() {
-    trace_enabled = true;
-  }
-
-/** Disable tracing. */
-  final public void disable_tracing() {
-    trace_enabled = false;
-  }
-
-  private void trace_call(String s) {
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.println("Call:   " + s);
-    }
-    trace_indent = trace_indent + 2;
-  }
-
-  private void trace_return(String s) {
-    trace_indent = trace_indent - 2;
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.println("Return: " + s);
-    }
-  }
-
-  private void trace_token(Token t, String where) {
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.print("Consumed token: <" + tokenImage[t.kind]);
-      if (t.kind != 0 && !tokenImage[t.kind].equals("\"" + t.image + "\"")) {
-        System.out.print(": \"" + t.image + "\"");
-      }
-      System.out.println(" at line " + t.beginLine + " column " + t.beginColumn + ">" + where);
-    }
-  }
-
-  private void trace_scan(Token t1, int t2) {
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.print("Visited token: <" + tokenImage[t1.kind]);
-      if (t1.kind != 0 && !tokenImage[t1.kind].equals("\"" + t1.image + "\"")) {
-        System.out.print(": \"" + t1.image + "\"");
-      }
-      System.out.println(" at line " + t1.beginLine + " column " + t1.beginColumn + ">; Expected token: <" + tokenImage[t2] + ">");
-    }
-  }
-
-  private void jj_rescan_token() {
-    jj_rescan = true;
-    for (int i = 0; i < 62; i++) {
-    try {
-      JJCalls p = jj_2_rtns[i];
-      do {
-        if (p.gen > jj_gen) {
-          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
-          switch (i) {
-            case 0: jj_3_1(); break;
-            case 1: jj_3_2(); break;
-            case 2: jj_3_3(); break;
-            case 3: jj_3_4(); break;
-            case 4: jj_3_5(); break;
-            case 5: jj_3_6(); break;
-            case 6: jj_3_7(); break;
-            case 7: jj_3_8(); break;
-            case 8: jj_3_9(); break;
-            case 9: jj_3_10(); break;
-            case 10: jj_3_11(); break;
-            case 11: jj_3_12(); break;
-            case 12: jj_3_13(); break;
-            case 13: jj_3_14(); break;
-            case 14: jj_3_15(); break;
-            case 15: jj_3_16(); break;
-            case 16: jj_3_17(); break;
-            case 17: jj_3_18(); break;
-            case 18: jj_3_19(); break;
-            case 19: jj_3_20(); break;
-            case 20: jj_3_21(); break;
-            case 21: jj_3_22(); break;
-            case 22: jj_3_23(); break;
-            case 23: jj_3_24(); break;
-            case 24: jj_3_25(); break;
-            case 25: jj_3_26(); break;
-            case 26: jj_3_27(); break;
-            case 27: jj_3_28(); break;
-            case 28: jj_3_29(); break;
-            case 29: jj_3_30(); break;
-            case 30: jj_3_31(); break;
-            case 31: jj_3_32(); break;
-            case 32: jj_3_33(); break;
-            case 33: jj_3_34(); break;
-            case 34: jj_3_35(); break;
-            case 35: jj_3_36(); break;
-            case 36: jj_3_37(); break;
-            case 37: jj_3_38(); break;
-            case 38: jj_3_39(); break;
-            case 39: jj_3_40(); break;
-            case 40: jj_3_41(); break;
-            case 41: jj_3_42(); break;
-            case 42: jj_3_43(); break;
-            case 43: jj_3_44(); break;
-            case 44: jj_3_45(); break;
-            case 45: jj_3_46(); break;
-            case 46: jj_3_47(); break;
-            case 47: jj_3_48(); break;
-            case 48: jj_3_49(); break;
-            case 49: jj_3_50(); break;
-            case 50: jj_3_51(); break;
-            case 51: jj_3_52(); break;
-            case 52: jj_3_53(); break;
-            case 53: jj_3_54(); break;
-            case 54: jj_3_55(); break;
-            case 55: jj_3_56(); break;
-            case 56: jj_3_57(); break;
-            case 57: jj_3_58(); break;
-            case 58: jj_3_59(); break;
-            case 59: jj_3_60(); break;
-            case 60: jj_3_61(); break;
-            case 61: jj_3_62(); break;
-          }
-        }
-        p = p.next;
-      } while (p != null);
-      } catch(LookaheadSuccess ls) { }
-    }
-    jj_rescan = false;
-  }
-
-  private void jj_save(int index, int xla) {
-    JJCalls p = jj_2_rtns[index];
-    while (p.gen > jj_gen) {
-      if (p.next == null) { p = p.next = new JJCalls(); break; }
-      p = p.next;
-    }
-    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
-  }
-
-  static final class JJCalls {
-    int gen;
-    Token first;
-    int arg;
-    JJCalls next;
-  }
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebugConstants.java b/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebugConstants.java
deleted file mode 100644
index c4e957c..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebugConstants.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParserDebugConstants.java */
-//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
-package net.sourceforge.cobertura.javancss.parser.debug;
-
-
-/**
- * Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
- */
-public interface JavaParserDebugConstants {
-
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int SINGLE_LINE_COMMENT = 8;
-  /** RegularExpression Id. */
-  int SINGLE_LINE_COMMENT2 = 9;
-  /** RegularExpression Id. */
-  int END_OF_LINE_MULTI = 10;
-  /** RegularExpression Id. */
-  int MULTI_LINE_COMMENT = 11;
-  /** RegularExpression Id. */
-  int ABSTRACT = 13;
-  /** RegularExpression Id. */
-  int ASSERT = 14;
-  /** RegularExpression Id. */
-  int BOOLEAN = 15;
-  /** RegularExpression Id. */
-  int BREAK = 16;
-  /** RegularExpression Id. */
-  int BYTE = 17;
-  /** RegularExpression Id. */
-  int CASE = 18;
-  /** RegularExpression Id. */
-  int CATCH = 19;
-  /** RegularExpression Id. */
-  int CHAR = 20;
-  /** RegularExpression Id. */
-  int CLASS = 21;
-  /** RegularExpression Id. */
-  int CONST = 22;
-  /** RegularExpression Id. */
-  int CONTINUE = 23;
-  /** RegularExpression Id. */
-  int _DEFAULT = 24;
-  /** RegularExpression Id. */
-  int DO = 25;
-  /** RegularExpression Id. */
-  int DOUBLE = 26;
-  /** RegularExpression Id. */
-  int ELSE = 27;
-  /** RegularExpression Id. */
-  int ENUM = 28;
-  /** RegularExpression Id. */
-  int EXTENDS = 29;
-  /** RegularExpression Id. */
-  int FALSE = 30;
-  /** RegularExpression Id. */
-  int FINAL = 31;
-  /** RegularExpression Id. */
-  int FINALLY = 32;
-  /** RegularExpression Id. */
-  int FLOAT = 33;
-  /** RegularExpression Id. */
-  int FOR = 34;
-  /** RegularExpression Id. */
-  int GOTO = 35;
-  /** RegularExpression Id. */
-  int IF = 36;
-  /** RegularExpression Id. */
-  int IMPLEMENTS = 37;
-  /** RegularExpression Id. */
-  int IMPORT = 38;
-  /** RegularExpression Id. */
-  int INSTANCEOF = 39;
-  /** RegularExpression Id. */
-  int INT = 40;
-  /** RegularExpression Id. */
-  int INTERFACE = 41;
-  /** RegularExpression Id. */
-  int LONG = 42;
-  /** RegularExpression Id. */
-  int NATIVE = 43;
-  /** RegularExpression Id. */
-  int NEW = 44;
-  /** RegularExpression Id. */
-  int NULL = 45;
-  /** RegularExpression Id. */
-  int PACKAGE = 46;
-  /** RegularExpression Id. */
-  int PRIVATE = 47;
-  /** RegularExpression Id. */
-  int PROTECTED = 48;
-  /** RegularExpression Id. */
-  int PUBLIC = 49;
-  /** RegularExpression Id. */
-  int RETURN = 50;
-  /** RegularExpression Id. */
-  int SHORT = 51;
-  /** RegularExpression Id. */
-  int STATIC = 52;
-  /** RegularExpression Id. */
-  int TESTAAAA = 53;
-  /** RegularExpression Id. */
-  int SUPER = 54;
-  /** RegularExpression Id. */
-  int SWITCH = 55;
-  /** RegularExpression Id. */
-  int SYNCHRONIZED = 56;
-  /** RegularExpression Id. */
-  int THIS = 57;
-  /** RegularExpression Id. */
-  int THROW = 58;
-  /** RegularExpression Id. */
-  int THROWS = 59;
-  /** RegularExpression Id. */
-  int TRANSIENT = 60;
-  /** RegularExpression Id. */
-  int TRUE = 61;
-  /** RegularExpression Id. */
-  int TRY = 62;
-  /** RegularExpression Id. */
-  int VOID = 63;
-  /** RegularExpression Id. */
-  int VOLATILE = 64;
-  /** RegularExpression Id. */
-  int WHILE = 65;
-  /** RegularExpression Id. */
-  int INTEGER_LITERAL = 66;
-  /** RegularExpression Id. */
-  int DECIMAL_LITERAL = 67;
-  /** RegularExpression Id. */
-  int HEX_LITERAL = 68;
-  /** RegularExpression Id. */
-  int OCTAL_LITERAL = 69;
-  /** RegularExpression Id. */
-  int FLOATING_POINT_LITERAL = 70;
-  /** RegularExpression Id. */
-  int EXPONENT = 71;
-  /** RegularExpression Id. */
-  int CHARACTER_LITERAL = 72;
-  /** RegularExpression Id. */
-  int STRING_LITERAL = 73;
-  /** RegularExpression Id. */
-  int IDENTIFIER = 74;
-  /** RegularExpression Id. */
-  int LETTER = 75;
-  /** RegularExpression Id. */
-  int DIGIT = 76;
-  /** RegularExpression Id. */
-  int LPAREN = 77;
-  /** RegularExpression Id. */
-  int RPAREN = 78;
-  /** RegularExpression Id. */
-  int LBRACE = 79;
-  /** RegularExpression Id. */
-  int RBRACE = 80;
-  /** RegularExpression Id. */
-  int LBRACKET = 81;
-  /** RegularExpression Id. */
-  int RBRACKET = 82;
-  /** RegularExpression Id. */
-  int SEMICOLON = 83;
-  /** RegularExpression Id. */
-  int COMMA = 84;
-  /** RegularExpression Id. */
-  int DOT = 85;
-  /** RegularExpression Id. */
-  int AT = 86;
-  /** RegularExpression Id. */
-  int ASSIGN = 87;
-  /** RegularExpression Id. */
-  int GT = 88;
-  /** RegularExpression Id. */
-  int LT = 89;
-  /** RegularExpression Id. */
-  int BANG = 90;
-  /** RegularExpression Id. */
-  int TILDE = 91;
-  /** RegularExpression Id. */
-  int HOOK = 92;
-  /** RegularExpression Id. */
-  int COLON = 93;
-  /** RegularExpression Id. */
-  int EQ = 94;
-  /** RegularExpression Id. */
-  int LE = 95;
-  /** RegularExpression Id. */
-  int GE = 96;
-  /** RegularExpression Id. */
-  int NE = 97;
-  /** RegularExpression Id. */
-  int SC_OR = 98;
-  /** RegularExpression Id. */
-  int SC_AND = 99;
-  /** RegularExpression Id. */
-  int INCR = 100;
-  /** RegularExpression Id. */
-  int DECR = 101;
-  /** RegularExpression Id. */
-  int PLUS = 102;
-  /** RegularExpression Id. */
-  int MINUS = 103;
-  /** RegularExpression Id. */
-  int STAR = 104;
-  /** RegularExpression Id. */
-  int SLASH = 105;
-  /** RegularExpression Id. */
-  int BIT_AND = 106;
-  /** RegularExpression Id. */
-  int BIT_OR = 107;
-  /** RegularExpression Id. */
-  int XOR = 108;
-  /** RegularExpression Id. */
-  int REM = 109;
-  /** RegularExpression Id. */
-  int LSHIFT = 110;
-  /** RegularExpression Id. */
-  int PLUSASSIGN = 111;
-  /** RegularExpression Id. */
-  int MINUSASSIGN = 112;
-  /** RegularExpression Id. */
-  int STARASSIGN = 113;
-  /** RegularExpression Id. */
-  int SLASHASSIGN = 114;
-  /** RegularExpression Id. */
-  int ANDASSIGN = 115;
-  /** RegularExpression Id. */
-  int ORASSIGN = 116;
-  /** RegularExpression Id. */
-  int XORASSIGN = 117;
-  /** RegularExpression Id. */
-  int REMASSIGN = 118;
-  /** RegularExpression Id. */
-  int LSHIFTASSIGN = 119;
-  /** RegularExpression Id. */
-  int RSIGNEDSHIFTASSIGN = 120;
-  /** RegularExpression Id. */
-  int RUNSIGNEDSHIFTASSIGN = 121;
-  /** RegularExpression Id. */
-  int ELLIPSIS = 122;
-
-  /** Lexical state. */
-  int DEFAULT = 0;
-  /** Lexical state. */
-  int IN_SINGLE_LINE_COMMENT = 1;
-  /** Lexical state. */
-  int IN_MULTI_LINE_COMMENT = 2;
-
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "\" \"",
-    "\"\\t\"",
-    "\"\\n\"",
-    "\"\\r\"",
-    "\"\\f\"",
-    "\"\\u001a\"",
-    "\"/*\"",
-    "\"//\"",
-    "<SINGLE_LINE_COMMENT2>",
-    "<END_OF_LINE_MULTI>",
-    "\"*/\"",
-    "<token of kind 12>",
-    "\"abstract\"",
-    "\"assert\"",
-    "\"boolean\"",
-    "\"break\"",
-    "\"byte\"",
-    "\"case\"",
-    "\"catch\"",
-    "\"char\"",
-    "\"class\"",
-    "\"const\"",
-    "\"continue\"",
-    "\"default\"",
-    "\"do\"",
-    "\"double\"",
-    "\"else\"",
-    "\"enum\"",
-    "\"extends\"",
-    "\"false\"",
-    "\"final\"",
-    "\"finally\"",
-    "\"float\"",
-    "\"for\"",
-    "\"goto\"",
-    "\"if\"",
-    "\"implements\"",
-    "\"import\"",
-    "\"instanceof\"",
-    "\"int\"",
-    "\"interface\"",
-    "\"long\"",
-    "\"native\"",
-    "\"new\"",
-    "\"null\"",
-    "\"package\"",
-    "\"private\"",
-    "\"protected\"",
-    "\"public\"",
-    "\"return\"",
-    "\"short\"",
-    "\"static\"",
-    "\"strictfp\"",
-    "\"super\"",
-    "\"switch\"",
-    "\"synchronized\"",
-    "\"this\"",
-    "\"throw\"",
-    "\"throws\"",
-    "\"transient\"",
-    "\"true\"",
-    "\"try\"",
-    "\"void\"",
-    "\"volatile\"",
-    "\"while\"",
-    "<INTEGER_LITERAL>",
-    "<DECIMAL_LITERAL>",
-    "<HEX_LITERAL>",
-    "<OCTAL_LITERAL>",
-    "<FLOATING_POINT_LITERAL>",
-    "<EXPONENT>",
-    "<CHARACTER_LITERAL>",
-    "<STRING_LITERAL>",
-    "<IDENTIFIER>",
-    "<LETTER>",
-    "<DIGIT>",
-    "\"(\"",
-    "\")\"",
-    "\"{\"",
-    "\"}\"",
-    "\"[\"",
-    "\"]\"",
-    "\";\"",
-    "\",\"",
-    "\".\"",
-    "\"@\"",
-    "\"=\"",
-    "\">\"",
-    "\"<\"",
-    "\"!\"",
-    "\"~\"",
-    "\"?\"",
-    "\":\"",
-    "\"==\"",
-    "\"<=\"",
-    "\">=\"",
-    "\"!=\"",
-    "\"||\"",
-    "\"&&\"",
-    "\"++\"",
-    "\"--\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"&\"",
-    "\"|\"",
-    "\"^\"",
-    "\"%\"",
-    "\"<<\"",
-    "\"+=\"",
-    "\"-=\"",
-    "\"*=\"",
-    "\"/=\"",
-    "\"&=\"",
-    "\"|=\"",
-    "\"^=\"",
-    "\"%=\"",
-    "\"<<=\"",
-    "\">>=\"",
-    "\">>>=\"",
-    "\"...\"",
-  };
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebugTokenManager.java b/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebugTokenManager.java
deleted file mode 100644
index 6574019..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/debug/JavaParserDebugTokenManager.java
+++ /dev/null
@@ -1,2146 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParserDebugTokenManager.java */
-//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
-package net.sourceforge.cobertura.javancss.parser.debug;
-import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
-import java.util.*;
-import net.sourceforge.cobertura.javancss.ccl.Util;
-import net.sourceforge.cobertura.javancss.FunctionMetric;
-import net.sourceforge.cobertura.javancss.ObjectMetric;
-import net.sourceforge.cobertura.javancss.PackageMetric;
-
-/** Token Manager. */
-public class JavaParserDebugTokenManager implements JavaParserDebugConstants
-{
-    // added by SMS
-
-    public static int  _iSingleComments = 0;
-    public static int  _iMultiComments = 0;
-    public static int  _iFormalComments = 0;
-
-    public static int  _iMultiCommentsLast = 0;
-
-  /** Debug output. */
-  public  java.io.PrintStream debugStream = System.out;
-  /** Set debug output. */
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
-{
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0xffffffffffffe000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            jjmatchedKind = 74;
-            return 28;
-         }
-         if ((active1 & 0x400000000200000L) != 0L)
-            return 4;
-         return -1;
-      case 1:
-         if ((active0 & 0x1006000000L) != 0L)
-            return 28;
-         if ((active0 & 0xffffffeff9ffe000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 74;
-               jjmatchedPos = 1;
-            }
-            return 28;
-         }
-         return -1;
-      case 2:
-         if ((active0 & 0x4000130400000000L) != 0L)
-            return 28;
-         if ((active0 & 0xbfffecebfdffe000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 74;
-               jjmatchedPos = 2;
-            }
-            return 28;
-         }
-         return -1;
-      case 3:
-         if ((active0 & 0x1dffcae3e5e9e000L) != 0L || (active1 & 0x3L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 3;
-            return 28;
-         }
-         if ((active0 & 0xa200240818160000L) != 0L)
-            return 28;
-         return -1;
-      case 4:
-         if ((active0 & 0xc480003c0690000L) != 0L || (active1 & 0x2L) != 0L)
-            return 28;
-         if ((active0 & 0x11b7cae02580e000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 4)
-            {
-               jjmatchedKind = 74;
-               jjmatchedPos = 4;
-            }
-            return 28;
-         }
-         return -1;
-      case 5:
-         if ((active0 & 0x896084004004000L) != 0L)
-            return 28;
-         if ((active0 & 0x1121c2a12180a000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 5;
-            return 28;
-         }
-         return -1;
-      case 6:
-         if ((active0 & 0xc00121008000L) != 0L)
-            return 28;
-         if ((active0 & 0x112102a000802000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 6;
-            return 28;
-         }
-         return -1;
-      case 7:
-         if ((active0 & 0x20000000802000L) != 0L || (active1 & 0x1L) != 0L)
-            return 28;
-         if ((active0 & 0x110102a000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 7;
-            return 28;
-         }
-         return -1;
-      case 8:
-         if ((active0 & 0x1001020000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x10000a000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 8;
-            return 28;
-         }
-         return -1;
-      case 9:
-         if ((active0 & 0xa000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 9;
-            return 28;
-         }
-         return -1;
-      case 10:
-         if ((active0 & 0x100000000000000L) != 0L)
-         {
-            jjmatchedKind = 74;
-            jjmatchedPos = 10;
-            return 28;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0, long active1)
-{
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
-}
-private int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 33:
-         jjmatchedKind = 90;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x200000000L);
-      case 37:
-         jjmatchedKind = 109;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x40000000000000L);
-      case 38:
-         jjmatchedKind = 106;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000800000000L);
-      case 40:
-         return jjStopAtPos(0, 77);
-      case 41:
-         return jjStopAtPos(0, 78);
-      case 42:
-         jjmatchedKind = 104;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000000000000L);
-      case 43:
-         jjmatchedKind = 102;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x801000000000L);
-      case 44:
-         return jjStopAtPos(0, 84);
-      case 45:
-         jjmatchedKind = 103;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1002000000000L);
-      case 46:
-         jjmatchedKind = 85;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x400000000000000L);
-      case 47:
-         jjmatchedKind = 105;
-         return jjMoveStringLiteralDfa1_0(0x180L, 0x4000000000000L);
-      case 58:
-         return jjStopAtPos(0, 93);
-      case 59:
-         return jjStopAtPos(0, 83);
-      case 60:
-         jjmatchedKind = 89;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x80400080000000L);
-      case 61:
-         jjmatchedKind = 87;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x40000000L);
-      case 62:
-         jjmatchedKind = 88;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x300000100000000L);
-      case 63:
-         return jjStopAtPos(0, 92);
-      case 64:
-         return jjStopAtPos(0, 86);
-      case 91:
-         return jjStopAtPos(0, 81);
-      case 93:
-         return jjStopAtPos(0, 82);
-      case 94:
-         jjmatchedKind = 108;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x20000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x6000L, 0x0L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x38000L, 0x0L);
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0xfc0000L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x7000000L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x38000000L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x7c0000000L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x800000000L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x3f000000000L, 0x0L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x40000000000L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x380000000000L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x3c00000000000L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x4000000000000L, 0x0L);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x1f8000000000000L, 0x0L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x7e00000000000000L, 0x0L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0x8000000000000000L, 0x1L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2L);
-      case 123:
-         return jjStopAtPos(0, 79);
-      case 124:
-         jjmatchedKind = 107;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x10000400000000L);
-      case 125:
-         return jjStopAtPos(0, 80);
-      case 126:
-         return jjStopAtPos(0, 91);
-      default :
-         return jjMoveNfa_0(0, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_0(long active0, long active1)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0, active1);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 38:
-         if ((active1 & 0x800000000L) != 0L)
-            return jjStopAtPos(1, 99);
-         break;
-      case 42:
-         if ((active0 & 0x80L) != 0L)
-            return jjStopAtPos(1, 7);
-         break;
-      case 43:
-         if ((active1 & 0x1000000000L) != 0L)
-            return jjStopAtPos(1, 100);
-         break;
-      case 45:
-         if ((active1 & 0x2000000000L) != 0L)
-            return jjStopAtPos(1, 101);
-         break;
-      case 46:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x400000000000000L);
-      case 47:
-         if ((active0 & 0x100L) != 0L)
-            return jjStopAtPos(1, 8);
-         break;
-      case 60:
-         if ((active1 & 0x400000000000L) != 0L)
-         {
-            jjmatchedKind = 110;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x80000000000000L);
-      case 61:
-         if ((active1 & 0x40000000L) != 0L)
-            return jjStopAtPos(1, 94);
-         else if ((active1 & 0x80000000L) != 0L)
-            return jjStopAtPos(1, 95);
-         else if ((active1 & 0x100000000L) != 0L)
-            return jjStopAtPos(1, 96);
-         else if ((active1 & 0x200000000L) != 0L)
-            return jjStopAtPos(1, 97);
-         else if ((active1 & 0x800000000000L) != 0L)
-            return jjStopAtPos(1, 111);
-         else if ((active1 & 0x1000000000000L) != 0L)
-            return jjStopAtPos(1, 112);
-         else if ((active1 & 0x2000000000000L) != 0L)
-            return jjStopAtPos(1, 113);
-         else if ((active1 & 0x4000000000000L) != 0L)
-            return jjStopAtPos(1, 114);
-         else if ((active1 & 0x8000000000000L) != 0L)
-            return jjStopAtPos(1, 115);
-         else if ((active1 & 0x10000000000000L) != 0L)
-            return jjStopAtPos(1, 116);
-         else if ((active1 & 0x20000000000000L) != 0L)
-            return jjStopAtPos(1, 117);
-         else if ((active1 & 0x40000000000000L) != 0L)
-            return jjStopAtPos(1, 118);
-         break;
-      case 62:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x300000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4800400c0000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4100001000000L, active1, 0L);
-      case 102:
-         if ((active0 & 0x1000000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 36, 28);
-         break;
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0xe08000000100000L, active1, 0x2L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0x180000000L, active1, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x208200000L, active1, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0x6000000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa2_0(active0, 0x38010000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x2000000L) != 0L)
-         {
-            jjmatchedKind = 25;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000040c04c08000L, active1, 0x1L);
-      case 114:
-         return jjMoveStringLiteralDfa2_0(active0, 0x7001800000010000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa2_0(active0, 0x30000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x42200000000000L, active1, 0L);
-      case 119:
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000000L, active1, 0L);
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0x20000000L, active1, 0L);
-      case 121:
-         return jjMoveStringLiteralDfa2_0(active0, 0x100000000020000L, active1, 0L);
-      case 124:
-         if ((active1 & 0x400000000L) != 0L)
-            return jjStopAtPos(1, 98);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0, active1);
-}
-private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(0, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0, active1);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 46:
-         if ((active1 & 0x400000000000000L) != 0L)
-            return jjStopAtPos(2, 122);
-         break;
-      case 61:
-         if ((active1 & 0x80000000000000L) != 0L)
-            return jjStopAtPos(2, 119);
-         else if ((active1 & 0x100000000000000L) != 0L)
-            return jjStopAtPos(2, 120);
-         break;
-      case 62:
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1010000000300000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x10000L, active1, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8280800000000000L, active1, 0x2L);
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200040000000L, active1, 0x1L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100040180c00000L, active1, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x9000200008000L, active1, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0x40006000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x400000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 34, 28);
-         return jjMoveStringLiteralDfa3_0(active0, 0xc20000000000000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8008046000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 40;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x40a08200a0000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000000014000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x100000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 44, 28);
-         break;
-      case 121:
-         if ((active0 & 0x4000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 62, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0, active1);
-}
-private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(1, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(2, active0, active1);
-      return 3;
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active1 & 0x200000000000000L) != 0L)
-            return jjStopAtPos(3, 121);
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x381010000L, active1, 0x1L);
-      case 98:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000000080000L, active1, 0L);
-      case 100:
-         if ((active0 & 0x8000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 63, 28);
-         break;
-      case 101:
-         if ((active0 & 0x20000L) != 0L)
-            return jjStartNfaWithStates_0(3, 17, 28);
-         else if ((active0 & 0x40000L) != 0L)
-            return jjStartNfaWithStates_0(3, 18, 28);
-         else if ((active0 & 0x8000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 27, 28);
-         else if ((active0 & 0x2000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 61, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x40020020004000L, active1, 0L);
-      case 103:
-         if ((active0 & 0x40000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 42, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x20080000000000L, active1, 0L);
-      case 107:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000L, active1, 0L);
-      case 108:
-         if ((active0 & 0x200000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 45, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x2002000008000L, active1, 0x2L);
-      case 109:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 28, 28);
-         break;
-      case 110:
-         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x800000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 35, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0xc00004000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x100000L) != 0L)
-            return jjStartNfaWithStates_0(3, 20, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x200000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 57, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x40600000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0x91008000802000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(2, active0, active1);
-}
-private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(2, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(3, active0, active1);
-      return 4;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0xc08000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0xa0000000000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x40000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 30, 28);
-         else if ((active1 & 0x2L) != 0L)
-            return jjStartNfaWithStates_0(4, 65, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x1002000008000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(4, 19, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0x12000000800000L, active1, 0L);
-      case 107:
-         if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_0(4, 16, 28);
-         break;
-      case 108:
-         if ((active0 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 31;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x104000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa5_0(active0, 0x20000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x40000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 54, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x4024000006000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(4, 21, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(4, 22, 28);
-         else if ((active0 & 0x200000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 33, 28);
-         else if ((active0 & 0x8000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 51, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1L);
-      case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x400000000000000L) != 0L)
-         {
-            jjmatchedKind = 58;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(3, active0, active1);
-}
-private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(3, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(4, active0, active1);
-      return 5;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0xa000L, active1, 0L);
-      case 99:
-         if ((active0 & 0x2000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 49, 28);
-         else if ((active0 & 0x10000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 52, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000L, active1, 0L);
-      case 100:
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 26, 28);
-         else if ((active0 & 0x80000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 43, 28);
-         break;
-      case 102:
-         return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L, active1, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x80000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 55, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000000L, active1, 0x1L);
-      case 108:
-         return jjMoveStringLiteralDfa6_0(active0, 0x101000000L, active1, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000L, active1, 0L);
-      case 110:
-         if ((active0 & 0x4000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 50, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000800000L, active1, 0L);
-      case 114:
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x800000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 59, 28);
-         break;
-      case 116:
-         if ((active0 & 0x4000L) != 0L)
-            return jjStartNfaWithStates_0(5, 14, 28);
-         else if ((active0 & 0x4000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 38, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x20800000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(4, active0, active1);
-}
-private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(4, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(5, active0, active1);
-      return 6;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000002000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x400000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 46, 28);
-         else if ((active0 & 0x800000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 47, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x1000002000000000L, active1, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000000000000L, active1, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x1L);
-      case 110:
-         if ((active0 & 0x8000L) != 0L)
-            return jjStartNfaWithStates_0(6, 15, 28);
-         break;
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0x100000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 29, 28);
-         break;
-      case 116:
-         if ((active0 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 24, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x1000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0x800000L, active1, 0L);
-      case 121:
-         if ((active0 & 0x100000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 32, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(5, active0, active1);
-}
-private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(5, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(6, active0, active1);
-      return 7;
-   }
-   switch(curChar)
-   {
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0x20000000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_0(7, 23, 28);
-         else if ((active1 & 0x1L) != 0L)
-            return jjStartNfaWithStates_0(7, 64, 28);
-         return jjMoveStringLiteralDfa8_0(active0, 0x1008000000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa8_0(active0, 0x1100002000000000L, active1, 0L);
-      case 112:
-         if ((active0 & 0x20000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 53, 28);
-         break;
-      case 116:
-         if ((active0 & 0x2000L) != 0L)
-            return jjStartNfaWithStates_0(7, 13, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(6, active0, active1);
-}
-private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(6, old0, old1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(7, active0, 0L);
-      return 8;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x1000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 48, 28);
-         break;
-      case 101:
-         if ((active0 & 0x20000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 41, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active0, 0x100000000000000L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0x8000000000L);
-      case 116:
-         if ((active0 & 0x1000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 60, 28);
-         return jjMoveStringLiteralDfa9_0(active0, 0x2000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(7, active0, 0L);
-}
-private int jjMoveStringLiteralDfa9_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(7, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(8, active0, 0L);
-      return 9;
-   }
-   switch(curChar)
-   {
-      case 102:
-         if ((active0 & 0x8000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 39, 28);
-         break;
-      case 115:
-         if ((active0 & 0x2000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 37, 28);
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa10_0(active0, 0x100000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(8, active0, 0L);
-}
-private int jjMoveStringLiteralDfa10_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(8, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(9, active0, 0L);
-      return 10;
-   }
-   switch(curChar)
-   {
-      case 101:
-         return jjMoveStringLiteralDfa11_0(active0, 0x100000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(9, active0, 0L);
-}
-private int jjMoveStringLiteralDfa11_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(9, old0, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(10, active0, 0L);
-      return 11;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x100000000000000L) != 0L)
-            return jjStartNfaWithStates_0(11, 56, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(10, active0, 0L);
-}
-private int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-static final long[] jjbitVec0 = {
-   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec2 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec3 = {
-   0xfff0000000200002L, 0xffffffffffffdfffL, 0xfffff00f7fffffffL, 0x12000000007fffffL
-};
-static final long[] jjbitVec4 = {
-   0x0L, 0x0L, 0x420043c00000000L, 0xff7fffffff7fffffL
-};
-static final long[] jjbitVec5 = {
-   0xffffcffffffffL, 0xffffffffffff0000L, 0xf9ff3fffffffffffL, 0x401f00030003L
-};
-static final long[] jjbitVec6 = {
-   0x0L, 0x400000000000000L, 0xfffffffbffffd740L, 0xffffffcff7fffL
-};
-static final long[] jjbitVec7 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffffff003L, 0x33fffffffff199fL
-};
-static final long[] jjbitVec8 = {
-   0xfffe000000000000L, 0xfffffffe027fffffL, 0xffL, 0x707ffffff0000L
-};
-static final long[] jjbitVec9 = {
-   0x7fffffe00000000L, 0xfffe0000000007ffL, 0xffffffffffffffffL, 0x1c000060002fffffL
-};
-static final long[] jjbitVec10 = {
-   0x1ffffffd0000L, 0x0L, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec11 = {
-   0x23ffffffffffffe0L, 0x3ff010000L, 0x3c5fdfffff99fe0L, 0xf0003b0000000L
-};
-static final long[] jjbitVec12 = {
-   0x36dfdfffff987e0L, 0x1c00005e000000L, 0x23edfdfffffbafe0L, 0x100010000L
-};
-static final long[] jjbitVec13 = {
-   0x23cdfdfffff99fe0L, 0x3b0000000L, 0x3bfc718d63dc7e0L, 0x0L
-};
-static final long[] jjbitVec14 = {
-   0x3effdfffffddfe0L, 0x300000000L, 0x3effdfffffddfe0L, 0x340000000L
-};
-static final long[] jjbitVec15 = {
-   0x3fffdfffffddfe0L, 0x300000000L, 0x2ffbfffffc7fffe0L, 0x7fL
-};
-static final long[] jjbitVec16 = {
-   0x800dfffffffffffeL, 0x7fL, 0x200decaefef02596L, 0x3000005fL
-};
-static final long[] jjbitVec17 = {
-   0x1L, 0x7fffffffeffL, 0xf00L, 0x0L
-};
-static final long[] jjbitVec18 = {
-   0x6fbffffffffL, 0x3f0000L, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-static final long[] jjbitVec19 = {
-   0xffffffffffffffffL, 0xffffffff83ffffffL, 0xffffff07ffffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec20 = {
-   0xffffffffffffff7fL, 0xffffffff3d7f3d7fL, 0x7f3d7fffffff3d7fL, 0xffff7fffff7f7f3dL
-};
-static final long[] jjbitVec21 = {
-   0xffffffff7f3d7fffL, 0x7ffff7fL, 0xffffffff00000000L, 0x1fffffffffffffL
-};
-static final long[] jjbitVec22 = {
-   0xffffffffffffffffL, 0x7f9fffffffffffL, 0xffffffff07fffffeL, 0x7ffffffffffL
-};
-static final long[] jjbitVec23 = {
-   0x0L, 0x0L, 0xfffffffffffffL, 0x8000000L
-};
-static final long[] jjbitVec24 = {
-   0xffffffff00000000L, 0xffffffffffffffL, 0x1ffffffffffL, 0x0L
-};
-static final long[] jjbitVec25 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffff0fffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec26 = {
-   0xffffffff3f3fffffL, 0x3fffffffaaff3f3fL, 0x5fdfffffffffffffL, 0x1fdc1fff0fcf1fdcL
-};
-static final long[] jjbitVec27 = {
-   0x8000000000000000L, 0x8000000000000001L, 0xffff00000000L, 0x0L
-};
-static final long[] jjbitVec28 = {
-   0x3fbbd503e2ffc84L, 0xffffffff00000000L, 0xfL, 0x0L
-};
-static final long[] jjbitVec29 = {
-   0x73e03fe000000e0L, 0xfffffffffffffffeL, 0xfffffffe601fffffL, 0x7fffffffffffffffL
-};
-static final long[] jjbitVec30 = {
-   0xfffe1fffffffffe0L, 0xffffffffffffffffL, 0xffffff00007fffL, 0x0L
-};
-static final long[] jjbitVec31 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffffffL, 0x0L
-};
-static final long[] jjbitVec32 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec33 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x1fffL, 0x0L
-};
-static final long[] jjbitVec34 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffL, 0x0L
-};
-static final long[] jjbitVec35 = {
-   0x3fffffffffffL, 0x0L, 0x0L, 0x0L
-};
-static final long[] jjbitVec36 = {
-   0x5f7ffdffa0f8007fL, 0xffffffffffffffdbL, 0x3ffffffffffffL, 0xfffffffffff80000L
-};
-static final long[] jjbitVec37 = {
-   0x3fffffffffffffffL, 0xffffffffffff0000L, 0xfffffffffffcffffL, 0xfff0000000000ffL
-};
-static final long[] jjbitVec38 = {
-   0x18000000000000L, 0xffd702000000e000L, 0xffffffffffffffffL, 0x1fffffffffffffffL
-};
-static final long[] jjbitVec39 = {
-   0x87fffffe00000010L, 0xffffffe007fffffeL, 0x7fffffffffffffffL, 0x631cfcfcfcL
-};
-static final long[] jjbitVec40 = {
-   0x7fffffe00000000L, 0xfffe03ff000007ffL, 0xffffffffffffffffL, 0x1fff0060002fffffL
-};
-static final long[] jjbitVec41 = {
-   0x23ffffffffffffe0L, 0xffc3ff010000L, 0x3c5fdfffff99fe0L, 0xfffc3b0000000L
-};
-static final long[] jjbitVec42 = {
-   0x36dfdfffff987e0L, 0x1cffc05e000000L, 0x23edfdfffffbafe0L, 0xffc100010000L
-};
-static final long[] jjbitVec43 = {
-   0x23cdfdfffff99fe0L, 0xffc3b0000000L, 0x3bfc718d63dc7e0L, 0xff8000000000L
-};
-static final long[] jjbitVec44 = {
-   0x3effdfffffddfe0L, 0xffc300000000L, 0x3effdfffffddfe0L, 0xffc340000000L
-};
-static final long[] jjbitVec45 = {
-   0x3fffdfffffddfe0L, 0xffc300000000L, 0x2ffbfffffc7fffe0L, 0x7fL
-};
-static final long[] jjbitVec46 = {
-   0x800dfffffffffffeL, 0x3ff007fL, 0x200decaefef02596L, 0x33ff005fL
-};
-static final long[] jjbitVec47 = {
-   0x6fbffffffffL, 0x3f03ffL, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-private int jjMoveNfa_0(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 48;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(0, 6);
-                  else if (curChar == 36)
-                  {
-                     if (kind > 74)
-                        kind = 74;
-                     jjCheckNAdd(28);
-                  }
-                  else if (curChar == 34)
-                     jjCheckNAddStates(7, 9);
-                  else if (curChar == 39)
-                     jjAddStates(10, 11);
-                  else if (curChar == 46)
-                     jjCheckNAdd(4);
-                  if ((0x3fe000000000000L & l) != 0L)
-                  {
-                     if (kind > 66)
-                        kind = 66;
-                     jjCheckNAddTwoStates(1, 2);
-                  }
-                  else if (curChar == 48)
-                  {
-                     if (kind > 66)
-                        kind = 66;
-                     jjCheckNAddStates(12, 14);
-                  }
-                  break;
-               case 1:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(1, 2);
-                  break;
-               case 3:
-                  if (curChar == 46)
-                     jjCheckNAdd(4);
-                  break;
-               case 4:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddStates(15, 17);
-                  break;
-               case 6:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 7:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-                  if (curChar == 39)
-                     jjAddStates(10, 11);
-                  break;
-               case 10:
-                  if ((0xfffffffffffffbffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 11:
-                  if (curChar == 39 && kind > 72)
-                     kind = 72;
-                  break;
-               case 13:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 14:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(15, 11);
-                  break;
-               case 15:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 16:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  break;
-               case 17:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(15);
-                  break;
-               case 18:
-                  if (curChar == 34)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 19:
-                  if ((0xfffffffbffffdbffL & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 21:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 22:
-                  if (curChar == 34 && kind > 73)
-                     kind = 73;
-                  break;
-               case 23:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(18, 21);
-                  break;
-               case 24:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 25:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 26;
-                  break;
-               case 26:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(24);
-                  break;
-               case 27:
-                  if (curChar != 36)
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 28:
-                  if ((0x3ff001000000000L & l) == 0L)
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 29:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(0, 6);
-                  break;
-               case 30:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(30, 31);
-                  break;
-               case 31:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddStates(22, 24);
-                  break;
-               case 32:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddStates(22, 24);
-                  break;
-               case 34:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(35);
-                  break;
-               case 35:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddTwoStates(35, 8);
-                  break;
-               case 36:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(36, 37);
-                  break;
-               case 38:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(39);
-                  break;
-               case 39:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 70)
-                     kind = 70;
-                  jjCheckNAddTwoStates(39, 8);
-                  break;
-               case 40:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(25, 27);
-                  break;
-               case 42:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(43);
-                  break;
-               case 43:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(43, 8);
-                  break;
-               case 44:
-                  if (curChar != 48)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddStates(12, 14);
-                  break;
-               case 46:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(46, 2);
-                  break;
-               case 47:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(47, 2);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-               case 28:
-                  if ((0x7fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 2:
-                  if ((0x100000001000L & l) != 0L && kind > 66)
-                     kind = 66;
-                  break;
-               case 5:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(28, 29);
-                  break;
-               case 8:
-                  if ((0x5000000050L & l) != 0L && kind > 70)
-                     kind = 70;
-                  break;
-               case 10:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 12:
-                  if (curChar == 92)
-                     jjAddStates(30, 32);
-                  break;
-               case 13:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 19:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 20:
-                  if (curChar == 92)
-                     jjAddStates(33, 35);
-                  break;
-               case 21:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 33:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(36, 37);
-                  break;
-               case 37:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(38, 39);
-                  break;
-               case 41:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(40, 41);
-                  break;
-               case 45:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(46);
-                  break;
-               case 46:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAddTwoStates(46, 2);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               case 10:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  break;
-               case 19:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(7, 9);
-                  break;
-               case 28:
-                  if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 74)
-                     kind = 74;
-                  jjCheckNAdd(28);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 48 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
-   switch (pos)
-   {
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
-   return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private int jjMoveStringLiteralDfa0_2()
-{
-   switch(curChar)
-   {
-      case 42:
-         return jjMoveStringLiteralDfa1_2(0x800L);
-      default :
-         return jjMoveNfa_2(0, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_2(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_2(0, active0);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 47:
-         if ((active0 & 0x800L) != 0L)
-            return jjStopAtPos(1, 11);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_2(0, active0);
-}
-private int jjMoveNfa_2(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 3;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((0x2400L & l) != 0L)
-                  {
-                     if (kind > 10)
-                        kind = 10;
-                  }
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               case 1:
-                  if (curChar == 10 && kind > 10)
-                     kind = 10;
-                  break;
-               case 2:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 1;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private int jjMoveStringLiteralDfa0_1()
-{
-   return jjMoveNfa_1(4, 0);
-}
-private int jjMoveNfa_1(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 4;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-                  if ((0xffffffffffffdbffL & l) != 0L)
-                  {
-                     if (kind > 9)
-                        kind = 9;
-                     jjCheckNAddStates(42, 44);
-                  }
-                  else if ((0x2400L & l) != 0L)
-                  {
-                     if (kind > 9)
-                        kind = 9;
-                  }
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 2;
-                  break;
-               case 0:
-                  if ((0xffffffffffffdbffL & l) == 0L)
-                     break;
-                  kind = 9;
-                  jjCheckNAddStates(42, 44);
-                  break;
-               case 1:
-                  if ((0x2400L & l) != 0L && kind > 9)
-                     kind = 9;
-                  break;
-               case 2:
-                  if (curChar == 10 && kind > 9)
-                     kind = 9;
-                  break;
-               case 3:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 2;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-               case 0:
-                  kind = 9;
-                  jjCheckNAddStates(42, 44);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-               case 0:
-                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 9)
-                     kind = 9;
-                  jjCheckNAddStates(42, 44);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 4 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-static final int[] jjnextStates = {
-   30, 31, 36, 37, 40, 41, 8, 19, 20, 22, 10, 12, 45, 47, 2, 4, 
-   5, 8, 19, 20, 24, 22, 32, 33, 8, 40, 41, 8, 6, 7, 13, 14, 
-   16, 21, 23, 25, 34, 35, 38, 39, 42, 43, 0, 1, 3, 
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec2[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec0[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec4[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec6[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec7[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec8[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec9[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec10[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec11[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec12[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec13[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec14[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec15[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec16[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec17[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec18[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec21[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec23[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec24[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec27[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec29[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec36[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec38[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec39[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec4[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec6[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec7[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec8[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec40[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec10[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec41[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec42[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec43[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec44[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec45[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec46[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec17[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec47[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec21[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec23[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec24[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec27[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec29[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec36[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec38[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec39[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-
-/** Token literal values. */
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, null, null, null, null, null, 
-"\141\142\163\164\162\141\143\164", "\141\163\163\145\162\164", "\142\157\157\154\145\141\156", 
-"\142\162\145\141\153", "\142\171\164\145", "\143\141\163\145", "\143\141\164\143\150", 
-"\143\150\141\162", "\143\154\141\163\163", "\143\157\156\163\164", 
-"\143\157\156\164\151\156\165\145", "\144\145\146\141\165\154\164", "\144\157", "\144\157\165\142\154\145", 
-"\145\154\163\145", "\145\156\165\155", "\145\170\164\145\156\144\163", "\146\141\154\163\145", 
-"\146\151\156\141\154", "\146\151\156\141\154\154\171", "\146\154\157\141\164", "\146\157\162", 
-"\147\157\164\157", "\151\146", "\151\155\160\154\145\155\145\156\164\163", 
-"\151\155\160\157\162\164", "\151\156\163\164\141\156\143\145\157\146", "\151\156\164", 
-"\151\156\164\145\162\146\141\143\145", "\154\157\156\147", "\156\141\164\151\166\145", "\156\145\167", 
-"\156\165\154\154", "\160\141\143\153\141\147\145", "\160\162\151\166\141\164\145", 
-"\160\162\157\164\145\143\164\145\144", "\160\165\142\154\151\143", "\162\145\164\165\162\156", 
-"\163\150\157\162\164", "\163\164\141\164\151\143", "\163\164\162\151\143\164\146\160", 
-"\163\165\160\145\162", "\163\167\151\164\143\150", 
-"\163\171\156\143\150\162\157\156\151\172\145\144", "\164\150\151\163", "\164\150\162\157\167", "\164\150\162\157\167\163", 
-"\164\162\141\156\163\151\145\156\164", "\164\162\165\145", "\164\162\171", "\166\157\151\144", 
-"\166\157\154\141\164\151\154\145", "\167\150\151\154\145", null, null, null, null, null, null, null, null, null, 
-null, null, "\50", "\51", "\173", "\175", "\133", "\135", "\73", "\54", "\56", 
-"\100", "\75", "\76", "\74", "\41", "\176", "\77", "\72", "\75\75", "\74\75", 
-"\76\75", "\41\75", "\174\174", "\46\46", "\53\53", "\55\55", "\53", "\55", "\52", 
-"\57", "\46", "\174", "\136", "\45", "\74\74", "\53\75", "\55\75", "\52\75", 
-"\57\75", "\46\75", "\174\75", "\136\75", "\45\75", "\74\74\75", "\76\76\75", 
-"\76\76\76\75", "\56\56\56", };
-
-/** Lexer state names. */
-public static final String[] lexStateNames = {
-   "DEFAULT",
-   "IN_SINGLE_LINE_COMMENT",
-   "IN_MULTI_LINE_COMMENT",
-};
-
-/** Lex State array. */
-public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, -1, 2, 1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xffffffffffffe001L, 0x7ffffffffffe747L, 
-};
-static final long[] jjtoSkip = {
-   0xf7eL, 0x0L, 
-};
-static final long[] jjtoSpecial = {
-   0xf00L, 0x0L, 
-};
-static final long[] jjtoMore = {
-   0x1080L, 0x0L, 
-};
-protected JavaCharStream input_stream;
-private final int[] jjrounds = new int[48];
-private final int[] jjstateSet = new int[96];
-private final StringBuffer jjimage = new StringBuffer();
-private StringBuffer image = jjimage;
-private int jjimageLen;
-private int lengthOfMatch;
-protected char curChar;
-/** Constructor. */
-public JavaParserDebugTokenManager(JavaCharStream stream){
-   if (JavaCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-
-/** Constructor. */
-public JavaParserDebugTokenManager(JavaCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
-
-/** Reinitialise parser. */
-public void ReInit(JavaCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 48; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-
-/** Reinitialise parser. */
-public void ReInit(JavaCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-
-/** Switch to specified lex state. */
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 3 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   final Token t;
-   final String curTokenImage;
-   final int beginLine;
-   final int endLine;
-   final int beginColumn;
-   final int endColumn;
-   if (jjmatchedPos < 0)
-   {
-      if (image == null)
-         curTokenImage = "";
-      else
-         curTokenImage = image.toString();
-      beginLine = endLine = input_stream.getBeginLine();
-      beginColumn = endColumn = input_stream.getBeginColumn();
-   }
-   else
-   {
-      String im = jjstrLiteralImages[jjmatchedKind];
-      curTokenImage = (im == null) ? input_stream.GetImage() : im;
-      beginLine = input_stream.getBeginLine();
-      beginColumn = input_stream.getBeginColumn();
-      endLine = input_stream.getEndLine();
-      endColumn = input_stream.getEndColumn();
-   }
-   t = Token.newToken(jjmatchedKind, curTokenImage);
-
-   t.beginLine = beginLine;
-   t.endLine = endLine;
-   t.beginColumn = beginColumn;
-   t.endColumn = endColumn;
-
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-/** Get the next Token. */
-public Token getNextToken() 
-{
-  Token specialToken = null;
-  Token matchedToken;
-  int curPos = 0;
-
-  EOFLoop :
-  for (;;)
-  {
-   try
-   {
-      curChar = input_stream.BeginToken();
-   }
-   catch(java.io.IOException e)
-   {
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      matchedToken.specialToken = specialToken;
-      return matchedToken;
-   }
-   image = jjimage;
-   image.setLength(0);
-   jjimageLen = 0;
-
-   for (;;)
-   {
-     switch(curLexState)
-     {
-       case 0:
-         try { input_stream.backup(0);
-            while (curChar <= 32 && (0x104003600L & (1L << curChar)) != 0L)
-               curChar = input_stream.BeginToken();
-         }
-         catch (java.io.IOException e1) { continue EOFLoop; }
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_0();
-         break;
-       case 1:
-         jjmatchedKind = 9;
-         jjmatchedPos = -1;
-         curPos = 0;
-         curPos = jjMoveStringLiteralDfa0_1();
-         if (jjmatchedPos < 0 || (jjmatchedPos == 0 && jjmatchedKind > 12))
-         {
-            jjmatchedKind = 12;
-            jjmatchedPos = 0;
-         }
-         break;
-       case 2:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_2();
-         if (jjmatchedPos == 0 && jjmatchedKind > 12)
-         {
-            jjmatchedKind = 12;
-         }
-         break;
-     }
-     if (jjmatchedKind != 0x7fffffff)
-     {
-        if (jjmatchedPos + 1 < curPos)
-           input_stream.backup(curPos - jjmatchedPos - 1);
-        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           matchedToken = jjFillToken();
-           matchedToken.specialToken = specialToken;
-       if (jjnewLexState[jjmatchedKind] != -1)
-         curLexState = jjnewLexState[jjmatchedKind];
-           return matchedToken;
-        }
-        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-           {
-              matchedToken = jjFillToken();
-              if (specialToken == null)
-                 specialToken = matchedToken;
-              else
-              {
-                 matchedToken.specialToken = specialToken;
-                 specialToken = (specialToken.next = matchedToken);
-              }
-              SkipLexicalActions(matchedToken);
-           }
-           else
-              SkipLexicalActions(null);
-         if (jjnewLexState[jjmatchedKind] != -1)
-           curLexState = jjnewLexState[jjmatchedKind];
-           continue EOFLoop;
-        }
-        MoreLexicalActions();
-      if (jjnewLexState[jjmatchedKind] != -1)
-        curLexState = jjnewLexState[jjmatchedKind];
-        curPos = 0;
-        jjmatchedKind = 0x7fffffff;
-        try {
-           curChar = input_stream.readChar();
-           continue;
-        }
-        catch (java.io.IOException e1) { }
-     }
-     int error_line = input_stream.getEndLine();
-     int error_column = input_stream.getEndColumn();
-     String error_after = null;
-     boolean EOFSeen = false;
-     try { input_stream.readChar(); input_stream.backup(1); }
-     catch (java.io.IOException e1) {
-        EOFSeen = true;
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-        if (curChar == '\n' || curChar == '\r') {
-           error_line++;
-           error_column = 0;
-        }
-        else
-           error_column++;
-     }
-     if (!EOFSeen) {
-        input_stream.backup(1);
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-     }
-     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-   }
-  }
-}
-
-void SkipLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      case 8 :
-         image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                 _iSingleComments++;
-         break;
-      case 10 :
-         image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                               _iMultiComments++; _iMultiCommentsLast++;
-         break;
-      case 11 :
-         image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-                                  _iMultiComments++; _iMultiCommentsLast++;
-         break;
-      default :
-         break;
-   }
-}
-void MoreLexicalActions()
-{
-   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
-   switch(jjmatchedKind)
-   {
-      case 7 :
-         image.append(input_stream.GetSuffix(jjimageLen));
-         jjimageLen = 0;
-         _iMultiCommentsLast = 0;
-         break;
-      default :
-         break;
-   }
-}
-private void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-
-private void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/debug/ParseException.java b/src/net/sourceforge/cobertura/javancss/parser/debug/ParseException.java
deleted file mode 100644
index d4c299b..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/debug/ParseException.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 4.1 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
-//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
-package net.sourceforge.cobertura.javancss.parser.debug;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.  The boolean
-   * flag "specialConstructor" is also set to true to indicate that
-   * this constructor was used to create this object.
-   * This constructor calls its super class with the empty string
-   * to force the "toString" method of parent class "Throwable" to
-   * print the error message in the form:
-   *     ParseException: <result of getMessage>
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super("");
-    specialConstructor = true;
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-    specialConstructor = false;
-  }
-
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-    specialConstructor = false;
-  }
-
-  /**
-   * This variable determines which constructor was used to create
-   * this object and thereby affects the semantics of the
-   * "getMessage" method (see below).
-   */
-  protected boolean specialConstructor;
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * This method has the standard behavior when this object has been
-   * created using the standard constructors.  Otherwise, it uses
-   * "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser), then this method is called during the printing
-   * of the final stack trace, and hence the correct error message
-   * gets displayed.
-   */
-  public String getMessage() {
-    if (!specialConstructor) {
-      return super.getMessage();
-    }
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-    retval += expected.toString();
-    return retval;
-  }
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  protected String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-}
-/* JavaCC - OriginalChecksum=1dc25ef3bbdc3cc4c510b31013f38e78 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/debug/Token.java b/src/net/sourceforge/cobertura/javancss/parser/debug/Token.java
deleted file mode 100644
index 7500ccd..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/debug/Token.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 4.1 */
-/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null */
-//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
-package net.sourceforge.cobertura.javancss.parser.debug;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /** The line number of the first character of this Token. */
-  public int beginLine;
-  /** The column number of the first character of this Token. */
-  public int beginColumn;
-  /** The line number of the last character of this Token. */
-  public int endLine;
-  /** The column number of the last character of this Token. */
-  public int endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * An optional attribute value of the Token.
-   * Tokens which are not used as syntactic sugar will often contain
-   * meaningful values that will be used later on by the compiler or
-   * interpreter. This attribute value is often different from the image.
-   * Any subclass of Token that actually wants to return a non-null value can
-   * override this method as appropriate.
-   */
-  public Object getValue() {
-    return null;
-  }
-
-  /**
-   * No-argument constructor
-   */
-  public Token() {}
-
-  /**
-   * Constructs a new token for the specified Image.
-   */
-  public Token(int kind)
-  {
-     this(kind, null);
-  }
-
-  /**
-   * Constructs a new token for the specified Image and Kind.
-   */
-  public Token(int kind, String image)
-  {
-     this.kind = kind;
-     this.image = image;
-  }
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-     return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simply add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use sit in your lexical actions.
-   */
-  public static Token newToken(int ofKind, String image)
-  {
-     switch(ofKind)
-     {
-       default : return new Token(ofKind, image);
-     }
-  }
-
-  public static Token newToken(int ofKind)
-  {
-     return newToken(ofKind, null);
-  }
-
-}
-/* JavaCC - OriginalChecksum=15522ecc409e4693bb99cff1a147148b (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/debug/TokenMgrError.java b/src/net/sourceforge/cobertura/javancss/parser/debug/TokenMgrError.java
deleted file mode 100644
index c2a91c7..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/debug/TokenMgrError.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 4.1 */
-/* JavaCCOptions: */
-//cobertura - put the import on its own line - otherwise, it messes up the script that changes the package.
-package net.sourceforge.cobertura.javancss.parser.debug;
-
-/** Token Manager Error. */
-public class TokenMgrError extends Error
-{
-
-   /*
-    * Ordinals for various reasons why an Error of this type can be thrown.
-    */
-
-   /**
-    * Lexical error occurred.
-    */
-   static final int LEXICAL_ERROR = 0;
-
-   /**
-    * An attempt was made to create a second instance of a static token manager.
-    */
-   static final int STATIC_LEXER_ERROR = 1;
-
-   /**
-    * Tried to change to an invalid lexical state.
-    */
-   static final int INVALID_LEXICAL_STATE = 2;
-
-   /**
-    * Detected (and bailed out of) an infinite loop in the token manager.
-    */
-   static final int LOOP_DETECTED = 3;
-
-   /**
-    * Indicates the reason why the exception is thrown. It will have
-    * one of the above 4 values.
-    */
-   int errorCode;
-
-   /**
-    * Replaces unprintable characters by their escaped (or unicode escaped)
-    * equivalents in the given string
-    */
-   protected static final String addEscapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-   /**
-    * Returns a detailed message for the Error when it is thrown by the
-    * token manager to indicate a lexical error.
-    * Parameters :
-    *    EOFSeen     : indicates if EOF caused the lexical error
-    *    curLexState : lexical state in which this error occurred
-    *    errorLine   : line number when the error occurred
-    *    errorColumn : column number when the error occurred
-    *    errorAfter  : prefix that was seen before this error occurred
-    *    curchar     : the offending character
-    * Note: You can customize the lexical error message by modifying this method.
-    */
-   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-      return("Lexical error at line " +
-           errorLine + ", column " +
-           errorColumn + ".  Encountered: " +
-           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-           "after : \"" + addEscapes(errorAfter) + "\"");
-   }
-
-   /**
-    * You can also modify the body of this method to customize your error messages.
-    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-    * of end-users concern, so you can return something like :
-    *
-    *     "Internal Error : Please file a bug report .... "
-    *
-    * from this method for such cases in the release version of your parser.
-    */
-   public String getMessage() {
-      return super.getMessage();
-   }
-
-   /*
-    * Constructors of various flavors follow.
-    */
-
-   /** No arg constructor. */
-   public TokenMgrError() {
-   }
-
-   /** Constructor with message and reason. */
-   public TokenMgrError(String message, int reason) {
-      super(message);
-      errorCode = reason;
-   }
-
-   /** Full Constructor. */
-   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-   }
-}
-/* JavaCC - OriginalChecksum=78b83ead2b9be6e85dfd6cf582647f66 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaCharStream.java b/src/net/sourceforge/cobertura/javancss/parser/java15/JavaCharStream.java
deleted file mode 100644
index 6036ec8..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaCharStream.java
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 4.1 */
-/* JavaCCOptions:STATIC=false */
-package net.sourceforge.cobertura.javancss.parser.java15;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (with java-like unicode escape processing).
- */
-
-public class JavaCharStream
-{
-/** Whether parser is static. */
-  public static final boolean staticFlag = false;
-  static final int hexval(char c) throws java.io.IOException {
-    switch(c)
-    {
-       case '0' :
-          return 0;
-       case '1' :
-          return 1;
-       case '2' :
-          return 2;
-       case '3' :
-          return 3;
-       case '4' :
-          return 4;
-       case '5' :
-          return 5;
-       case '6' :
-          return 6;
-       case '7' :
-          return 7;
-       case '8' :
-          return 8;
-       case '9' :
-          return 9;
-
-       case 'a' :
-       case 'A' :
-          return 10;
-       case 'b' :
-       case 'B' :
-          return 11;
-       case 'c' :
-       case 'C' :
-          return 12;
-       case 'd' :
-       case 'D' :
-          return 13;
-       case 'e' :
-       case 'E' :
-          return 14;
-       case 'f' :
-       case 'F' :
-          return 15;
-    }
-
-    throw new java.io.IOException(); // Should never come here
-  }
-
-/** Position in buffer. */
-  public int bufpos = -1;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] nextCharBuf;
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int nextCharInd = -1;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-     char[] newbuffer = new char[bufsize + 2048];
-     int newbufline[] = new int[bufsize + 2048];
-     int newbufcolumn[] = new int[bufsize + 2048];
-
-     try
-     {
-        if (wrapAround)
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           System.arraycopy(buffer, 0, newbuffer,
-                                             bufsize - tokenBegin, bufpos);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-           bufcolumn = newbufcolumn;
-
-           bufpos += (bufsize - tokenBegin);
-        }
-        else
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           bufcolumn = newbufcolumn;
-
-           bufpos -= tokenBegin;
-        }
-     }
-     catch (Throwable t)
-     {
-        throw new Error(t.getMessage());
-     }
-
-     available = (bufsize += 2048);
-     tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-     int i;
-     if (maxNextCharInd == 4096)
-        maxNextCharInd = nextCharInd = 0;
-
-     try {
-        if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
-                                            4096 - maxNextCharInd)) == -1)
-        {
-           inputStream.close();
-           throw new java.io.IOException();
-        }
-        else
-           maxNextCharInd += i;
-        return;
-     }
-     catch(java.io.IOException e) {
-        if (bufpos != 0)
-        {
-           --bufpos;
-           backup(0);
-        }
-        else
-        {
-           bufline[bufpos] = line;
-           bufcolumn[bufpos] = column;
-        }
-        throw e;
-     }
-  }
-
-  protected char ReadByte() throws java.io.IOException
-  {
-     if (++nextCharInd >= maxNextCharInd)
-        FillBuff();
-
-     return nextCharBuf[nextCharInd];
-  }
-
-/** @return starting character for token. */
-  public char BeginToken() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        tokenBegin = bufpos;
-        return buffer[bufpos];
-     }
-
-     tokenBegin = 0;
-     bufpos = -1;
-
-     return readChar();
-  }
-
-  protected void AdjustBuffSize()
-  {
-     if (available == bufsize)
-     {
-        if (tokenBegin > 2048)
-        {
-           bufpos = 0;
-           available = tokenBegin;
-        }
-        else
-           ExpandBuff(false);
-     }
-     else if (available > tokenBegin)
-        available = bufsize;
-     else if ((tokenBegin - available) < 2048)
-        ExpandBuff(true);
-     else
-        available = tokenBegin;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-     column++;
-
-     if (prevCharIsLF)
-     {
-        prevCharIsLF = false;
-        line += (column = 1);
-     }
-     else if (prevCharIsCR)
-     {
-        prevCharIsCR = false;
-        if (c == '\n')
-        {
-           prevCharIsLF = true;
-        }
-        else
-           line += (column = 1);
-     }
-
-     switch (c)
-     {
-        case '\r' :
-           prevCharIsCR = true;
-           break;
-        case '\n' :
-           prevCharIsLF = true;
-           break;
-        case '\t' :
-           column--;
-           column += (tabSize - (column % tabSize));
-           break;
-        default :
-           break;
-     }
-
-     bufline[bufpos] = line;
-     bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        return buffer[bufpos];
-     }
-
-     char c;
-
-     if (++bufpos == available)
-        AdjustBuffSize();
-
-     if ((buffer[bufpos] = c = ReadByte()) == '\\')
-     {
-        UpdateLineColumn(c);
-
-        int backSlashCnt = 1;
-
-        for (;;) // Read all the backslashes
-        {
-           if (++bufpos == available)
-              AdjustBuffSize();
-
-           try
-           {
-              if ((buffer[bufpos] = c = ReadByte()) != '\\')
-              {
-                 UpdateLineColumn(c);
-                 // found a non-backslash char.
-                 if ((c == 'u') && ((backSlashCnt & 1) == 1))
-                 {
-                    if (--bufpos < 0)
-                       bufpos = bufsize - 1;
-
-                    break;
-                 }
-
-                 backup(backSlashCnt);
-                 return '\\';
-              }
-           }
-           catch(java.io.IOException e)
-           {
-              if (backSlashCnt > 1)
-                 backup(backSlashCnt-1);
-
-              return '\\';
-           }
-
-           UpdateLineColumn(c);
-           backSlashCnt++;
-        }
-
-        // Here, we have seen an odd number of backslash's followed by a 'u'
-        try
-        {
-           while ((c = ReadByte()) == 'u')
-              ++column;
-
-           buffer[bufpos] = c = (char)(hexval(c) << 12 |
-                                       hexval(ReadByte()) << 8 |
-                                       hexval(ReadByte()) << 4 |
-                                       hexval(ReadByte()));
-
-           column += 4;
-        }
-        catch(java.io.IOException e)
-        {
-           throw new Error("Invalid escape character at line " + line +
-                                         " column " + column + ".");
-        }
-
-        if (backSlashCnt == 1)
-           return c;
-        else
-        {
-           backup(backSlashCnt - 1);
-           return '\\';
-        }
-     }
-     else
-     {
-        UpdateLineColumn(c);
-        return c;
-     }
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-  public int getColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-  public int getLine() {
-     return bufline[bufpos];
-  }
-
-/** Get end column. */
-  public int getEndColumn() {
-     return bufcolumn[bufpos];
-  }
-
-/** Get end line. */
-  public int getEndLine() {
-     return bufline[bufpos];
-  }
-
-/** @return column of token start */
-  public int getBeginColumn() {
-     return bufcolumn[tokenBegin];
-  }
-
-/** @return line number of token start */
-  public int getBeginLine() {
-     return bufline[tokenBegin];
-  }
-
-/** Retreat. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-       bufpos += bufsize;
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-    nextCharBuf = new char[4096];
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-      nextCharBuf = new char[4096];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    nextCharInd = bufpos = -1;
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-                        int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-                        int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-
-  /** @return token image as String */
-  public String GetImage()
-  {
-     if (bufpos >= tokenBegin)
-        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-     else
-        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  /** @return suffix */
-  public char[] GetSuffix(int len)
-  {
-     char[] ret = new char[len];
-
-     if ((bufpos + 1) >= len)
-        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-     else
-     {
-        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                          len - bufpos - 1);
-        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-     }
-
-     return ret;
-  }
-
-  /** Set buffers back to null when finished. */
-  public void Done()
-  {
-     nextCharBuf = null;
-     buffer = null;
-     bufline = null;
-     bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-     int start = tokenBegin;
-     int len;
-
-     if (bufpos >= tokenBegin)
-     {
-        len = bufpos - tokenBegin + inBuf + 1;
-     }
-     else
-     {
-        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-     }
-
-     int i = 0, j = 0, k = 0;
-     int nextColDiff = 0, columnDiff = 0;
-
-     while (i < len &&
-            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-     {
-        bufline[j] = newLine;
-        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-        bufcolumn[j] = newCol + columnDiff;
-        columnDiff = nextColDiff;
-        i++;
-     }
-
-     if (i < len)
-     {
-        bufline[j] = newLine++;
-        bufcolumn[j] = newCol + columnDiff;
-
-        while (i++ < len)
-        {
-           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-              bufline[j] = newLine++;
-           else
-              bufline[j] = newLine;
-        }
-     }
-
-     line = bufline[j];
-     column = bufcolumn[j];
-  }
-
-}
-/* JavaCC - OriginalChecksum=ab048e2786fbd06222f7612d962d2e6e (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15.java b/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15.java
deleted file mode 100644
index ef1d642..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15.java
+++ /dev/null
@@ -1,6459 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParser15.java */
-package net.sourceforge.cobertura.javancss.parser.java15;
-
-import java.io.*;
-
-import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
-import java.util.*;
-
-import net.sourceforge.cobertura.javancss.FunctionMetric;
-import net.sourceforge.cobertura.javancss.ObjectMetric;
-import net.sourceforge.cobertura.javancss.PackageMetric;
-
-/**
- * Grammar to parse Java version 1.5
- * @author Sreenivasa Viswanadha - Simplified and enhanced for 1.5
- */
-public class JavaParser15 implements JavaParserInterface, JavaParser15Constants {
-    private boolean _bReturn         = false;
-    private int     _ncss            = 0;     // general counter
-    private int     _loc             = 0;
-    private int     _cyc             = 1;
-    private int     _localCases      = 0;
-    private String  _sName           = "";    // name of last token
-    private String  _sParameter      = "";
-    private String  _sPackage        = "";
-    private String  _sClass          = "";
-    private String  _sFunction       = "";
-    private int     _functions       = 0;     // number of functions in this class
-    //private int     _topLevelClasses = 0;
-    private int     _classes         = 0;
-    private int     _classLevel      = 0;
-    private int     _anonClassCount  = 1;
-
-    private int     _jvdcLines = 0;           // added by SMS
-    private int     _jvdc      = 0;
-    private boolean _bPrivate  = true;//false;        // added by SMS
-    private boolean _bPublic   = true;        // added by SMS
-
-    /**
-     * For each class the number of formal
-     * comments in toplevel methods, constructors, inner
-     * classes, and for the class itself are counted.
-     * The top level comment has to be directly before
-     * the class definition, not before the package or
-     * import statement as it is often seen in source code
-     * examples (at the beginning of your source files you
-     * should instead put your copyright notice).
-     */
-    private int    _javadocs   = 0;              // global javadocs
-    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
-
-    /** 
-     * Metrics for each class/interface are stored in this
-     * vector.
-     */
-    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
-    private List _vImports = new ArrayList();
-    private Object[] _aoPackage = null;
-    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
-    private PackageMetric _pPackageMetric;
-
-    private Token _tmpToken = null;
-    /** Argh, too much of a state machine. */
-    private Token _tmpResultToken = null;
-
-    private String _formatPackage(String sPackage_) {
-        if (sPackage_.equals("")) {
-            return ".";
-        }
-
-        return sPackage_.substring(0, sPackage_.length() - 1);
-    }
-
-
-    public void parse() throws Exception {
-      CompilationUnit();
-    }
-
-    public void parseImportUnit() throws Exception {
-      ImportUnit();
-    }
-
-    public int getNcss() {
-        return _ncss;
-    }
-
-    public int getLOC() {
-        return _loc;
-    }
-
-    // added by SMS
-    public int getJvdc() {
-        return _jvdc;
-    }
-
-    /*public int getTopLevelClasses() {
-      return _topLevelClasses;
-      }*/
-
-    public List/*<FunctionMetric>*/ getFunction() {
-        return _vFunctions;
-    }
-
-    /**
-     * @return Top level classes in sorted order
-     */
-    public List/*<ObjectMetric>*/ getObject() {
-        Collections.sort(_vClasses);
-        return _vClasses;
-    }
-
-    /**
-     * @return The empty package consists of the name ".".
-     */
-    public Map/*<String,PackageMetric>*/ getPackage() {
-        return _htPackage;
-    }
-
-    public List getImports() {
-        return _vImports;
-    }
-
-    /**
-     * name, beginLine, ...
-     */
-    public Object[] getPackageObjects() {
-        return _aoPackage;
-    }
-
-    /**
-     * if javancss is used with cat *.java a long
-     * input stream might get generated, so line
-     * number information in case of an parse exception
-     * is not very useful.
-     */
-    public String getLastFunction() {
-        return _sPackage + _sClass + _sFunction;
-    }
-   /**
-    * Class to hold modifiers.
-    */
-   static public final class ModifierSet
-   {
-     /* Definitions of the bits in the modifiers field.  */
-     public static final int PUBLIC = 0x0001;
-     public static final int PROTECTED = 0x0002;
-     public static final int PRIVATE = 0x0004;
-     public static final int ABSTRACT = 0x0008;
-     public static final int STATIC = 0x0010;
-     public static final int FINAL = 0x0020;
-     public static final int SYNCHRONIZED = 0x0040;
-     public static final int NATIVE = 0x0080;
-     public static final int TRANSIENT = 0x0100;
-     public static final int VOLATILE = 0x0200;
-     public static final int STRICTFP = 0x1000;
-
-     /** A set of accessors that indicate whether the specified modifier
-         is in the set. */
-
-     public boolean isPublic(int modifiers)
-     {
-       return (modifiers & PUBLIC) != 0;
-     }
-
-     public boolean isProtected(int modifiers)
-     {
-       return (modifiers & PROTECTED) != 0;
-     }
-
-     public boolean isPrivate(int modifiers)
-     {
-       return (modifiers & PRIVATE) != 0;
-     }
-
-     public boolean isStatic(int modifiers)
-     {
-       return (modifiers & STATIC) != 0;
-     }
-
-     public boolean isAbstract(int modifiers)
-     {
-       return (modifiers & ABSTRACT) != 0;
-     }
-
-     public boolean isFinal(int modifiers)
-     {
-       return (modifiers & FINAL) != 0;
-     }
-
-     public boolean isNative(int modifiers)
-     {
-       return (modifiers & NATIVE) != 0;
-     }
-
-     public boolean isStrictfp(int modifiers)
-     {
-       return (modifiers & STRICTFP) != 0;
-     }
-
-     public boolean isSynchronized(int modifiers)
-     {
-       return (modifiers & SYNCHRONIZED) != 0;
-     }
-
-     public boolean isTransient(int modifiers)
-      {
-       return (modifiers & TRANSIENT) != 0;
-     }
-
-     public boolean isVolatile(int modifiers)
-     {
-       return (modifiers & VOLATILE) != 0;
-     }
-
-     /**
-      * Removes the given modifier.
-      */
-     static int removeModifier(int modifiers, int mod)
-     {
-        return modifiers & ~mod;
-     }
-   }
-
-   public JavaParser15(String fileName)
-   {
-      this(System.in);
-      try { ReInit(new FileInputStream(new File(fileName))); }
-      catch(Exception e) { e.printStackTrace(); }
-   }
-
-  public static void main(String args[]) {
-    JavaParser15 parser;
-    if (args.length == 0) {
-      System.out.println("Java Parser Version 1.5:  Reading from standard input . . .");
-      parser = new JavaParser15(System.in);
-    } else if (args.length == 1) {
-      System.out.println("Java Parser Version 1.5:  Reading from file " + args[0] + " . . .");
-      try {
-        parser = new JavaParser15(new java.io.FileInputStream(args[0]));
-      } catch (java.io.FileNotFoundException e) {
-        System.out.println("Java Parser Version 1.5:  File " + args[0] + " not found.");
-        return;
-      }
-    } else {
-      System.out.println("Java Parser Version 1.5:  Usage is one of:");
-      System.out.println("         java javancss.parser.java15.JavaParser15 < inputfile");
-      System.out.println("OR");
-      System.out.println("         java javancss.parser.java15.JavaParser15 inputfile");
-      return;
-    }
-    try {
-      parser.CompilationUnit();
-      System.out.println("Java Parser Version 1.1:  Java program parsed successfully.");
-    } catch (ParseException e) {
-      System.out.println(e.getMessage());
-      System.out.println("Java Parser Version 1.1:  Encountered errors during parse.");
-    }
-  }
-
-/*****************************************
- * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
- *****************************************/
-
-/*
- * Program structuring syntax follows.
- */
-  final public void CompilationUnit() throws ParseException {
-    if (jj_2_1(2147483647)) {
-      PackageDeclaration();
-    } else {
-      ;
-    }
-    label_1:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPORT:
-        ;
-        break;
-      default:
-        break label_1;
-      }
-      ImportDeclaration();
-    }
-    label_2:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case CLASS:
-      case ENUM:
-      case FINAL:
-      case INTERFACE:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case SEMICOLON:
-      case AT:
-        ;
-        break;
-      default:
-        break label_2;
-      }
-      TypeDeclaration();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case 127:
-      jj_consume_token(127);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case STUFF_TO_IGNORE:
-      jj_consume_token(STUFF_TO_IGNORE);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(0);
-  }
-
-  final public void PackageDeclaration() throws ParseException {
-    Modifiers();
-    jj_consume_token(PACKAGE);
-    Name();
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void ImportUnit() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case FINAL:
-    case NATIVE:
-    case PACKAGE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case STATIC:
-    case STRICTFP:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case AT:
-      PackageDeclaration();
-      break;
-    default:
-      ;
-    }
-    label_3:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPORT:
-        ;
-        break;
-      default:
-        break label_3;
-      }
-      ImportDeclaration();
-    }
-    label_4:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case PUBLIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-        ;
-        break;
-      default:
-        break label_4;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-        break;
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-        break;
-      case SYNCHRONIZED:
-        jj_consume_token(SYNCHRONIZED);
-        break;
-      case STRICTFP:
-        jj_consume_token(STRICTFP);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case CLASS:
-      jj_consume_token(CLASS);
-      break;
-    case INTERFACE:
-      jj_consume_token(INTERFACE);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ImportDeclaration() throws ParseException {
-    jj_consume_token(IMPORT);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case STATIC:
-      jj_consume_token(STATIC);
-      break;
-    default:
-      ;
-    }
-    Name();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case DOT:
-      jj_consume_token(DOT);
-      jj_consume_token(STAR);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-  }
-
-/*
- * Modifiers. We match all modifiers in a single rule to reduce the chances of
- * syntax errors for simple modifier mistakes. It will also enable us to give
- * better error messages.
- */
-  final public int Modifiers() throws ParseException {
-   int modifiers = 0;
-    label_5:
-    while (true) {
-      if (jj_2_2(2)) {
-        ;
-      } else {
-        break label_5;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-              modifiers |= ModifierSet.PUBLIC;
-        break;
-      case STATIC:
-        jj_consume_token(STATIC);
-              modifiers |= ModifierSet.STATIC;
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-                 modifiers |= ModifierSet.PROTECTED;
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-               modifiers |= ModifierSet.PRIVATE;
-        break;
-      case FINAL:
-        jj_consume_token(FINAL);
-             modifiers |= ModifierSet.FINAL;
-        break;
-      case ABSTRACT:
-        jj_consume_token(ABSTRACT);
-                modifiers |= ModifierSet.ABSTRACT;
-        break;
-      case SYNCHRONIZED:
-        jj_consume_token(SYNCHRONIZED);
-                    modifiers |= ModifierSet.SYNCHRONIZED;
-        break;
-      case NATIVE:
-        jj_consume_token(NATIVE);
-              modifiers |= ModifierSet.NATIVE;
-        break;
-      case TRANSIENT:
-        jj_consume_token(TRANSIENT);
-                 modifiers |= ModifierSet.TRANSIENT;
-        break;
-      case VOLATILE:
-        jj_consume_token(VOLATILE);
-                modifiers |= ModifierSet.VOLATILE;
-        break;
-      case STRICTFP:
-        jj_consume_token(STRICTFP);
-                modifiers |= ModifierSet.STRICTFP;
-        break;
-      case AT:
-        Annotation();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    {if (true) return modifiers;}
-    throw new Error("Missing return statement in function");
-  }
-
-/*
- * Declaration syntax follows.
- */
-  final public void TypeDeclaration() throws ParseException {
-   int modifiers;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case SEMICOLON:
-      jj_consume_token(SEMICOLON);
-      break;
-    case ABSTRACT:
-    case CLASS:
-    case ENUM:
-    case FINAL:
-    case INTERFACE:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case STATIC:
-    case STRICTFP:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case AT:
-      modifiers = Modifiers();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CLASS:
-      case INTERFACE:
-        ClassOrInterfaceDeclaration(modifiers);
-        break;
-      case ENUM:
-        EnumDeclaration(modifiers);
-        break;
-      case AT:
-        AnnotationTypeDeclaration(modifiers);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ClassOrInterfaceDeclaration(int modifiers) throws ParseException {
-   boolean isInterface = false;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case CLASS:
-      jj_consume_token(CLASS);
-      break;
-    case INTERFACE:
-      jj_consume_token(INTERFACE);
-                            isInterface = true;
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    jj_consume_token(IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      ExtendsList(isInterface);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IMPLEMENTS:
-      ImplementsList(isInterface);
-      break;
-    default:
-      ;
-    }
-    ClassOrInterfaceBody(isInterface);
-  }
-
-  final public void ExtendsList(boolean isInterface) throws ParseException {
-   boolean extendsMoreThanOne = false;
-    jj_consume_token(EXTENDS);
-    ClassOrInterfaceType();
-    label_6:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_6;
-      }
-      jj_consume_token(COMMA);
-      ClassOrInterfaceType();
-                                  extendsMoreThanOne = true;
-    }
-      if (extendsMoreThanOne && !isInterface)
-         {if (true) throw new ParseException("A class cannot extend more than one other class");}
-  }
-
-  final public void ImplementsList(boolean isInterface) throws ParseException {
-    jj_consume_token(IMPLEMENTS);
-    ClassOrInterfaceType();
-    label_7:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_7;
-      }
-      jj_consume_token(COMMA);
-      ClassOrInterfaceType();
-    }
-      if (isInterface)
-         {if (true) throw new ParseException("An interface cannot implement other interfaces");}
-  }
-
-  final public void EnumDeclaration(int modifiers) throws ParseException {
-    jj_consume_token(ENUM);
-    jj_consume_token(IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IMPLEMENTS:
-      ImplementsList(false);
-      break;
-    default:
-      ;
-    }
-    EnumBody();
-  }
-
-  final public void EnumBody() throws ParseException {
-    jj_consume_token(LBRACE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case FINAL:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case STATIC:
-    case STRICTFP:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case IDENTIFIER:
-    case AT:
-      EnumConstant();
-      label_8:
-      while (true) {
-        if (jj_2_3(2)) {
-          ;
-        } else {
-          break label_8;
-        }
-        jj_consume_token(COMMA);
-        EnumConstant();
-      }
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COMMA:
-      jj_consume_token(COMMA);
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case SEMICOLON:
-      jj_consume_token(SEMICOLON);
-      label_9:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case LT:
-          ;
-          break;
-        default:
-          break label_9;
-        }
-        ClassOrInterfaceBodyDeclaration(false);
-      }
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void EnumConstant() throws ParseException {
-    Modifiers();
-    jj_consume_token(IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LPAREN:
-      Arguments();
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LBRACE:
-      ClassOrInterfaceBody(false);
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void TypeParameters() throws ParseException {
-    jj_consume_token(LT);
-    TypeParameter();
-    label_10:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_10;
-      }
-      jj_consume_token(COMMA);
-      TypeParameter();
-    }
-    jj_consume_token(GT);
-  }
-
-  final public void TypeParameter() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      TypeBound();
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void TypeBound() throws ParseException {
-    jj_consume_token(EXTENDS);
-    ClassOrInterfaceType();
-    label_11:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BIT_AND:
-        ;
-        break;
-      default:
-        break label_11;
-      }
-      jj_consume_token(BIT_AND);
-      ClassOrInterfaceType();
-    }
-  }
-
-  final public void ClassOrInterfaceBody(boolean isInterface) throws ParseException {
-    jj_consume_token(LBRACE);
-    label_12:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOID:
-      case VOLATILE:
-      case IDENTIFIER:
-      case LBRACE:
-      case SEMICOLON:
-      case AT:
-      case LT:
-        ;
-        break;
-      default:
-        break label_12;
-      }
-      ClassOrInterfaceBodyDeclaration(isInterface);
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void ClassOrInterfaceBodyDeclaration(boolean isInterface) throws ParseException {
-   boolean isNestedInterface = false;
-   int modifiers;
-    if (jj_2_6(2)) {
-      Initializer();
-     if (isInterface)
-        {if (true) throw new ParseException("An interface cannot have initializers");}
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOID:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-      case LT:
-        modifiers = Modifiers();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CLASS:
-        case INTERFACE:
-          ClassOrInterfaceDeclaration(modifiers);
-          break;
-        case ENUM:
-          EnumDeclaration(modifiers);
-          break;
-        default:
-          if (jj_2_4(2147483647)) {
-            ConstructorDeclaration();
-          } else if (jj_2_5(2147483647)) {
-            FieldDeclaration(modifiers);
-          } else {
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case BOOLEAN:
-            case BYTE:
-            case CHAR:
-            case DOUBLE:
-            case FLOAT:
-            case INT:
-            case LONG:
-            case SHORT:
-            case VOID:
-            case IDENTIFIER:
-            case LT:
-              MethodDeclaration(modifiers);
-              break;
-            default:
-              jj_consume_token(-1);
-              throw new ParseException();
-            }
-          }
-        }
-        break;
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void FieldDeclaration(int modifiers) throws ParseException {
-    Type();
-    VariableDeclarator();
-    label_13:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_13;
-      }
-      jj_consume_token(COMMA);
-      VariableDeclarator();
-    }
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void VariableDeclarator() throws ParseException {
-    VariableDeclaratorId();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSIGN:
-      jj_consume_token(ASSIGN);
-      VariableInitializer();
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void VariableDeclaratorId() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    label_14:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        ;
-        break;
-      default:
-        break label_14;
-      }
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-    }
-  }
-
-  final public void VariableInitializer() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LBRACE:
-      ArrayInitializer();
-      break;
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      Expression();
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ArrayInitializer() throws ParseException {
-    jj_consume_token(LBRACE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      VariableInitializer();
-      label_15:
-      while (true) {
-        if (jj_2_7(2)) {
-          ;
-        } else {
-          break label_15;
-        }
-        jj_consume_token(COMMA);
-        VariableInitializer();
-      }
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COMMA:
-      jj_consume_token(COMMA);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void MethodDeclaration(int modifiers) throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      ;
-    }
-    ResultType();
-    MethodDeclarator();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case THROWS:
-      jj_consume_token(THROWS);
-      NameList();
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LBRACE:
-      Block();
-      break;
-    case SEMICOLON:
-      jj_consume_token(SEMICOLON);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void MethodDeclarator() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    FormalParameters();
-    label_16:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        ;
-        break;
-      default:
-        break label_16;
-      }
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-    }
-  }
-
-  final public void FormalParameters() throws ParseException {
-    jj_consume_token(LPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FINAL:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case SHORT:
-    case STATIC:
-    case STRICTFP:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case IDENTIFIER:
-    case AT:
-      FormalParameter();
-      label_17:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_17;
-        }
-        jj_consume_token(COMMA);
-        FormalParameter();
-      }
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(RPAREN);
-  }
-
-  final public void FormalParameter() throws ParseException {
-    Modifiers();
-    Type();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ELLIPSIS:
-      jj_consume_token(ELLIPSIS);
-      break;
-    default:
-      ;
-    }
-    VariableDeclaratorId();
-  }
-
-  final public void ConstructorDeclaration() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeParameters();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(IDENTIFIER);
-    FormalParameters();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case THROWS:
-      jj_consume_token(THROWS);
-      NameList();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(LBRACE);
-    if (jj_2_8(2147483647)) {
-      ExplicitConstructorInvocation();
-    } else {
-      ;
-    }
-    label_18:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BREAK:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case CONTINUE:
-      case DO:
-      case DOUBLE:
-      case FALSE:
-      case FINAL:
-      case FLOAT:
-      case FOR:
-      case IF:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case RETURN:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SUPER:
-      case SWITCH:
-      case SYNCHRONIZED:
-      case THIS:
-      case THROW:
-      case TRANSIENT:
-      case TRUE:
-      case TRY:
-      case VOID:
-      case VOLATILE:
-      case WHILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
-      case AT:
-      case INCR:
-      case DECR:
-        ;
-        break;
-      default:
-        break label_18;
-      }
-      BlockStatement();
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void ExplicitConstructorInvocation() throws ParseException {
-    label_19:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IDENTIFIER:
-        ;
-        break;
-      default:
-        break label_19;
-      }
-      jj_consume_token(IDENTIFIER);
-      jj_consume_token(DOT);
-    }
-    if (jj_2_9(2)) {
-      jj_consume_token(THIS);
-      jj_consume_token(DOT);
-    } else {
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case LT:
-      TypeArguments();
-      break;
-    default:
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case THIS:
-      jj_consume_token(THIS);
-      break;
-    case SUPER:
-      jj_consume_token(SUPER);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    Arguments();
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void Initializer() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case STATIC:
-      jj_consume_token(STATIC);
-      break;
-    default:
-      ;
-    }
-    Block();
-  }
-
-/*
- * Type, name and expression syntax follows.
- */
-  final public void Type() throws ParseException {
-    if (jj_2_10(2)) {
-      ReferenceType();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-        PrimitiveType();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void ReferenceType() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case SHORT:
-      PrimitiveType();
-      label_20:
-      while (true) {
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-        if (jj_2_11(2)) {
-          ;
-        } else {
-          break label_20;
-        }
-      }
-      break;
-    case IDENTIFIER:
-      ClassOrInterfaceType();
-      label_21:
-      while (true) {
-        if (jj_2_12(2)) {
-          ;
-        } else {
-          break label_21;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ClassOrInterfaceType() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    if (jj_2_13(2)) {
-      TypeArguments();
-    } else {
-      ;
-    }
-    label_22:
-    while (true) {
-      if (jj_2_14(2)) {
-        ;
-      } else {
-        break label_22;
-      }
-      jj_consume_token(DOT);
-      jj_consume_token(IDENTIFIER);
-      if (jj_2_15(2)) {
-        TypeArguments();
-      } else {
-        ;
-      }
-    }
-  }
-
-  final public void TypeArguments() throws ParseException {
-    jj_consume_token(LT);
-    TypeArgument();
-    label_23:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_23;
-      }
-      jj_consume_token(COMMA);
-      TypeArgument();
-    }
-    jj_consume_token(GT);
-  }
-
-  final public void TypeArgument() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case SHORT:
-    case IDENTIFIER:
-      ReferenceType();
-      break;
-    case HOOK:
-      jj_consume_token(HOOK);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-      case SUPER:
-        WildcardBounds();
-        break;
-      default:
-        ;
-      }
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void WildcardBounds() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case EXTENDS:
-      jj_consume_token(EXTENDS);
-      ReferenceType();
-      break;
-    case SUPER:
-      jj_consume_token(SUPER);
-      ReferenceType();
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void PrimitiveType() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-      jj_consume_token(BOOLEAN);
-      break;
-    case CHAR:
-      jj_consume_token(CHAR);
-      break;
-    case BYTE:
-      jj_consume_token(BYTE);
-      break;
-    case SHORT:
-      jj_consume_token(SHORT);
-      break;
-    case INT:
-      jj_consume_token(INT);
-      break;
-    case LONG:
-      jj_consume_token(LONG);
-      break;
-    case FLOAT:
-      jj_consume_token(FLOAT);
-      break;
-    case DOUBLE:
-      jj_consume_token(DOUBLE);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ResultType() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case VOID:
-      jj_consume_token(VOID);
-      break;
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case SHORT:
-    case IDENTIFIER:
-      Type();
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void Name() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    label_24:
-    while (true) {
-      if (jj_2_16(2)) {
-        ;
-      } else {
-        break label_24;
-      }
-      jj_consume_token(DOT);
-      jj_consume_token(IDENTIFIER);
-    }
-  }
-
-  final public void NameList() throws ParseException {
-    Name();
-    label_25:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_25;
-      }
-      jj_consume_token(COMMA);
-      Name();
-    }
-  }
-
-/*
- * Expression syntax follows.
- */
-  final public void Expression() throws ParseException {
-    ConditionalExpression();
-    if (jj_2_17(2)) {
-      AssignmentOperator();
-      Expression();
-    } else {
-      ;
-    }
-  }
-
-  final public void AssignmentOperator() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ASSIGN:
-      jj_consume_token(ASSIGN);
-      break;
-    case STARASSIGN:
-      jj_consume_token(STARASSIGN);
-      break;
-    case SLASHASSIGN:
-      jj_consume_token(SLASHASSIGN);
-      break;
-    case REMASSIGN:
-      jj_consume_token(REMASSIGN);
-      break;
-    case PLUSASSIGN:
-      jj_consume_token(PLUSASSIGN);
-      break;
-    case MINUSASSIGN:
-      jj_consume_token(MINUSASSIGN);
-      break;
-    case LSHIFTASSIGN:
-      jj_consume_token(LSHIFTASSIGN);
-      break;
-    case RSIGNEDSHIFTASSIGN:
-      jj_consume_token(RSIGNEDSHIFTASSIGN);
-      break;
-    case RUNSIGNEDSHIFTASSIGN:
-      jj_consume_token(RUNSIGNEDSHIFTASSIGN);
-      break;
-    case ANDASSIGN:
-      jj_consume_token(ANDASSIGN);
-      break;
-    case XORASSIGN:
-      jj_consume_token(XORASSIGN);
-      break;
-    case ORASSIGN:
-      jj_consume_token(ORASSIGN);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void ConditionalExpression() throws ParseException {
-    ConditionalOrExpression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case HOOK:
-      jj_consume_token(HOOK);
-      Expression();
-      jj_consume_token(COLON);
-      Expression();
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void ConditionalOrExpression() throws ParseException {
-    ConditionalAndExpression();
-    label_26:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SC_OR:
-        ;
-        break;
-      default:
-        break label_26;
-      }
-      jj_consume_token(SC_OR);
-      ConditionalAndExpression();
-    }
-  }
-
-  final public void ConditionalAndExpression() throws ParseException {
-    InclusiveOrExpression();
-    label_27:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SC_AND:
-        ;
-        break;
-      default:
-        break label_27;
-      }
-      jj_consume_token(SC_AND);
-      InclusiveOrExpression();
-    }
-  }
-
-  final public void InclusiveOrExpression() throws ParseException {
-    ExclusiveOrExpression();
-    label_28:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BIT_OR:
-        ;
-        break;
-      default:
-        break label_28;
-      }
-      jj_consume_token(BIT_OR);
-      ExclusiveOrExpression();
-    }
-  }
-
-  final public void ExclusiveOrExpression() throws ParseException {
-    AndExpression();
-    label_29:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case XOR:
-        ;
-        break;
-      default:
-        break label_29;
-      }
-      jj_consume_token(XOR);
-      AndExpression();
-    }
-  }
-
-  final public void AndExpression() throws ParseException {
-    EqualityExpression();
-    label_30:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BIT_AND:
-        ;
-        break;
-      default:
-        break label_30;
-      }
-      jj_consume_token(BIT_AND);
-      EqualityExpression();
-    }
-  }
-
-  final public void EqualityExpression() throws ParseException {
-    InstanceOfExpression();
-    label_31:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EQ:
-      case NE:
-        ;
-        break;
-      default:
-        break label_31;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EQ:
-        jj_consume_token(EQ);
-        break;
-      case NE:
-        jj_consume_token(NE);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      InstanceOfExpression();
-    }
-  }
-
-  final public void InstanceOfExpression() throws ParseException {
-    RelationalExpression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INSTANCEOF:
-      jj_consume_token(INSTANCEOF);
-      Type();
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void RelationalExpression() throws ParseException {
-    ShiftExpression();
-    label_32:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-      case LE:
-      case GE:
-      case GT:
-        ;
-        break;
-      default:
-        break label_32;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        jj_consume_token(LT);
-        break;
-      case GT:
-        jj_consume_token(GT);
-        break;
-      case LE:
-        jj_consume_token(LE);
-        break;
-      case GE:
-        jj_consume_token(GE);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      ShiftExpression();
-    }
-  }
-
-  final public void ShiftExpression() throws ParseException {
-    AdditiveExpression();
-    label_33:
-    while (true) {
-      if (jj_2_18(1)) {
-        ;
-      } else {
-        break label_33;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LSHIFT:
-        jj_consume_token(LSHIFT);
-        break;
-      default:
-        if (jj_2_19(1)) {
-          RSIGNEDSHIFT();
-        } else if (jj_2_20(1)) {
-          RUNSIGNEDSHIFT();
-        } else {
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      AdditiveExpression();
-    }
-  }
-
-  final public void AdditiveExpression() throws ParseException {
-    MultiplicativeExpression();
-    label_34:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-      case MINUS:
-        ;
-        break;
-      default:
-        break label_34;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-        jj_consume_token(PLUS);
-        break;
-      case MINUS:
-        jj_consume_token(MINUS);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      MultiplicativeExpression();
-    }
-  }
-
-  final public void MultiplicativeExpression() throws ParseException {
-    UnaryExpression();
-    label_35:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STAR:
-      case SLASH:
-      case REM:
-        ;
-        break;
-      default:
-        break label_35;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STAR:
-        jj_consume_token(STAR);
-        break;
-      case SLASH:
-        jj_consume_token(SLASH);
-        break;
-      case REM:
-        jj_consume_token(REM);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      UnaryExpression();
-    }
-  }
-
-  final public void UnaryExpression() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case PLUS:
-    case MINUS:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-        jj_consume_token(PLUS);
-        break;
-      case MINUS:
-        jj_consume_token(MINUS);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      UnaryExpression();
-      break;
-    case INCR:
-      PreIncrementExpression();
-      break;
-    case DECR:
-      PreDecrementExpression();
-      break;
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-      UnaryExpressionNotPlusMinus();
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void PreIncrementExpression() throws ParseException {
-    jj_consume_token(INCR);
-    PrimaryExpression();
-  }
-
-  final public void PreDecrementExpression() throws ParseException {
-    jj_consume_token(DECR);
-    PrimaryExpression();
-  }
-
-  final public void UnaryExpressionNotPlusMinus() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BANG:
-    case TILDE:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case TILDE:
-        jj_consume_token(TILDE);
-        break;
-      case BANG:
-        jj_consume_token(BANG);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      UnaryExpression();
-      break;
-    default:
-      if (jj_2_21(2147483647)) {
-        CastExpression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-          PostfixExpression();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    }
-  }
-
-// This production is to determine lookahead only.  The LOOKAHEAD specifications
-// below are not used, but they are there just to indicate that we know about
-// this.
-  final public void CastLookahead() throws ParseException {
-    if (jj_2_22(2)) {
-      jj_consume_token(LPAREN);
-      PrimitiveType();
-    } else if (jj_2_23(2147483647)) {
-      jj_consume_token(LPAREN);
-      Type();
-      jj_consume_token(LBRACKET);
-      jj_consume_token(RBRACKET);
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(RPAREN);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case TILDE:
-          jj_consume_token(TILDE);
-          break;
-        case BANG:
-          jj_consume_token(BANG);
-          break;
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          break;
-        case IDENTIFIER:
-          jj_consume_token(IDENTIFIER);
-          break;
-        case THIS:
-          jj_consume_token(THIS);
-          break;
-        case SUPER:
-          jj_consume_token(SUPER);
-          break;
-        case NEW:
-          jj_consume_token(NEW);
-          break;
-        case FALSE:
-        case NULL:
-        case TRUE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-          Literal();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void PostfixExpression() throws ParseException {
-    PrimaryExpression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INCR:
-    case DECR:
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INCR:
-        jj_consume_token(INCR);
-        break;
-      case DECR:
-        jj_consume_token(DECR);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void CastExpression() throws ParseException {
-    if (jj_2_24(2147483647)) {
-      jj_consume_token(LPAREN);
-      Type();
-      jj_consume_token(RPAREN);
-      UnaryExpression();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(RPAREN);
-        UnaryExpressionNotPlusMinus();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void PrimaryExpression() throws ParseException {
-    PrimaryPrefix();
-    label_36:
-    while (true) {
-      if (jj_2_25(2)) {
-        ;
-      } else {
-        break label_36;
-      }
-      PrimarySuffix();
-    }
-  }
-
-  final public void MemberSelector() throws ParseException {
-    jj_consume_token(DOT);
-    TypeArguments();
-    jj_consume_token(IDENTIFIER);
-  }
-
-  final public void PrimaryPrefix() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case FALSE:
-    case NULL:
-    case TRUE:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-      Literal();
-      break;
-    default:
-      if (jj_2_26(2147483647)) {
-        label_37:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case IDENTIFIER:
-            ;
-            break;
-          default:
-            break label_37;
-          }
-          jj_consume_token(IDENTIFIER);
-          jj_consume_token(DOT);
-        }
-        jj_consume_token(THIS);
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SUPER:
-          jj_consume_token(SUPER);
-          jj_consume_token(DOT);
-          jj_consume_token(IDENTIFIER);
-          break;
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          Expression();
-          jj_consume_token(RPAREN);
-          break;
-        case NEW:
-          AllocationExpression();
-          break;
-        default:
-          if (jj_2_27(2147483647)) {
-            ResultType();
-            jj_consume_token(DOT);
-            jj_consume_token(CLASS);
-          } else {
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case IDENTIFIER:
-              Name();
-              break;
-            default:
-              jj_consume_token(-1);
-              throw new ParseException();
-            }
-          }
-        }
-      }
-    }
-  }
-
-  final public void PrimarySuffix() throws ParseException {
-    if (jj_2_28(2147483647)) {
-      jj_consume_token(DOT);
-      jj_consume_token(SUPER);
-    } else if (jj_2_29(2147483647)) {
-      jj_consume_token(DOT);
-      jj_consume_token(THIS);
-    } else if (jj_2_30(2)) {
-      jj_consume_token(DOT);
-      AllocationExpression();
-    } else if (jj_2_31(3)) {
-      MemberSelector();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        jj_consume_token(LBRACKET);
-        Expression();
-        jj_consume_token(RBRACKET);
-        break;
-      case DOT:
-        jj_consume_token(DOT);
-        jj_consume_token(IDENTIFIER);
-        break;
-      case LPAREN:
-        Arguments();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void Literal() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INTEGER_LITERAL:
-      jj_consume_token(INTEGER_LITERAL);
-      break;
-    case FLOATING_POINT_LITERAL:
-      jj_consume_token(FLOATING_POINT_LITERAL);
-      break;
-    case CHARACTER_LITERAL:
-      jj_consume_token(CHARACTER_LITERAL);
-      break;
-    case STRING_LITERAL:
-      jj_consume_token(STRING_LITERAL);
-      break;
-    case FALSE:
-    case TRUE:
-      BooleanLiteral();
-      break;
-    case NULL:
-      NullLiteral();
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void BooleanLiteral() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case TRUE:
-      jj_consume_token(TRUE);
-      break;
-    case FALSE:
-      jj_consume_token(FALSE);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void NullLiteral() throws ParseException {
-    jj_consume_token(NULL);
-  }
-
-  final public void Arguments() throws ParseException {
-    jj_consume_token(LPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      ArgumentList();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(RPAREN);
-  }
-
-  final public void ArgumentList() throws ParseException {
-    Expression();
-    label_38:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_38;
-      }
-      jj_consume_token(COMMA);
-      Expression();
-    }
-  }
-
-  final public void AllocationExpression() throws ParseException {
-    if (jj_2_32(2)) {
-      jj_consume_token(NEW);
-      PrimitiveType();
-      ArrayDimsAndInits();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case NEW:
-        jj_consume_token(NEW);
-        ClassOrInterfaceType();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-          TypeArguments();
-          break;
-        default:
-          ;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ArrayDimsAndInits();
-          break;
-        case LPAREN:
-          Arguments();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LBRACE:
-            ClassOrInterfaceBody(false);
-            break;
-          default:
-            ;
-          }
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-/*
- * The third LOOKAHEAD specification below is to parse to PrimarySuffix
- * if there is an expression between the "[...]".
- */
-  final public void ArrayDimsAndInits() throws ParseException {
-    if (jj_2_35(2)) {
-      label_39:
-      while (true) {
-        jj_consume_token(LBRACKET);
-        Expression();
-        jj_consume_token(RBRACKET);
-        if (jj_2_33(2)) {
-          ;
-        } else {
-          break label_39;
-        }
-      }
-      label_40:
-      while (true) {
-        if (jj_2_34(2)) {
-          ;
-        } else {
-          break label_40;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACKET:
-        label_41:
-        while (true) {
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LBRACKET:
-            ;
-            break;
-          default:
-            break label_41;
-          }
-        }
-        ArrayInitializer();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-/*
- * Statement syntax follows.
- */
-  final public void Statement() throws ParseException {
-    if (jj_2_36(2)) {
-      LabeledStatement();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-        AssertStatement();
-        break;
-      case LBRACE:
-        Block();
-        break;
-      case SEMICOLON:
-        EmptyStatement();
-        break;
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case INCR:
-      case DECR:
-        StatementExpression();
-        jj_consume_token(SEMICOLON);
-        break;
-      case SWITCH:
-        SwitchStatement();
-        break;
-      case IF:
-        IfStatement();
-        break;
-      case WHILE:
-        WhileStatement();
-        break;
-      case DO:
-        DoStatement();
-        break;
-      case FOR:
-        ForStatement();
-        break;
-      case BREAK:
-        BreakStatement();
-        break;
-      case CONTINUE:
-        ContinueStatement();
-        break;
-      case RETURN:
-        ReturnStatement();
-        break;
-      case THROW:
-        ThrowStatement();
-        break;
-      case SYNCHRONIZED:
-        SynchronizedStatement();
-        break;
-      case TRY:
-        TryStatement();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void AssertStatement() throws ParseException {
-    jj_consume_token(ASSERT);
-    Expression();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COLON:
-      jj_consume_token(COLON);
-      Expression();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void LabeledStatement() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    jj_consume_token(COLON);
-    Statement();
-  }
-
-  final public void Block() throws ParseException {
-    jj_consume_token(LBRACE);
-    label_42:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case ASSERT:
-      case BOOLEAN:
-      case BREAK:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case CONTINUE:
-      case DO:
-      case DOUBLE:
-      case FALSE:
-      case FINAL:
-      case FLOAT:
-      case FOR:
-      case IF:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case RETURN:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SUPER:
-      case SWITCH:
-      case SYNCHRONIZED:
-      case THIS:
-      case THROW:
-      case TRANSIENT:
-      case TRUE:
-      case TRY:
-      case VOID:
-      case VOLATILE:
-      case WHILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
-      case AT:
-      case INCR:
-      case DECR:
-        ;
-        break;
-      default:
-        break label_42;
-      }
-      BlockStatement();
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void BlockStatement() throws ParseException {
-    if (jj_2_37(2147483647)) {
-      LocalVariableDeclaration();
-      jj_consume_token(SEMICOLON);
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSERT:
-      case BOOLEAN:
-      case BREAK:
-      case BYTE:
-      case CHAR:
-      case CONTINUE:
-      case DO:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case FOR:
-      case IF:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case RETURN:
-      case SHORT:
-      case SUPER:
-      case SWITCH:
-      case SYNCHRONIZED:
-      case THIS:
-      case THROW:
-      case TRUE:
-      case TRY:
-      case VOID:
-      case WHILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
-      case INCR:
-      case DECR:
-        Statement();
-        break;
-      case CLASS:
-      case INTERFACE:
-        ClassOrInterfaceDeclaration(0);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void LocalVariableDeclaration() throws ParseException {
-    Modifiers();
-    Type();
-    VariableDeclarator();
-    label_43:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_43;
-      }
-      jj_consume_token(COMMA);
-      VariableDeclarator();
-    }
-  }
-
-  final public void EmptyStatement() throws ParseException {
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void StatementExpression() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case INCR:
-      PreIncrementExpression();
-      break;
-    case DECR:
-      PreDecrementExpression();
-      break;
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-      PrimaryExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-      case INCR:
-      case DECR:
-      case PLUSASSIGN:
-      case MINUSASSIGN:
-      case STARASSIGN:
-      case SLASHASSIGN:
-      case ANDASSIGN:
-      case ORASSIGN:
-      case XORASSIGN:
-      case REMASSIGN:
-      case LSHIFTASSIGN:
-      case RSIGNEDSHIFTASSIGN:
-      case RUNSIGNEDSHIFTASSIGN:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case INCR:
-          jj_consume_token(INCR);
-          break;
-        case DECR:
-          jj_consume_token(DECR);
-          break;
-        case ASSIGN:
-        case PLUSASSIGN:
-        case MINUSASSIGN:
-        case STARASSIGN:
-        case SLASHASSIGN:
-        case ANDASSIGN:
-        case ORASSIGN:
-        case XORASSIGN:
-        case REMASSIGN:
-        case LSHIFTASSIGN:
-        case RSIGNEDSHIFTASSIGN:
-        case RUNSIGNEDSHIFTASSIGN:
-          AssignmentOperator();
-          Expression();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        ;
-      }
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void SwitchStatement() throws ParseException {
-    jj_consume_token(SWITCH);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    jj_consume_token(LBRACE);
-    label_44:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CASE:
-      case _DEFAULT:
-        ;
-        break;
-      default:
-        break label_44;
-      }
-      SwitchLabel();
-      label_45:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case RETURN:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRANSIENT:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case VOLATILE:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          ;
-          break;
-        default:
-          break label_45;
-        }
-        BlockStatement();
-      }
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void SwitchLabel() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case CASE:
-      jj_consume_token(CASE);
-      Expression();
-      jj_consume_token(COLON);
-      break;
-    case _DEFAULT:
-      jj_consume_token(_DEFAULT);
-      jj_consume_token(COLON);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void IfStatement() throws ParseException {
-    jj_consume_token(IF);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    Statement();
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ELSE:
-      jj_consume_token(ELSE);
-      Statement();
-      break;
-    default:
-      ;
-    }
-  }
-
-  final public void WhileStatement() throws ParseException {
-    jj_consume_token(WHILE);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    Statement();
-  }
-
-  final public void DoStatement() throws ParseException {
-    jj_consume_token(DO);
-    Statement();
-    jj_consume_token(WHILE);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void ForStatement() throws ParseException {
-    jj_consume_token(FOR);
-    jj_consume_token(LPAREN);
-    if (jj_2_38(2147483647)) {
-      Modifiers();
-      Type();
-      jj_consume_token(IDENTIFIER);
-      jj_consume_token(COLON);
-      Expression();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NATIVE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SUPER:
-      case SYNCHRONIZED:
-      case THIS:
-      case TRANSIENT:
-      case TRUE:
-      case VOID:
-      case VOLATILE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case SEMICOLON:
-      case AT:
-      case INCR:
-      case DECR:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SUPER:
-        case SYNCHRONIZED:
-        case THIS:
-        case TRANSIENT:
-        case TRUE:
-        case VOID:
-        case VOLATILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case AT:
-        case INCR:
-        case DECR:
-          ForInit();
-          break;
-        default:
-          ;
-        }
-        jj_consume_token(SEMICOLON);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case BANG:
-        case TILDE:
-        case INCR:
-        case DECR:
-        case PLUS:
-        case MINUS:
-          Expression();
-          break;
-        default:
-          ;
-        }
-        jj_consume_token(SEMICOLON);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case INCR:
-        case DECR:
-          ForUpdate();
-          break;
-        default:
-          ;
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-    jj_consume_token(RPAREN);
-    Statement();
-  }
-
-  final public void ForInit() throws ParseException {
-    if (jj_2_39(2147483647)) {
-      LocalVariableDeclaration();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case INCR:
-      case DECR:
-        StatementExpressionList();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void StatementExpressionList() throws ParseException {
-    StatementExpression();
-    label_46:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_46;
-      }
-      jj_consume_token(COMMA);
-      StatementExpression();
-    }
-  }
-
-  final public void ForUpdate() throws ParseException {
-    StatementExpressionList();
-  }
-
-  final public void BreakStatement() throws ParseException {
-    jj_consume_token(BREAK);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IDENTIFIER:
-      jj_consume_token(IDENTIFIER);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void ContinueStatement() throws ParseException {
-    jj_consume_token(CONTINUE);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IDENTIFIER:
-      jj_consume_token(IDENTIFIER);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void ReturnStatement() throws ParseException {
-    jj_consume_token(RETURN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      Expression();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void ThrowStatement() throws ParseException {
-    jj_consume_token(THROW);
-    Expression();
-    jj_consume_token(SEMICOLON);
-  }
-
-  final public void SynchronizedStatement() throws ParseException {
-    jj_consume_token(SYNCHRONIZED);
-    jj_consume_token(LPAREN);
-    Expression();
-    jj_consume_token(RPAREN);
-    Block();
-  }
-
-  final public void TryStatement() throws ParseException {
-    jj_consume_token(TRY);
-    Block();
-    label_47:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CATCH:
-        ;
-        break;
-      default:
-        break label_47;
-      }
-      jj_consume_token(CATCH);
-      jj_consume_token(LPAREN);
-      FormalParameter();
-      jj_consume_token(RPAREN);
-      Block();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case FINALLY:
-      jj_consume_token(FINALLY);
-      Block();
-      break;
-    default:
-      ;
-    }
-  }
-
-/* We use productions to match >>>, >> and > so that we can keep the
- * type declaration syntax with generics clean
- */
-  final public void RUNSIGNEDSHIFT() throws ParseException {
-    if (getToken(1).kind == GT &&
-                    ((Token.GTToken)getToken(1)).realKind == RUNSIGNEDSHIFT) {
-
-    } else {
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    jj_consume_token(GT);
-    jj_consume_token(GT);
-    jj_consume_token(GT);
-  }
-
-  final public void RSIGNEDSHIFT() throws ParseException {
-    if (getToken(1).kind == GT &&
-                    ((Token.GTToken)getToken(1)).realKind == RSIGNEDSHIFT) {
-
-    } else {
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    jj_consume_token(GT);
-    jj_consume_token(GT);
-  }
-
-/* Annotation syntax follows. */
-  final public void Annotation() throws ParseException {
-    if (jj_2_40(2147483647)) {
-      NormalAnnotation();
-    } else if (jj_2_41(2147483647)) {
-      SingleMemberAnnotation();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        MarkerAnnotation();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-  }
-
-  final public void NormalAnnotation() throws ParseException {
-    jj_consume_token(AT);
-    Name();
-    jj_consume_token(LPAREN);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IDENTIFIER:
-      MemberValuePairs();
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(RPAREN);
-  }
-
-  final public void MarkerAnnotation() throws ParseException {
-    jj_consume_token(AT);
-    Name();
-  }
-
-  final public void SingleMemberAnnotation() throws ParseException {
-    jj_consume_token(AT);
-    Name();
-    jj_consume_token(LPAREN);
-    MemberValue();
-    jj_consume_token(RPAREN);
-  }
-
-  final public void MemberValuePairs() throws ParseException {
-    MemberValuePair();
-    label_48:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        ;
-        break;
-      default:
-        break label_48;
-      }
-      jj_consume_token(COMMA);
-      MemberValuePair();
-    }
-  }
-
-  final public void MemberValuePair() throws ParseException {
-    jj_consume_token(IDENTIFIER);
-    jj_consume_token(ASSIGN);
-    MemberValue();
-  }
-
-  final public void MemberValue() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case AT:
-      Annotation();
-      break;
-    case LBRACE:
-      MemberValueArrayInitializer();
-      break;
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case DOUBLE:
-    case FALSE:
-    case FLOAT:
-    case INT:
-    case LONG:
-    case NEW:
-    case NULL:
-    case SHORT:
-    case SUPER:
-    case THIS:
-    case TRUE:
-    case VOID:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case CHARACTER_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case BANG:
-    case TILDE:
-    case INCR:
-    case DECR:
-    case PLUS:
-    case MINUS:
-      ConditionalExpression();
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void MemberValueArrayInitializer() throws ParseException {
-    jj_consume_token(LBRACE);
-    MemberValue();
-    label_49:
-    while (true) {
-      if (jj_2_42(2)) {
-        ;
-      } else {
-        break label_49;
-      }
-      jj_consume_token(COMMA);
-      MemberValue();
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case COMMA:
-      jj_consume_token(COMMA);
-      break;
-    default:
-      ;
-    }
-    jj_consume_token(RBRACE);
-  }
-
-/* Annotation Types. */
-  final public void AnnotationTypeDeclaration(int modifiers) throws ParseException {
-    jj_consume_token(AT);
-    jj_consume_token(INTERFACE);
-    jj_consume_token(IDENTIFIER);
-    AnnotationTypeBody();
-  }
-
-  final public void AnnotationTypeBody() throws ParseException {
-    jj_consume_token(LBRACE);
-    label_50:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case SEMICOLON:
-      case AT:
-        ;
-        break;
-      default:
-        break label_50;
-      }
-      AnnotationTypeMemberDeclaration();
-    }
-    jj_consume_token(RBRACE);
-  }
-
-  final public void AnnotationTypeMemberDeclaration() throws ParseException {
-   int modifiers;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ABSTRACT:
-    case BOOLEAN:
-    case BYTE:
-    case CHAR:
-    case CLASS:
-    case DOUBLE:
-    case ENUM:
-    case FINAL:
-    case FLOAT:
-    case INT:
-    case INTERFACE:
-    case LONG:
-    case NATIVE:
-    case PRIVATE:
-    case PROTECTED:
-    case PUBLIC:
-    case SHORT:
-    case STATIC:
-    case STRICTFP:
-    case SYNCHRONIZED:
-    case TRANSIENT:
-    case VOLATILE:
-    case IDENTIFIER:
-    case AT:
-      modifiers = Modifiers();
-      if (jj_2_43(2147483647)) {
-        Type();
-        jj_consume_token(IDENTIFIER);
-        jj_consume_token(LPAREN);
-        jj_consume_token(RPAREN);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case _DEFAULT:
-          DefaultValue();
-          break;
-        default:
-          ;
-        }
-        jj_consume_token(SEMICOLON);
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CLASS:
-        case INTERFACE:
-          ClassOrInterfaceDeclaration(modifiers);
-          break;
-        case ENUM:
-          EnumDeclaration(modifiers);
-          break;
-        case AT:
-          AnnotationTypeDeclaration(modifiers);
-          break;
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case SHORT:
-        case IDENTIFIER:
-          FieldDeclaration(modifiers);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      break;
-    case SEMICOLON:
-      jj_consume_token(SEMICOLON);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-  }
-
-  final public void DefaultValue() throws ParseException {
-    jj_consume_token(_DEFAULT);
-    MemberValue();
-  }
-
-  private boolean jj_2_1(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_2(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_2(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_3(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_3(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_4(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_4(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_5(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_5(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_6(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_6(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_7(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_7(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_8(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_8(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_9(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_9(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_10(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_10(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_11(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_11(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_12(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_12(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_13(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_13(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_14(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_14(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_15(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_15(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_16(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_16(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_17(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_17(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_18(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_18(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_19(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_19(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_20(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_20(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_21(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_21(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_22(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_22(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_23(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_23(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_24(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_24(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_25(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_25(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_26(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_26(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_27(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_27(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_28(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_28(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_29(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_29(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_30(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_30(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_31(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_31(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_32(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_32(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_33(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_33(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_34(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_34(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_35(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_35(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_36(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_36(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_37(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_37(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_38(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_38(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_39(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_39(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_40(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_40(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_41(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_41(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_42(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_42(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_43(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_43(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_3R_124() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_13()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_14()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_99() {
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_12()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_98() {
-    if (jj_3R_78()) return true;
-    Token xsp;
-    if (jj_3_11()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_11()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_71() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_98()) {
-    jj_scanpos = xsp;
-    if (jj_3R_99()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_9() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_263() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_277()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_91() {
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
-  private boolean jj_3_10() {
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_66() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_10()) {
-    jj_scanpos = xsp;
-    if (jj_3R_91()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_68() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(51)) jj_scanpos = xsp;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3_8() {
-    if (jj_3R_70()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_96() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_280() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_95() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_285() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_284()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_70() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_95()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3_9()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_96()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    if (jj_3R_97()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_265() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_264() {
-    if (jj_3R_70()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_261() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_253() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_261()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_3R_262()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_263()) jj_scanpos = xsp;
-    if (jj_scan_token(LBRACE)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_264()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_265()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_270() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_277()) return true;
-    return false;
-  }
-
-  private boolean jj_3_7() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_69()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_284() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(123)) jj_scanpos = xsp;
-    if (jj_3R_278()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_276() {
-    if (jj_3R_284()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_285()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_262() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_276()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_269() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_3R_262()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_280()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_43() {
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_271() {
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_268() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_255() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_268()) jj_scanpos = xsp;
-    if (jj_3R_81()) return true;
-    if (jj_3R_269()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_270()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_271()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_243() {
-    if (jj_3R_69()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_7()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_279() {
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_69()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_267() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_266()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_287() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_122() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_243()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_42() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_88()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_67() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_94() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_93() {
-    if (jj_3R_122()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_69() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_93()) {
-    jj_scanpos = xsp;
-    if (jj_3R_94()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_278() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_287()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_266() {
-    if (jj_3R_278()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_279()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_129() {
-    if (jj_scan_token(LBRACE)) return true;
-    if (jj_3R_88()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_42()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_156() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_155()) return true;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_67()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(89)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_65() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_115() {
-    if (jj_3R_101()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_254() {
-    if (jj_3R_66()) return true;
-    if (jj_3R_266()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_267()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3_4() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_65()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_114() {
-    if (jj_3R_129()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_113() {
-    if (jj_3R_89()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_88() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_113()) {
-    jj_scanpos = xsp;
-    if (jj_3R_114()) {
-    jj_scanpos = xsp;
-    if (jj_3R_115()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_251() {
-    if (jj_3R_255()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_155() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_88()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_148() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_124()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_250() {
-    if (jj_3R_254()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_249() {
-    if (jj_3R_253()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_248() {
-    if (jj_3R_252()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_147() {
-    if (jj_3R_155()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_156()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_247() {
-    if (jj_3R_151()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_139() {
-    if (jj_3R_147()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_87() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_289() {
-    if (jj_3R_242()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_131() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_88()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_246() {
-    if (jj_3R_85()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_247()) {
-    jj_scanpos = xsp;
-    if (jj_3R_248()) {
-    jj_scanpos = xsp;
-    if (jj_3R_249()) {
-    jj_scanpos = xsp;
-    if (jj_3R_250()) {
-    jj_scanpos = xsp;
-    if (jj_3R_251()) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_132() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    return false;
-  }
-
-  private boolean jj_3_6() {
-    if (jj_3R_68()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_245() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_6()) {
-    jj_scanpos = xsp;
-    if (jj_3R_246()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_41() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_244() {
-    if (jj_3R_245()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_130() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_139()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_120() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
-  private boolean jj_3_40() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_87()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(80)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_133() {
-    if (jj_3R_140()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_288() {
-    if (jj_3R_97()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_242() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_244()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_118() {
-    if (jj_3R_132()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_117() {
-    if (jj_3R_131()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_140() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_148()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_116() {
-    if (jj_3R_130()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_102() {
-    return false;
-  }
-
-  private boolean jj_3R_89() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_116()) {
-    jj_scanpos = xsp;
-    if (jj_3R_117()) {
-    jj_scanpos = xsp;
-    if (jj_3R_118()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_119() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_133()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_3() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_64()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_103() {
-    return false;
-  }
-
-  private boolean jj_3R_90() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_119()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_120()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_75() {
-    jj_lookingAhead = true;
-    jj_semLA = getToken(1).kind == GT &&
-                ((Token.GTToken)getToken(1)).realKind == RSIGNEDSHIFT;
-    jj_lookingAhead = false;
-    if (!jj_semLA || jj_3R_102()) return true;
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_283() {
-    if (jj_3R_245()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_64() {
-    if (jj_3R_85()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_288()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_289()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_76() {
-    jj_lookingAhead = true;
-    jj_semLA = getToken(1).kind == GT &&
-                ((Token.GTToken)getToken(1)).realKind == RUNSIGNEDSHIFT;
-    jj_lookingAhead = false;
-    if (!jj_semLA || jj_3R_103()) return true;
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_275() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_283()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_274() {
-    if (jj_3R_64()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_3()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_260() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_274()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_275()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_298() {
-    if (jj_scan_token(FINALLY)) return true;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_297() {
-    if (jj_scan_token(CATCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_284()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_259() {
-    if (jj_3R_273()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_187() {
-    if (jj_scan_token(TRY)) return true;
-    if (jj_3R_92()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_297()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_298()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_252() {
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_259()) jj_scanpos = xsp;
-    if (jj_3R_260()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_282() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_124()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_186() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_296() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_273() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_282()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_185() {
-    if (jj_scan_token(THROW)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_304() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_281() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_124()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_313() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_176()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_184() {
-    if (jj_scan_token(RETURN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_296()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_272() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_281()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_171() {
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_183() {
-    if (jj_scan_token(CONTINUE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(76)) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_258() {
-    if (jj_3R_273()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_257() {
-    if (jj_3R_272()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_256() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_182() {
-    if (jj_scan_token(BREAK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(76)) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_151() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(20)) {
-    jj_scanpos = xsp;
-    if (jj_3R_171()) return true;
-    }
-    if (jj_scan_token(IDENTIFIER)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_256()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_257()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_258()) jj_scanpos = xsp;
-    if (jj_3R_242()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_309() {
-    if (jj_3R_312()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_303() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3_39() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_312() {
-    if (jj_3R_176()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_313()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_293() {
-    if (jj_scan_token(ELSE)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_311() {
-    if (jj_3R_312()) return true;
-    return false;
-  }
-
-  private boolean jj_3_38() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_310() {
-    if (jj_3R_149()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_308() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_310()) {
-    jj_scanpos = xsp;
-    if (jj_3R_311()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_302() {
-    if (jj_3R_308()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_295() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_302()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_303()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_304()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_294() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_181() {
-    if (jj_scan_token(FOR)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_294()) {
-    jj_scanpos = xsp;
-    if (jj_3R_295()) return true;
-    }
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_63() {
-    if (jj_3R_89()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_62() {
-    if (jj_scan_token(STRICTFP)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_61() {
-    if (jj_scan_token(VOLATILE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_180() {
-    if (jj_scan_token(DO)) return true;
-    if (jj_3R_150()) return true;
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_60() {
-    if (jj_scan_token(TRANSIENT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_59() {
-    if (jj_scan_token(NATIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_58() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_179() {
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_57() {
-    if (jj_scan_token(ABSTRACT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_56() {
-    if (jj_scan_token(FINAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_301() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_55() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_178() {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_150()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_293()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_54() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_53() {
-    if (jj_scan_token(STATIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_52() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_52()) {
-    jj_scanpos = xsp;
-    if (jj_3R_53()) {
-    jj_scanpos = xsp;
-    if (jj_3R_54()) {
-    jj_scanpos = xsp;
-    if (jj_3R_55()) {
-    jj_scanpos = xsp;
-    if (jj_3R_56()) {
-    jj_scanpos = xsp;
-    if (jj_3R_57()) {
-    jj_scanpos = xsp;
-    if (jj_3R_58()) {
-    jj_scanpos = xsp;
-    if (jj_3R_59()) {
-    jj_scanpos = xsp;
-    if (jj_3R_60()) {
-    jj_scanpos = xsp;
-    if (jj_3R_61()) {
-    jj_scanpos = xsp;
-    if (jj_3R_62()) {
-    jj_scanpos = xsp;
-    if (jj_3R_63()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_307() {
-    if (jj_scan_token(_DEFAULT)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_85() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_2()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_306() {
-    if (jj_scan_token(CASE)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_300() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_306()) {
-    jj_scanpos = xsp;
-    if (jj_3R_307()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_290() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_266()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_292() {
-    if (jj_3R_300()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_301()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_177() {
-    if (jj_scan_token(SWITCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_292()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_305() {
-    if (jj_3R_73()) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_299() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(101)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(102)) {
-    jj_scanpos = xsp;
-    if (jj_3R_305()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_194() {
-    if (jj_3R_199()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_299()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_51() {
-    if (jj_3R_89()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_193() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3_1() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_51()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(PACKAGE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_176() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_192()) {
-    jj_scanpos = xsp;
-    if (jj_3R_193()) {
-    jj_scanpos = xsp;
-    if (jj_3R_194()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_192() {
-    if (jj_3R_197()) return true;
-    return false;
-  }
-
-  private boolean jj_3_37() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_149() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_3R_266()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_290()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_291() {
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_143() {
-    if (jj_3R_151()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_142() {
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_141() {
-    if (jj_3R_149()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_134() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_141()) {
-    jj_scanpos = xsp;
-    if (jj_3R_142()) {
-    jj_scanpos = xsp;
-    if (jj_3R_143()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_121() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_92() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_121()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_84() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_175() {
-    if (jj_scan_token(ASSERT)) return true;
-    if (jj_3R_74()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_291()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_170() {
-    if (jj_3R_187()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_169() {
-    if (jj_3R_186()) return true;
-    return false;
-  }
-
-  private boolean jj_3_34() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_168() {
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_167() {
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_166() {
-    if (jj_3R_183()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_165() {
-    if (jj_3R_182()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_164() {
-    if (jj_3R_181()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_163() {
-    if (jj_3R_180()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_162() {
-    if (jj_3R_179()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_161() {
-    if (jj_3R_178()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_160() {
-    if (jj_3R_177()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_159() {
-    if (jj_3R_176()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_158() {
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_157() {
-    if (jj_3R_175()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_236() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3_36() {
-    if (jj_3R_84()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_150() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_36()) {
-    jj_scanpos = xsp;
-    if (jj_3R_157()) {
-    jj_scanpos = xsp;
-    if (jj_3R_158()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) {
-    jj_scanpos = xsp;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
-    if (jj_3R_160()) {
-    jj_scanpos = xsp;
-    if (jj_3R_161()) {
-    jj_scanpos = xsp;
-    if (jj_3R_162()) {
-    jj_scanpos = xsp;
-    if (jj_3R_163()) {
-    jj_scanpos = xsp;
-    if (jj_3R_164()) {
-    jj_scanpos = xsp;
-    if (jj_3R_165()) {
-    jj_scanpos = xsp;
-    if (jj_3R_166()) {
-    jj_scanpos = xsp;
-    if (jj_3R_167()) {
-    jj_scanpos = xsp;
-    if (jj_3R_168()) {
-    jj_scanpos = xsp;
-    if (jj_3R_169()) {
-    jj_scanpos = xsp;
-    if (jj_3R_170()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_240() {
-    if (jj_3R_242()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_241() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_33() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_239() {
-    Token xsp;
-    if (jj_3R_241()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_241()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_122()) return true;
-    return false;
-  }
-
-  private boolean jj_3_35() {
-    Token xsp;
-    if (jj_3_33()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_33()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_34()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_235() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_35()) {
-    jj_scanpos = xsp;
-    if (jj_3R_239()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_238() {
-    if (jj_3R_97()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_240()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_144() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_237() {
-    if (jj_3R_235()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_112() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_236()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_237()) {
-    jj_scanpos = xsp;
-    if (jj_3R_238()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_82() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_32()) {
-    jj_scanpos = xsp;
-    if (jj_3R_112()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_32() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_78()) return true;
-    if (jj_3R_235()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_136() {
-    if (jj_3R_74()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_144()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_123() {
-    if (jj_3R_136()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_97() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_123()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_154() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(60)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(29)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_146() {
-    if (jj_3R_154()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_128() {
-    if (jj_3R_138()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_138() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(65)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(69)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(74)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(75)) {
-    jj_scanpos = xsp;
-    if (jj_3R_146()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(44)) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_110() {
-    if (jj_3R_97()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_109() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_29() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_108() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_28() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3_31() {
-    if (jj_3R_83()) return true;
-    return false;
-  }
-
-  private boolean jj_3_30() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_82()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_107() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3_27() {
-    if (jj_3R_81()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_106() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(SUPER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_79() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_106()) {
-    jj_scanpos = xsp;
-    if (jj_3R_107()) {
-    jj_scanpos = xsp;
-    if (jj_3_30()) {
-    jj_scanpos = xsp;
-    if (jj_3_31()) {
-    jj_scanpos = xsp;
-    if (jj_3R_108()) {
-    jj_scanpos = xsp;
-    if (jj_3R_109()) {
-    jj_scanpos = xsp;
-    if (jj_3R_110()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_80() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_211() {
-    if (jj_3R_86()) return true;
-    return false;
-  }
-
-  private boolean jj_3_26() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_80()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_210() {
-    if (jj_3R_81()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_209() {
-    if (jj_3R_82()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_208() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_25() {
-    if (jj_3R_79()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_207() {
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_214() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_206() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_214()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_202() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_205()) {
-    jj_scanpos = xsp;
-    if (jj_3R_206()) {
-    jj_scanpos = xsp;
-    if (jj_3R_207()) {
-    jj_scanpos = xsp;
-    if (jj_3R_208()) {
-    jj_scanpos = xsp;
-    if (jj_3R_209()) {
-    jj_scanpos = xsp;
-    if (jj_3R_210()) {
-    jj_scanpos = xsp;
-    if (jj_3R_211()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_205() {
-    if (jj_3R_138()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_234() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(101)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(102)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_83() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_72()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_24() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_199() {
-    if (jj_3R_202()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_25()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_233() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_230() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_232()) {
-    jj_scanpos = xsp;
-    if (jj_3R_233()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_232() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3_23() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_231() {
-    if (jj_3R_199()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_234()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_105() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(92)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(91)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(79)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(76)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(43)) {
-    jj_scanpos = xsp;
-    if (jj_3R_128()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_104() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_22() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_77() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_22()) {
-    jj_scanpos = xsp;
-    if (jj_3R_104()) {
-    jj_scanpos = xsp;
-    if (jj_3R_105()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_21() {
-    if (jj_3R_77()) return true;
-    return false;
-  }
-
-  private boolean jj_3_20() {
-    if (jj_3R_76()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_228() {
-    if (jj_3R_231()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_227() {
-    if (jj_3R_230()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_224() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_226()) {
-    jj_scanpos = xsp;
-    if (jj_3R_227()) {
-    jj_scanpos = xsp;
-    if (jj_3R_228()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_226() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(92)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(91)) return true;
-    }
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_198() {
-    if (jj_scan_token(DECR)) return true;
-    if (jj_3R_199()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_225() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(103)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(104)) return true;
-    }
-    if (jj_3R_216()) return true;
-    return false;
-  }
-
-  private boolean jj_3_19() {
-    if (jj_3R_75()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_229() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(105)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(106)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(110)) return true;
-    }
-    }
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_197() {
-    if (jj_scan_token(INCR)) return true;
-    if (jj_3R_199()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_223() {
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3_18() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(111)) {
-    jj_scanpos = xsp;
-    if (jj_3_19()) {
-    jj_scanpos = xsp;
-    if (jj_3_20()) return true;
-    }
-    }
-    if (jj_3R_213()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_222() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_221() {
-    if (jj_3R_197()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_218() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_220()) {
-    jj_scanpos = xsp;
-    if (jj_3R_221()) {
-    jj_scanpos = xsp;
-    if (jj_3R_222()) {
-    jj_scanpos = xsp;
-    if (jj_3R_223()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_220() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(103)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(104)) return true;
-    }
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_219() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(90)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(126)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(96)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(97)) return true;
-    }
-    }
-    }
-    if (jj_3R_204()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_217() {
-    if (jj_scan_token(INSTANCEOF)) return true;
-    if (jj_3R_66()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_216() {
-    if (jj_3R_218()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_229()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_215() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(95)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(98)) return true;
-    }
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_213() {
-    if (jj_3R_216()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_225()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_204() {
-    if (jj_3R_213()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_18()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_212() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_201() {
-    if (jj_3R_204()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_219()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_200() {
-    if (jj_scan_token(BIT_OR)) return true;
-    if (jj_3R_153()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_196() {
-    if (jj_3R_201()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_217()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_203() {
-    if (jj_scan_token(XOR)) return true;
-    if (jj_3R_174()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_195() {
-    if (jj_scan_token(SC_AND)) return true;
-    if (jj_3R_145()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_191() {
-    if (jj_3R_196()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_215()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_190() {
-    if (jj_scan_token(SC_OR)) return true;
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_174() {
-    if (jj_3R_191()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_212()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_173() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_153() {
-    if (jj_3R_174()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_203()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_145() {
-    if (jj_3R_153()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_200()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_137() {
-    if (jj_3R_145()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_195()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_127() {
-    if (jj_3R_137()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_190()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_101() {
-    if (jj_3R_127()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_173()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_73() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(89)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(114)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(115)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(119)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(112)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(113)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(120)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(121)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(122)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(116)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(118)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(117)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_17() {
-    if (jj_3R_73()) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_74() {
-    if (jj_3R_101()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_17()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_286() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_86()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_277() {
-    if (jj_3R_86()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_286()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_16() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_86() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_16()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_111() {
-    if (jj_3R_66()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_81() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(62)) {
-    jj_scanpos = xsp;
-    if (jj_3R_111()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_15() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_78() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(14)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(19)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(16)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(50)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(39)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(41)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(32)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(25)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_135() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_100()) return true;
-    return false;
-  }
-
-  private boolean jj_3_12() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_189() {
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_152() {
-    if (jj_3R_172()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_172() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_188()) {
-    jj_scanpos = xsp;
-    if (jj_3R_189()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_188() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_126() {
-    if (jj_scan_token(HOOK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_152()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_13() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_125() {
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_100() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_125()) {
-    jj_scanpos = xsp;
-    if (jj_3R_126()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_11() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_72() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_100()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_135()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3_14() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_15()) jj_scanpos = xsp;
-    return false;
-  }
-
-  /** Generated Token Manager. */
-  public JavaParser15TokenManager token_source;
-  JavaCharStream jj_input_stream;
-  /** Current token. */
-  public Token token;
-  /** Next token. */
-  public Token jj_nt;
-  private int jj_ntk;
-  private Token jj_scanpos, jj_lastpos;
-  private int jj_la;
-  /** Whether we are looking ahead. */
-  private boolean jj_lookingAhead = false;
-  private boolean jj_semLA;
-
-  /** Constructor with InputStream. */
-  public JavaParser15(java.io.InputStream stream) {
-     this(stream, null);
-  }
-  /** Constructor with InputStream and supplied encoding */
-  public JavaParser15(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source = new JavaParser15TokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream) {
-     ReInit(stream, null);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Constructor. */
-  public JavaParser15(java.io.Reader stream) {
-    jj_input_stream = new JavaCharStream(stream, 1, 1);
-    token_source = new JavaParser15TokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Constructor with generated Token Manager. */
-  public JavaParser15(JavaParser15TokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(JavaParser15TokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      return token;
-    }
-    token = oldToken;
-    throw generateParseException();
-  }
-
-  static private final class LookaheadSuccess extends java.lang.Error { }
-  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
-  private boolean jj_scan_token(int kind) {
-    if (jj_scanpos == jj_lastpos) {
-      jj_la--;
-      if (jj_scanpos.next == null) {
-        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
-      } else {
-        jj_lastpos = jj_scanpos = jj_scanpos.next;
-      }
-    } else {
-      jj_scanpos = jj_scanpos.next;
-    }
-    if (jj_scanpos.kind != kind) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
-    return false;
-  }
-
-
-/** Get the next Token. */
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    return token;
-  }
-
-/** Get the specific Token. */
-  final public Token getToken(int index) {
-    Token t = jj_lookingAhead ? jj_scanpos : token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
-    }
-    return t;
-  }
-
-  private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
-
-  /** Generate ParseException. */
-  public ParseException generateParseException() {
-    Token errortok = token.next;
-    int line = errortok.beginLine, column = errortok.beginColumn;
-    String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;
-    return new ParseException("Parse error at line " + line + ", column " + column + ".  Encountered: " + mess);
-  }
-
-  /** Enable tracing. */
-  final public void enable_tracing() {
-  }
-
-  /** Disable tracing. */
-  final public void disable_tracing() {
-  }
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15Constants.java b/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15Constants.java
deleted file mode 100644
index 69fb2cd..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15Constants.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParser15Constants.java */
-package net.sourceforge.cobertura.javancss.parser.java15;
-
-
-/**
- * Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
- */
-public interface JavaParser15Constants {
-
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int SINGLE_LINE_COMMENT = 8;
-  /** RegularExpression Id. */
-  int FORMAL_COMMENT = 9;
-  /** RegularExpression Id. */
-  int MULTI_LINE_COMMENT = 10;
-  /** RegularExpression Id. */
-  int ABSTRACT = 12;
-  /** RegularExpression Id. */
-  int ASSERT = 13;
-  /** RegularExpression Id. */
-  int BOOLEAN = 14;
-  /** RegularExpression Id. */
-  int BREAK = 15;
-  /** RegularExpression Id. */
-  int BYTE = 16;
-  /** RegularExpression Id. */
-  int CASE = 17;
-  /** RegularExpression Id. */
-  int CATCH = 18;
-  /** RegularExpression Id. */
-  int CHAR = 19;
-  /** RegularExpression Id. */
-  int CLASS = 20;
-  /** RegularExpression Id. */
-  int CONST = 21;
-  /** RegularExpression Id. */
-  int CONTINUE = 22;
-  /** RegularExpression Id. */
-  int _DEFAULT = 23;
-  /** RegularExpression Id. */
-  int DO = 24;
-  /** RegularExpression Id. */
-  int DOUBLE = 25;
-  /** RegularExpression Id. */
-  int ELSE = 26;
-  /** RegularExpression Id. */
-  int ENUM = 27;
-  /** RegularExpression Id. */
-  int EXTENDS = 28;
-  /** RegularExpression Id. */
-  int FALSE = 29;
-  /** RegularExpression Id. */
-  int FINAL = 30;
-  /** RegularExpression Id. */
-  int FINALLY = 31;
-  /** RegularExpression Id. */
-  int FLOAT = 32;
-  /** RegularExpression Id. */
-  int FOR = 33;
-  /** RegularExpression Id. */
-  int GOTO = 34;
-  /** RegularExpression Id. */
-  int IF = 35;
-  /** RegularExpression Id. */
-  int IMPLEMENTS = 36;
-  /** RegularExpression Id. */
-  int IMPORT = 37;
-  /** RegularExpression Id. */
-  int INSTANCEOF = 38;
-  /** RegularExpression Id. */
-  int INT = 39;
-  /** RegularExpression Id. */
-  int INTERFACE = 40;
-  /** RegularExpression Id. */
-  int LONG = 41;
-  /** RegularExpression Id. */
-  int NATIVE = 42;
-  /** RegularExpression Id. */
-  int NEW = 43;
-  /** RegularExpression Id. */
-  int NULL = 44;
-  /** RegularExpression Id. */
-  int PACKAGE = 45;
-  /** RegularExpression Id. */
-  int PRIVATE = 46;
-  /** RegularExpression Id. */
-  int PROTECTED = 47;
-  /** RegularExpression Id. */
-  int PUBLIC = 48;
-  /** RegularExpression Id. */
-  int RETURN = 49;
-  /** RegularExpression Id. */
-  int SHORT = 50;
-  /** RegularExpression Id. */
-  int STATIC = 51;
-  /** RegularExpression Id. */
-  int STRICTFP = 52;
-  /** RegularExpression Id. */
-  int SUPER = 53;
-  /** RegularExpression Id. */
-  int SWITCH = 54;
-  /** RegularExpression Id. */
-  int SYNCHRONIZED = 55;
-  /** RegularExpression Id. */
-  int THIS = 56;
-  /** RegularExpression Id. */
-  int THROW = 57;
-  /** RegularExpression Id. */
-  int THROWS = 58;
-  /** RegularExpression Id. */
-  int TRANSIENT = 59;
-  /** RegularExpression Id. */
-  int TRUE = 60;
-  /** RegularExpression Id. */
-  int TRY = 61;
-  /** RegularExpression Id. */
-  int VOID = 62;
-  /** RegularExpression Id. */
-  int VOLATILE = 63;
-  /** RegularExpression Id. */
-  int WHILE = 64;
-  /** RegularExpression Id. */
-  int INTEGER_LITERAL = 65;
-  /** RegularExpression Id. */
-  int DECIMAL_LITERAL = 66;
-  /** RegularExpression Id. */
-  int HEX_LITERAL = 67;
-  /** RegularExpression Id. */
-  int OCTAL_LITERAL = 68;
-  /** RegularExpression Id. */
-  int FLOATING_POINT_LITERAL = 69;
-  /** RegularExpression Id. */
-  int DECIMAL_FLOATING_POINT_LITERAL = 70;
-  /** RegularExpression Id. */
-  int DECIMAL_EXPONENT = 71;
-  /** RegularExpression Id. */
-  int HEXADECIMAL_FLOATING_POINT_LITERAL = 72;
-  /** RegularExpression Id. */
-  int HEXADECIMAL_EXPONENT = 73;
-  /** RegularExpression Id. */
-  int CHARACTER_LITERAL = 74;
-  /** RegularExpression Id. */
-  int STRING_LITERAL = 75;
-  /** RegularExpression Id. */
-  int IDENTIFIER = 76;
-  /** RegularExpression Id. */
-  int LETTER = 77;
-  /** RegularExpression Id. */
-  int PART_LETTER = 78;
-  /** RegularExpression Id. */
-  int LPAREN = 79;
-  /** RegularExpression Id. */
-  int RPAREN = 80;
-  /** RegularExpression Id. */
-  int LBRACE = 81;
-  /** RegularExpression Id. */
-  int RBRACE = 82;
-  /** RegularExpression Id. */
-  int LBRACKET = 83;
-  /** RegularExpression Id. */
-  int RBRACKET = 84;
-  /** RegularExpression Id. */
-  int SEMICOLON = 85;
-  /** RegularExpression Id. */
-  int COMMA = 86;
-  /** RegularExpression Id. */
-  int DOT = 87;
-  /** RegularExpression Id. */
-  int AT = 88;
-  /** RegularExpression Id. */
-  int ASSIGN = 89;
-  /** RegularExpression Id. */
-  int LT = 90;
-  /** RegularExpression Id. */
-  int BANG = 91;
-  /** RegularExpression Id. */
-  int TILDE = 92;
-  /** RegularExpression Id. */
-  int HOOK = 93;
-  /** RegularExpression Id. */
-  int COLON = 94;
-  /** RegularExpression Id. */
-  int EQ = 95;
-  /** RegularExpression Id. */
-  int LE = 96;
-  /** RegularExpression Id. */
-  int GE = 97;
-  /** RegularExpression Id. */
-  int NE = 98;
-  /** RegularExpression Id. */
-  int SC_OR = 99;
-  /** RegularExpression Id. */
-  int SC_AND = 100;
-  /** RegularExpression Id. */
-  int INCR = 101;
-  /** RegularExpression Id. */
-  int DECR = 102;
-  /** RegularExpression Id. */
-  int PLUS = 103;
-  /** RegularExpression Id. */
-  int MINUS = 104;
-  /** RegularExpression Id. */
-  int STAR = 105;
-  /** RegularExpression Id. */
-  int SLASH = 106;
-  /** RegularExpression Id. */
-  int BIT_AND = 107;
-  /** RegularExpression Id. */
-  int BIT_OR = 108;
-  /** RegularExpression Id. */
-  int XOR = 109;
-  /** RegularExpression Id. */
-  int REM = 110;
-  /** RegularExpression Id. */
-  int LSHIFT = 111;
-  /** RegularExpression Id. */
-  int PLUSASSIGN = 112;
-  /** RegularExpression Id. */
-  int MINUSASSIGN = 113;
-  /** RegularExpression Id. */
-  int STARASSIGN = 114;
-  /** RegularExpression Id. */
-  int SLASHASSIGN = 115;
-  /** RegularExpression Id. */
-  int ANDASSIGN = 116;
-  /** RegularExpression Id. */
-  int ORASSIGN = 117;
-  /** RegularExpression Id. */
-  int XORASSIGN = 118;
-  /** RegularExpression Id. */
-  int REMASSIGN = 119;
-  /** RegularExpression Id. */
-  int LSHIFTASSIGN = 120;
-  /** RegularExpression Id. */
-  int RSIGNEDSHIFTASSIGN = 121;
-  /** RegularExpression Id. */
-  int RUNSIGNEDSHIFTASSIGN = 122;
-  /** RegularExpression Id. */
-  int ELLIPSIS = 123;
-  /** RegularExpression Id. */
-  int RUNSIGNEDSHIFT = 124;
-  /** RegularExpression Id. */
-  int RSIGNEDSHIFT = 125;
-  /** RegularExpression Id. */
-  int GT = 126;
-  /** RegularExpression Id. */
-  int STUFF_TO_IGNORE = 128;
-
-  /** Lexical state. */
-  int DEFAULT = 0;
-  /** Lexical state. */
-  int IN_FORMAL_COMMENT = 1;
-  /** Lexical state. */
-  int IN_MULTI_LINE_COMMENT = 2;
-
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "\" \"",
-    "\"\\t\"",
-    "\"\\n\"",
-    "\"\\r\"",
-    "\"\\f\"",
-    "<token of kind 6>",
-    "\"/*\"",
-    "<SINGLE_LINE_COMMENT>",
-    "\"*/\"",
-    "\"*/\"",
-    "<token of kind 11>",
-    "\"abstract\"",
-    "\"assert\"",
-    "\"boolean\"",
-    "\"break\"",
-    "\"byte\"",
-    "\"case\"",
-    "\"catch\"",
-    "\"char\"",
-    "\"class\"",
-    "\"const\"",
-    "\"continue\"",
-    "\"default\"",
-    "\"do\"",
-    "\"double\"",
-    "\"else\"",
-    "\"enum\"",
-    "\"extends\"",
-    "\"false\"",
-    "\"final\"",
-    "\"finally\"",
-    "\"float\"",
-    "\"for\"",
-    "\"goto\"",
-    "\"if\"",
-    "\"implements\"",
-    "\"import\"",
-    "\"instanceof\"",
-    "\"int\"",
-    "\"interface\"",
-    "\"long\"",
-    "\"native\"",
-    "\"new\"",
-    "\"null\"",
-    "\"package\"",
-    "\"private\"",
-    "\"protected\"",
-    "\"public\"",
-    "\"return\"",
-    "\"short\"",
-    "\"static\"",
-    "\"strictfp\"",
-    "\"super\"",
-    "\"switch\"",
-    "\"synchronized\"",
-    "\"this\"",
-    "\"throw\"",
-    "\"throws\"",
-    "\"transient\"",
-    "\"true\"",
-    "\"try\"",
-    "\"void\"",
-    "\"volatile\"",
-    "\"while\"",
-    "<INTEGER_LITERAL>",
-    "<DECIMAL_LITERAL>",
-    "<HEX_LITERAL>",
-    "<OCTAL_LITERAL>",
-    "<FLOATING_POINT_LITERAL>",
-    "<DECIMAL_FLOATING_POINT_LITERAL>",
-    "<DECIMAL_EXPONENT>",
-    "<HEXADECIMAL_FLOATING_POINT_LITERAL>",
-    "<HEXADECIMAL_EXPONENT>",
-    "<CHARACTER_LITERAL>",
-    "<STRING_LITERAL>",
-    "<IDENTIFIER>",
-    "<LETTER>",
-    "<PART_LETTER>",
-    "\"(\"",
-    "\")\"",
-    "\"{\"",
-    "\"}\"",
-    "\"[\"",
-    "\"]\"",
-    "\";\"",
-    "\",\"",
-    "\".\"",
-    "\"@\"",
-    "\"=\"",
-    "\"<\"",
-    "\"!\"",
-    "\"~\"",
-    "\"?\"",
-    "\":\"",
-    "\"==\"",
-    "\"<=\"",
-    "\">=\"",
-    "\"!=\"",
-    "\"||\"",
-    "\"&&\"",
-    "\"++\"",
-    "\"--\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"&\"",
-    "\"|\"",
-    "\"^\"",
-    "\"%\"",
-    "\"<<\"",
-    "\"+=\"",
-    "\"-=\"",
-    "\"*=\"",
-    "\"/=\"",
-    "\"&=\"",
-    "\"|=\"",
-    "\"^=\"",
-    "\"%=\"",
-    "\"<<=\"",
-    "\">>=\"",
-    "\">>>=\"",
-    "\"...\"",
-    "\">>>\"",
-    "\">>\"",
-    "\">\"",
-    "\"\\u001a\"",
-    "<STUFF_TO_IGNORE>",
-  };
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15TokenManager.java b/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15TokenManager.java
deleted file mode 100644
index fe03231..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/JavaParser15TokenManager.java
+++ /dev/null
@@ -1,2140 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParserTokenManager.java */
-package net.sourceforge.cobertura.javancss.parser.java15;
-
-import java.io.*;
-
-public class JavaParser15TokenManager implements JavaParser15Constants
-{
-  public  java.io.PrintStream debugStream = System.out;
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, long active2)
-{
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0xfffffffffffff000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 76;
-            return 28;
-         }
-         if ((active1 & 0x800000000800000L) != 0L)
-            return 4;
-         if ((active0 & 0x80L) != 0L || (active1 & 0x8040000000000L) != 0L)
-            return 47;
-         return -1;
-      case 1:
-         if ((active0 & 0x803000000L) != 0L)
-            return 28;
-         if ((active0 & 0xfffffff7fcfff000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 76;
-               jjmatchedPos = 1;
-            }
-            return 28;
-         }
-         if ((active0 & 0x80L) != 0L)
-            return 45;
-         return -1;
-      case 2:
-         if ((active0 & 0x2000098200000000L) != 0L)
-            return 28;
-         if ((active0 & 0xdffff675fefff000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 76;
-               jjmatchedPos = 2;
-            }
-            return 28;
-         }
-         return -1;
-      case 3:
-         if ((active0 & 0x510012040c0b0000L) != 0L)
-            return 28;
-         if ((active0 & 0x8effe571f2f4f000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 3;
-            return 28;
-         }
-         return -1;
-      case 4:
-         if ((active0 & 0x6240001e0348000L) != 0L || (active1 & 0x1L) != 0L)
-            return 28;
-         if ((active0 & 0x88dbe57012c07000L) != 0L)
-         {
-            if (jjmatchedPos != 4)
-            {
-               jjmatchedKind = 76;
-               jjmatchedPos = 4;
-            }
-            return 28;
-         }
-         return -1;
-      case 5:
-         if ((active0 & 0x44b042002002000L) != 0L)
-            return 28;
-         if ((active0 & 0x8890e15090c05000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 5;
-            return 28;
-         }
-         return -1;
-      case 6:
-         if ((active0 & 0x600090804000L) != 0L)
-            return 28;
-         if ((active0 & 0x8890815000401000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 6;
-            return 28;
-         }
-         return -1;
-      case 7:
-         if ((active0 & 0x880815000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 7;
-            return 28;
-         }
-         if ((active0 & 0x8010000000401000L) != 0L)
-            return 28;
-         return -1;
-      case 8:
-         if ((active0 & 0x800810000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x80005000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 8;
-            return 28;
-         }
-         return -1;
-      case 9:
-         if ((active0 & 0x5000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 9;
-            return 28;
-         }
-         return -1;
-      case 10:
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 10;
-            return 28;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0, long active1, long active2)
-{
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1, active2), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 26:
-         return jjStopAtPos(0, 127);
-      case 33:
-         jjmatchedKind = 91;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x400000000L);
-      case 37:
-         jjmatchedKind = 110;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x80000000000000L);
-      case 38:
-         jjmatchedKind = 107;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x10001000000000L);
-      case 40:
-         return jjStopAtPos(0, 79);
-      case 41:
-         return jjStopAtPos(0, 80);
-      case 42:
-         jjmatchedKind = 105;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000000000000L);
-      case 43:
-         jjmatchedKind = 103;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1002000000000L);
-      case 44:
-         return jjStopAtPos(0, 86);
-      case 45:
-         jjmatchedKind = 104;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2004000000000L);
-      case 46:
-         jjmatchedKind = 87;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x800000000000000L);
-      case 47:
-         jjmatchedKind = 106;
-         return jjMoveStringLiteralDfa1_0(0x80L, 0x8000000000000L);
-      case 58:
-         return jjStopAtPos(0, 94);
-      case 59:
-         return jjStopAtPos(0, 85);
-      case 60:
-         jjmatchedKind = 90;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x100800100000000L);
-      case 61:
-         jjmatchedKind = 89;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x80000000L);
-      case 62:
-         jjmatchedKind = 126;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3600000200000000L);
-      case 63:
-         return jjStopAtPos(0, 93);
-      case 64:
-         return jjStopAtPos(0, 88);
-      case 91:
-         return jjStopAtPos(0, 83);
-      case 93:
-         return jjStopAtPos(0, 84);
-      case 94:
-         jjmatchedKind = 109;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x40000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x3000L, 0x0L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x1c000L, 0x0L);
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0x7e0000L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x3800000L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x1c000000L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x3e0000000L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x400000000L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x1f800000000L, 0x0L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x20000000000L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x1c0000000000L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x1e00000000000L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x0L);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0xfc000000000000L, 0x0L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x3f00000000000000L, 0x0L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0xc000000000000000L, 0x0L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1L);
-      case 123:
-         return jjStopAtPos(0, 81);
-      case 124:
-         jjmatchedKind = 108;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x20000800000000L);
-      case 125:
-         return jjStopAtPos(0, 82);
-      case 126:
-         return jjStopAtPos(0, 92);
-      default :
-         return jjMoveNfa_0(0, 0);
-   }
-}
-private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0, active1, 0L);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 38:
-         if ((active1 & 0x1000000000L) != 0L)
-            return jjStopAtPos(1, 100);
-         break;
-      case 42:
-         if ((active0 & 0x80L) != 0L)
-            return jjStartNfaWithStates_0(1, 7, 45);
-         break;
-      case 43:
-         if ((active1 & 0x2000000000L) != 0L)
-            return jjStopAtPos(1, 101);
-         break;
-      case 45:
-         if ((active1 & 0x4000000000L) != 0L)
-            return jjStopAtPos(1, 102);
-         break;
-      case 46:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000000L);
-      case 60:
-         if ((active1 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 111;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x100000000000000L);
-      case 61:
-         if ((active1 & 0x80000000L) != 0L)
-            return jjStopAtPos(1, 95);
-         else if ((active1 & 0x100000000L) != 0L)
-            return jjStopAtPos(1, 96);
-         else if ((active1 & 0x200000000L) != 0L)
-            return jjStopAtPos(1, 97);
-         else if ((active1 & 0x400000000L) != 0L)
-            return jjStopAtPos(1, 98);
-         else if ((active1 & 0x1000000000000L) != 0L)
-            return jjStopAtPos(1, 112);
-         else if ((active1 & 0x2000000000000L) != 0L)
-            return jjStopAtPos(1, 113);
-         else if ((active1 & 0x4000000000000L) != 0L)
-            return jjStopAtPos(1, 114);
-         else if ((active1 & 0x8000000000000L) != 0L)
-            return jjStopAtPos(1, 115);
-         else if ((active1 & 0x10000000000000L) != 0L)
-            return jjStopAtPos(1, 116);
-         else if ((active1 & 0x20000000000000L) != 0L)
-            return jjStopAtPos(1, 117);
-         else if ((active1 & 0x40000000000000L) != 0L)
-            return jjStopAtPos(1, 118);
-         else if ((active1 & 0x80000000000000L) != 0L)
-            return jjStopAtPos(1, 119);
-         break;
-      case 62:
-         if ((active1 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 125;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1600000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x240020060000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2080000800000L, active1, 0L);
-      case 102:
-         if ((active0 & 0x800000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 35, 28);
-         break;
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x704000000080000L, active1, 0x1L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0xc0000000L, active1, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x104100000L, active1, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0x3000000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1c008000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 24;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xc000020602604000L, active1, 0L);
-      case 114:
-         return jjMoveStringLiteralDfa2_0(active0, 0x3800c00000008000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa2_0(active0, 0x18000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x21100000000000L, active1, 0L);
-      case 119:
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000000L, active1, 0L);
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10000000L, active1, 0L);
-      case 121:
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000010000L, active1, 0L);
-      case 124:
-         if ((active1 & 0x800000000L) != 0L)
-            return jjStopAtPos(1, 99);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(0, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0, active1, 0L);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 46:
-         if ((active1 & 0x800000000000000L) != 0L)
-            return jjStopAtPos(2, 123);
-         break;
-      case 61:
-         if ((active1 & 0x100000000000000L) != 0L)
-            return jjStopAtPos(2, 120);
-         else if ((active1 & 0x200000000000000L) != 0L)
-            return jjStopAtPos(2, 121);
-         break;
-      case 62:
-         if ((active1 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 124;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x808000000180000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000L, active1, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4140400000000000L, active1, 0x1L);
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000100020000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800200c0600000L, active1, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4800100004000L, active1, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20003000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x200000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 33, 28);
-         return jjMoveStringLiteralDfa3_0(active0, 0x610000000000000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4004023000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 39;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2050410050000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100000000a000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x80000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 43, 28);
-         break;
-      case 121:
-         if ((active0 & 0x2000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 61, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(1, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(2, active0, active1, 0L);
-      return 3;
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active1 & 0x400000000000000L) != 0L)
-            return jjStopAtPos(3, 122);
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000001c0808000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000000040000L, active1, 0L);
-      case 100:
-         if ((active0 & 0x4000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 62, 28);
-         break;
-      case 101:
-         if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_0(3, 16, 28);
-         else if ((active0 & 0x20000L) != 0L)
-            return jjStartNfaWithStates_0(3, 17, 28);
-         else if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 26, 28);
-         else if ((active0 & 0x1000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 60, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x20010010002000L, active1, 0L);
-      case 103:
-         if ((active0 & 0x20000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 41, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x10040000000000L, active1, 0L);
-      case 107:
-         return jjMoveStringLiteralDfa4_0(active0, 0x200000000000L, active1, 0L);
-      case 108:
-         if ((active0 & 0x100000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 44, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x1001000004000L, active1, 0x1L);
-      case 109:
-         if ((active0 & 0x8000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 27, 28);
-         break;
-      case 110:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x400000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 34, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x600002000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(3, 19, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x100000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 56, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x20300000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0x48804000401000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(2, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(2, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(3, active0, active1, 0L);
-      return 4;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0x604000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0x50000000000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 29, 28);
-         else if ((active1 & 0x1L) != 0L)
-            return jjStartNfaWithStates_0(4, 64, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x801000004000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x40000L) != 0L)
-            return jjStartNfaWithStates_0(4, 18, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0x9000000400000L, active1, 0L);
-      case 107:
-         if ((active0 & 0x8000L) != 0L)
-            return jjStartNfaWithStates_0(4, 15, 28);
-         break;
-      case 108:
-         if ((active0 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 30;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x82000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa5_0(active0, 0x10000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x20000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 53, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x2012000003000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x100000L) != 0L)
-            return jjStartNfaWithStates_0(4, 20, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000000000000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(4, 21, 28);
-         else if ((active0 & 0x100000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 32, 28);
-         else if ((active0 & 0x4000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 50, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa5_0(active0, 0x40000000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 57;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x400000000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(3, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(3, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(4, active0, 0L, 0L);
-      return 5;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0x5000L);
-      case 99:
-         if ((active0 & 0x1000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 48, 28);
-         else if ((active0 & 0x8000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 51, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x800000000000L);
-      case 100:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10000000L);
-      case 101:
-         if ((active0 & 0x2000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 25, 28);
-         else if ((active0 & 0x40000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 42, 28);
-         break;
-      case 102:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10000000000L);
-      case 103:
-         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000L);
-      case 104:
-         if ((active0 & 0x40000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 54, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L);
-      case 108:
-         return jjMoveStringLiteralDfa6_0(active0, 0x80800000L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000L);
-      case 110:
-         if ((active0 & 0x2000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 49, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000400000L);
-      case 114:
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L);
-      case 115:
-         if ((active0 & 0x400000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 58, 28);
-         break;
-      case 116:
-         if ((active0 & 0x2000L) != 0L)
-            return jjStartNfaWithStates_0(5, 13, 28);
-         else if ((active0 & 0x2000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 37, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x10400000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(4, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa6_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(4, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(5, active0, 0L, 0L);
-      return 6;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000L);
-      case 99:
-         return jjMoveStringLiteralDfa7_0(active0, 0x4000001000L);
-      case 101:
-         if ((active0 & 0x200000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 45, 28);
-         else if ((active0 & 0x400000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 46, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x800001000000000L);
-      case 102:
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000000L);
-      case 108:
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000000L);
-      case 110:
-         if ((active0 & 0x4000L) != 0L)
-            return jjStartNfaWithStates_0(6, 14, 28);
-         break;
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0x80000000000000L);
-      case 115:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 28, 28);
-         break;
-      case 116:
-         if ((active0 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_0(6, 23, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x800000000000L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0x400000L);
-      case 121:
-         if ((active0 & 0x80000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 31, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(5, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa7_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(5, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(6, active0, 0L, 0L);
-      return 7;
-   }
-   switch(curChar)
-   {
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0x10000000000L);
-      case 101:
-         if ((active0 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(7, 22, 28);
-         else if ((active0 & 0x8000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 63, 28);
-         return jjMoveStringLiteralDfa8_0(active0, 0x804000000000L);
-      case 110:
-         return jjMoveStringLiteralDfa8_0(active0, 0x880001000000000L);
-      case 112:
-         if ((active0 & 0x10000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 52, 28);
-         break;
-      case 116:
-         if ((active0 & 0x1000L) != 0L)
-            return jjStartNfaWithStates_0(7, 12, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(6, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa8_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(6, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(7, active0, 0L, 0L);
-      return 8;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x800000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 47, 28);
-         break;
-      case 101:
-         if ((active0 & 0x10000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 40, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active0, 0x80000000000000L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0x4000000000L);
-      case 116:
-         if ((active0 & 0x800000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 59, 28);
-         return jjMoveStringLiteralDfa9_0(active0, 0x1000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(7, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa9_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(7, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(8, active0, 0L, 0L);
-      return 9;
-   }
-   switch(curChar)
-   {
-      case 102:
-         if ((active0 & 0x4000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 38, 28);
-         break;
-      case 115:
-         if ((active0 & 0x1000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 36, 28);
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa10_0(active0, 0x80000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(8, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa10_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(8, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(9, active0, 0L, 0L);
-      return 10;
-   }
-   switch(curChar)
-   {
-      case 101:
-         return jjMoveStringLiteralDfa11_0(active0, 0x80000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(9, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa11_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(9, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(10, active0, 0L, 0L);
-      return 11;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x80000000000000L) != 0L)
-            return jjStartNfaWithStates_0(11, 55, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(10, active0, 0L, 0L);
-}
-private final void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private final void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
-   jjCheckNAdd(jjnextStates[start]);
-   jjCheckNAdd(jjnextStates[start + 1]);
-}
-static final long[] jjbitVec0 = {
-   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec2 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec3 = {
-   0xfff0000000200002L, 0xffffffffffffdfffL, 0xfffff00f7fffffffL, 0x12000000007fffffL
-};
-static final long[] jjbitVec4 = {
-   0x0L, 0x0L, 0x420043c00000000L, 0xff7fffffff7fffffL
-};
-static final long[] jjbitVec5 = {
-   0xffffcffffffffL, 0xffffffffffff0000L, 0xf9ff3fffffffffffL, 0x401f00030003L
-};
-static final long[] jjbitVec6 = {
-   0x0L, 0x400000000000000L, 0xfffffffbffffd740L, 0xffffffcff7fffL
-};
-static final long[] jjbitVec7 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffffff003L, 0x33fffffffff199fL
-};
-static final long[] jjbitVec8 = {
-   0xfffe000000000000L, 0xfffffffe027fffffL, 0xffL, 0x707ffffff0000L
-};
-static final long[] jjbitVec9 = {
-   0x7fffffe00000000L, 0xfffe0000000007ffL, 0xffffffffffffffffL, 0x1c000060002fffffL
-};
-static final long[] jjbitVec10 = {
-   0x1ffffffd0000L, 0x0L, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec11 = {
-   0x23ffffffffffffe0L, 0x3ff010000L, 0x3c5fdfffff99fe0L, 0xf0003b0000000L
-};
-static final long[] jjbitVec12 = {
-   0x36dfdfffff987e0L, 0x1c00005e000000L, 0x23edfdfffffbafe0L, 0x100010000L
-};
-static final long[] jjbitVec13 = {
-   0x23cdfdfffff99fe0L, 0x3b0000000L, 0x3bfc718d63dc7e0L, 0x0L
-};
-static final long[] jjbitVec14 = {
-   0x3effdfffffddfe0L, 0x300000000L, 0x3effdfffffddfe0L, 0x340000000L
-};
-static final long[] jjbitVec15 = {
-   0x3fffdfffffddfe0L, 0x300000000L, 0x2ffbfffffc7fffe0L, 0x7fL
-};
-static final long[] jjbitVec16 = {
-   0x800dfffffffffffeL, 0x7fL, 0x200decaefef02596L, 0x3000005fL
-};
-static final long[] jjbitVec17 = {
-   0x1L, 0x7fffffffeffL, 0xf00L, 0x0L
-};
-static final long[] jjbitVec18 = {
-   0x6fbffffffffL, 0x3f0000L, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-static final long[] jjbitVec19 = {
-   0xffffffffffffffffL, 0xffffffff83ffffffL, 0xffffff07ffffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec20 = {
-   0xffffffffffffff7fL, 0xffffffff3d7f3d7fL, 0x7f3d7fffffff3d7fL, 0xffff7fffff7f7f3dL
-};
-static final long[] jjbitVec21 = {
-   0xffffffff7f3d7fffL, 0x7ffff7fL, 0xffffffff00000000L, 0x1fffffffffffffL
-};
-static final long[] jjbitVec22 = {
-   0xffffffffffffffffL, 0x7f9fffffffffffL, 0xffffffff07fffffeL, 0x7ffffffffffL
-};
-static final long[] jjbitVec23 = {
-   0x0L, 0x0L, 0xfffffffffffffL, 0x8000000L
-};
-static final long[] jjbitVec24 = {
-   0xffffffff00000000L, 0xffffffffffffffL, 0x1ffffffffffL, 0x0L
-};
-static final long[] jjbitVec25 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffff0fffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec26 = {
-   0xffffffff3f3fffffL, 0x3fffffffaaff3f3fL, 0x5fdfffffffffffffL, 0x1fdc1fff0fcf1fdcL
-};
-static final long[] jjbitVec27 = {
-   0x8000000000000000L, 0x8000000000000001L, 0xffff00000000L, 0x0L
-};
-static final long[] jjbitVec28 = {
-   0x3fbbd503e2ffc84L, 0xffffffff00000000L, 0xfL, 0x0L
-};
-static final long[] jjbitVec29 = {
-   0x73e03fe000000e0L, 0xfffffffffffffffeL, 0xfffffffe601fffffL, 0x7fffffffffffffffL
-};
-static final long[] jjbitVec30 = {
-   0xfffe1fffffffffe0L, 0xffffffffffffffffL, 0xffffff00007fffL, 0x0L
-};
-static final long[] jjbitVec31 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffffffL, 0x0L
-};
-static final long[] jjbitVec32 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec33 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x1fffL, 0x0L
-};
-static final long[] jjbitVec34 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffL, 0x0L
-};
-static final long[] jjbitVec35 = {
-   0x3fffffffffffL, 0x0L, 0x0L, 0x0L
-};
-static final long[] jjbitVec36 = {
-   0x5f7ffdffa0f8007fL, 0xffffffffffffffdbL, 0x3ffffffffffffL, 0xfffffffffff80000L
-};
-static final long[] jjbitVec37 = {
-   0x3fffffffffffffffL, 0xffffffffffff0000L, 0xfffffffffffcffffL, 0xfff0000000000ffL
-};
-static final long[] jjbitVec38 = {
-   0x18000000000000L, 0xffd702000000e000L, 0xffffffffffffffffL, 0x1fffffffffffffffL
-};
-static final long[] jjbitVec39 = {
-   0x87fffffe00000010L, 0xffffffe007fffffeL, 0x7fffffffffffffffL, 0x631cfcfcfcL
-};
-static final long[] jjbitVec40 = {
-   0x0L, 0x0L, 0x420043cffffffffL, 0xff7fffffff7fffffL
-};
-static final long[] jjbitVec41 = {
-   0xffffffffffffffffL, 0x400000700007fffL, 0xfffffffbffffd740L, 0xffffffcff7fffL
-};
-static final long[] jjbitVec42 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffffff07bL, 0x33fffffffff199fL
-};
-static final long[] jjbitVec43 = {
-   0xfffe000000000000L, 0xfffffffe027fffffL, 0xbbfffffbfffe00ffL, 0x707ffffff0016L
-};
-static final long[] jjbitVec44 = {
-   0x7fffffe00000000L, 0xffff03ff003fffffL, 0xffffffffffffffffL, 0x1fff3dff9fefffffL
-};
-static final long[] jjbitVec45 = {
-   0xffff1fffffff8000L, 0x7ffL, 0x1ffffffffffffL, 0x0L
-};
-static final long[] jjbitVec46 = {
-   0xf3ffffffffffffeeL, 0xffcfff1f3fffL, 0xd3c5fdfffff99feeL, 0xfffcfb080399fL
-};
-static final long[] jjbitVec47 = {
-   0xd36dfdfffff987e4L, 0x1fffc05e003987L, 0xf3edfdfffffbafeeL, 0xffc100013bbfL
-};
-static final long[] jjbitVec48 = {
-   0xf3cdfdfffff99feeL, 0xffc3b0c0398fL, 0xc3bfc718d63dc7ecL, 0xff8000803dc7L
-};
-static final long[] jjbitVec49 = {
-   0xc3effdfffffddfeeL, 0xffc300603ddfL, 0xc3effdfffffddfecL, 0xffc340603ddfL
-};
-static final long[] jjbitVec50 = {
-   0xc3fffdfffffddfecL, 0xffc300803dcfL, 0x2ffbfffffc7fffecL, 0xc0000ff5f847fL
-};
-static final long[] jjbitVec51 = {
-   0x87fffffffffffffeL, 0x3ff7fffL, 0x3bffecaefef02596L, 0x33ff3f5fL
-};
-static final long[] jjbitVec52 = {
-   0xc2a003ff03000001L, 0xfffe07fffffffeffL, 0x1ffffffffeff0fdfL, 0x40L
-};
-static final long[] jjbitVec53 = {
-   0x3c7f6fbffffffffL, 0x3ff03ffL, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-static final long[] jjbitVec54 = {
-   0xffffffff7f3d7fffL, 0x3fe0007ffff7fL, 0xffffffff00000000L, 0x1fffffffffffffL
-};
-static final long[] jjbitVec55 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0x3ff080fffffL
-};
-static final long[] jjbitVec56 = {
-   0xffffffff03ff7800L, 0xffffffffffffffL, 0x3ffffffffffL, 0x0L
-};
-static final long[] jjbitVec57 = {
-   0x80007c000000f000L, 0x8000fc0000000001L, 0xffff00000000L, 0x21fff0000L
-};
-static final long[] jjbitVec58 = {
-   0x73efffe000000e0L, 0xfffffffffffffffeL, 0xfffffffe661fffffL, 0x7fffffffffffffffL
-};
-static final long[] jjbitVec59 = {
-   0x5f7ffdffe0f8007fL, 0xffffffffffffffdbL, 0x3ffffffffffffL, 0xfffffffffff80000L
-};
-static final long[] jjbitVec60 = {
-   0x18000f00000000L, 0xffd702000000e000L, 0xffffffffffffffffL, 0x9fffffffffffffffL
-};
-static final long[] jjbitVec61 = {
-   0x87fffffe03ff0010L, 0xffffffe007fffffeL, 0x7fffffffffffffffL, 0xe0000631cfcfcfcL
-};
-private final int jjMoveNfa_0(int startState, int curPos)
-{
-   int[] nextStates;
-   int startsAt = 0;
-   jjnewStateCnt = 70;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int j, kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 47:
-                  if (curChar == 47)
-                  {
-                     if (kind > 8)
-                        kind = 8;
-                     jjCheckNAddStates(0, 2);
-                  }
-                  else if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 45;
-                  break;
-               case 0:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(3, 9);
-                  else if (curChar == 47)
-                     jjAddStates(10, 11);
-                  else if (curChar == 36)
-                  {
-                     if (kind > 76)
-                        kind = 76;
-                     jjCheckNAdd(28);
-                  }
-                  else if (curChar == 34)
-                     jjCheckNAddStates(12, 14);
-                  else if (curChar == 39)
-                     jjAddStates(15, 16);
-                  else if (curChar == 46)
-                     jjCheckNAdd(4);
-                  if ((0x3fe000000000000L & l) != 0L)
-                  {
-                     if (kind > 65)
-                        kind = 65;
-                     jjCheckNAddTwoStates(1, 2);
-                  }
-                  else if (curChar == 48)
-                  {
-                     if (kind > 65)
-                        kind = 65;
-                     jjCheckNAddStates(17, 21);
-                  }
-                  break;
-               case 1:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(1, 2);
-                  break;
-               case 3:
-                  if (curChar == 46)
-                     jjCheckNAdd(4);
-                  break;
-               case 4:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddStates(22, 24);
-                  break;
-               case 6:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 7:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-                  if (curChar == 39)
-                     jjAddStates(15, 16);
-                  break;
-               case 10:
-                  if ((0xffffff7fffffdbffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 11:
-                  if (curChar == 39 && kind > 74)
-                     kind = 74;
-                  break;
-               case 13:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 14:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(15, 11);
-                  break;
-               case 15:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 16:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  break;
-               case 17:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(15);
-                  break;
-               case 18:
-                  if (curChar == 34)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 19:
-                  if ((0xfffffffbffffdbffL & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 21:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 22:
-                  if (curChar == 34 && kind > 75)
-                     kind = 75;
-                  break;
-               case 23:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(25, 28);
-                  break;
-               case 24:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 25:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 26;
-                  break;
-               case 26:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(24);
-                  break;
-               case 27:
-                  if (curChar != 36)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 28:
-                  if ((0x3ff00100fffc1ffL & l) == 0L)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 29:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(3, 9);
-                  break;
-               case 30:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(29, 31);
-                  break;
-               case 32:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(33);
-                  break;
-               case 33:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(33, 8);
-                  break;
-               case 34:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(34, 35);
-                  break;
-               case 36:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(37);
-                  break;
-               case 37:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(37, 8);
-                  break;
-               case 38:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(38, 39);
-                  break;
-               case 39:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddStates(32, 34);
-                  break;
-               case 40:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddStates(32, 34);
-                  break;
-               case 42:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(43);
-                  break;
-               case 43:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(43, 8);
-                  break;
-               case 44:
-                  if (curChar == 47)
-                     jjAddStates(10, 11);
-                  break;
-               case 45:
-                  if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 46;
-                  break;
-               case 46:
-                  if ((0xffff7fffffffffffL & l) != 0L && kind > 6)
-                     kind = 6;
-                  break;
-               case 48:
-                  if (curChar != 47)
-                     break;
-                  if (kind > 8)
-                     kind = 8;
-                  jjCheckNAddStates(0, 2);
-                  break;
-               case 49:
-                  if ((0xffffffffffffdbffL & l) == 0L)
-                     break;
-                  if (kind > 8)
-                     kind = 8;
-                  jjCheckNAddStates(0, 2);
-                  break;
-               case 50:
-                  if ((0x2400L & l) != 0L && kind > 8)
-                     kind = 8;
-                  break;
-               case 51:
-                  if (curChar == 10 && kind > 8)
-                     kind = 8;
-                  break;
-               case 52:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 51;
-                  break;
-               case 53:
-                  if (curChar != 48)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddStates(17, 21);
-                  break;
-               case 55:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(55, 2);
-                  break;
-               case 56:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(56, 2);
-                  break;
-               case 58:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjAddStates(35, 36);
-                  break;
-               case 59:
-                  if (curChar == 46)
-                     jjCheckNAdd(60);
-                  break;
-               case 60:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(60, 61);
-                  break;
-               case 62:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(63);
-                  break;
-               case 63:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(63, 8);
-                  break;
-               case 65:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(37, 39);
-                  break;
-               case 66:
-                  if (curChar == 46)
-                     jjCheckNAdd(67);
-                  break;
-               case 68:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(69);
-                  break;
-               case 69:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(69, 8);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((0x7fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 2:
-                  if ((0x100000001000L & l) != 0L && kind > 65)
-                     kind = 65;
-                  break;
-               case 5:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(40, 41);
-                  break;
-               case 8:
-                  if ((0x5000000050L & l) != 0L && kind > 69)
-                     kind = 69;
-                  break;
-               case 10:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 12:
-                  if (curChar == 92)
-                     jjAddStates(42, 44);
-                  break;
-               case 13:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 19:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 20:
-                  if (curChar == 92)
-                     jjAddStates(45, 47);
-                  break;
-               case 21:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 28:
-                  if ((0x87fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 31:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(48, 49);
-                  break;
-               case 35:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(50, 51);
-                  break;
-               case 41:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(52, 53);
-                  break;
-               case 46:
-                  if (kind > 6)
-                     kind = 6;
-                  break;
-               case 49:
-                  if (kind > 8)
-                     kind = 8;
-                  jjAddStates(0, 2);
-                  break;
-               case 54:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(55);
-                  break;
-               case 55:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(55, 2);
-                  break;
-               case 57:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAddTwoStates(58, 59);
-                  break;
-               case 58:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddTwoStates(58, 59);
-                  break;
-               case 60:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjAddStates(54, 55);
-                  break;
-               case 61:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjAddStates(56, 57);
-                  break;
-               case 64:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(65);
-                  break;
-               case 65:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddStates(37, 39);
-                  break;
-               case 67:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjAddStates(58, 59);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 10:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  break;
-               case 19:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(12, 14);
-                  break;
-               case 28:
-                  if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 46:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 6)
-                     kind = 6;
-                  break;
-               case 49:
-                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 8)
-                     kind = 8;
-                  jjAddStates(0, 2);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 70 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
-   switch(curChar)
-   {
-      case 42:
-         return jjMoveStringLiteralDfa1_2(0x400L);
-      default :
-         return 1;
-   }
-}
-private final int jjMoveStringLiteralDfa1_2(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 47:
-         if ((active0 & 0x400L) != 0L)
-            return jjStopAtPos(1, 10);
-         break;
-      default :
-         return 2;
-   }
-   return 2;
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
-   switch(curChar)
-   {
-      case 42:
-         return jjMoveStringLiteralDfa1_1(0x200L);
-      default :
-         return 1;
-   }
-}
-private final int jjMoveStringLiteralDfa1_1(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 47:
-         if ((active0 & 0x200L) != 0L)
-            return jjStopAtPos(1, 9);
-         break;
-      default :
-         return 2;
-   }
-   return 2;
-}
-static final int[] jjnextStates = {
-   49, 50, 52, 30, 31, 8, 34, 35, 38, 39, 47, 48, 19, 20, 22, 10, 
-   12, 54, 56, 2, 57, 64, 4, 5, 8, 19, 20, 24, 22, 30, 31, 8, 
-   40, 41, 8, 58, 59, 65, 66, 67, 6, 7, 13, 14, 16, 21, 23, 25, 
-   32, 33, 36, 37, 42, 43, 60, 61, 62, 63, 68, 69, 
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec2[i2] & l2) != 0L);
-      default : 
-         if ((jjbitVec0[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec4[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec6[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec7[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec8[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec9[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec10[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec11[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec12[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec13[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec14[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec15[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec16[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec17[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec18[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec21[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec23[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec24[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec27[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec29[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec36[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec38[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec39[i2] & l2) != 0L);
-      default : 
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec40[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec41[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec42[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec43[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec44[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec45[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec46[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec47[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec48[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec49[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec50[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec51[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec52[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec53[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec54[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec55[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec56[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec57[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec58[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec59[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec60[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec61[i2] & l2) != 0L);
-      default : 
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, null, null, null, null, 
-"\141\142\163\164\162\141\143\164", "\141\163\163\145\162\164", "\142\157\157\154\145\141\156", 
-"\142\162\145\141\153", "\142\171\164\145", "\143\141\163\145", "\143\141\164\143\150", 
-"\143\150\141\162", "\143\154\141\163\163", "\143\157\156\163\164", 
-"\143\157\156\164\151\156\165\145", "\144\145\146\141\165\154\164", "\144\157", "\144\157\165\142\154\145", 
-"\145\154\163\145", "\145\156\165\155", "\145\170\164\145\156\144\163", "\146\141\154\163\145", 
-"\146\151\156\141\154", "\146\151\156\141\154\154\171", "\146\154\157\141\164", "\146\157\162", 
-"\147\157\164\157", "\151\146", "\151\155\160\154\145\155\145\156\164\163", 
-"\151\155\160\157\162\164", "\151\156\163\164\141\156\143\145\157\146", "\151\156\164", 
-"\151\156\164\145\162\146\141\143\145", "\154\157\156\147", "\156\141\164\151\166\145", "\156\145\167", 
-"\156\165\154\154", "\160\141\143\153\141\147\145", "\160\162\151\166\141\164\145", 
-"\160\162\157\164\145\143\164\145\144", "\160\165\142\154\151\143", "\162\145\164\165\162\156", 
-"\163\150\157\162\164", "\163\164\141\164\151\143", "\163\164\162\151\143\164\146\160", 
-"\163\165\160\145\162", "\163\167\151\164\143\150", 
-"\163\171\156\143\150\162\157\156\151\172\145\144", "\164\150\151\163", "\164\150\162\157\167", "\164\150\162\157\167\163", 
-"\164\162\141\156\163\151\145\156\164", "\164\162\165\145", "\164\162\171", "\166\157\151\144", 
-"\166\157\154\141\164\151\154\145", "\167\150\151\154\145", null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, "\50", "\51", "\173", "\175", "\133", "\135", "\73", 
-"\54", "\56", "\100", "\75", "\74", "\41", "\176", "\77", "\72", "\75\75", "\74\75", 
-"\76\75", "\41\75", "\174\174", "\46\46", "\53\53", "\55\55", "\53", "\55", "\52", 
-"\57", "\46", "\174", "\136", "\45", "\74\74", "\53\75", "\55\75", "\52\75", 
-"\57\75", "\46\75", "\174\75", "\136\75", "\45\75", "\74\74\75", "\76\76\75", 
-"\76\76\76\75", "\56\56\56", "\76\76\76", "\76\76", "\76", "\32", null, };
-public static final String[] lexStateNames = {
-   "DEFAULT", 
-   "IN_FORMAL_COMMENT", 
-   "IN_MULTI_LINE_COMMENT", 
-};
-public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, 1, 2, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xfffffffffffff001L, 0xffffffffffff9c23L, 0x1L, 
-};
-static final long[] jjtoSkip = {
-   0x73eL, 0x0L, 0x0L, 
-};
-static final long[] jjtoSpecial = {
-   0x700L, 0x0L, 0x0L, 
-};
-static final long[] jjtoMore = {
-   0x8c0L, 0x0L, 0x0L, 
-};
-protected JavaCharStream input_stream;
-private final int[] jjrounds = new int[70];
-private final int[] jjstateSet = new int[140];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public JavaParser15TokenManager(JavaCharStream stream){
-   if (JavaCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-public JavaParser15TokenManager(JavaCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
-public void ReInit(JavaCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private final void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 70; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-public void ReInit(JavaCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 3 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   Token t = Token.newToken(jjmatchedKind);
-   t.kind = jjmatchedKind;
-   String im = jjstrLiteralImages[jjmatchedKind];
-   t.image = (im == null) ? input_stream.GetImage() : im;
-   t.beginLine = input_stream.getBeginLine();
-   t.beginColumn = input_stream.getBeginColumn();
-   t.endLine = input_stream.getEndLine();
-   t.endColumn = input_stream.getEndColumn();
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken() 
-{
-  int kind;
-  Token specialToken = null;
-  Token matchedToken;
-  int curPos = 0;
-
-  EOFLoop :
-  for (;;)
-  {   
-   try   
-   {     
-      curChar = input_stream.BeginToken();
-   }     
-   catch(java.io.IOException e)
-   {        
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      matchedToken.specialToken = specialToken;
-      return matchedToken;
-   }
-   image = null;
-   jjimageLen = 0;
-
-   for (;;)
-   {
-     switch(curLexState)
-     {
-       case 0:
-         try { input_stream.backup(0);
-            while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L)
-               curChar = input_stream.BeginToken();
-         }
-         catch (java.io.IOException e1) { continue EOFLoop; }
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_0();
-         if (jjmatchedPos == 0 && jjmatchedKind > 128)
-         {
-            jjmatchedKind = 128;
-         }
-         break;
-       case 1:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_1();
-         if (jjmatchedPos == 0 && jjmatchedKind > 11)
-         {
-            jjmatchedKind = 11;
-         }
-         break;
-       case 2:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_2();
-         if (jjmatchedPos == 0 && jjmatchedKind > 11)
-         {
-            jjmatchedKind = 11;
-         }
-         break;
-     }
-     if (jjmatchedKind != 0x7fffffff)
-     {
-        if (jjmatchedPos + 1 < curPos)
-           input_stream.backup(curPos - jjmatchedPos - 1);
-        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           matchedToken = jjFillToken();
-           matchedToken.specialToken = specialToken;
-           TokenLexicalActions(matchedToken);
-       if (jjnewLexState[jjmatchedKind] != -1)
-         curLexState = jjnewLexState[jjmatchedKind];
-           return matchedToken;
-        }
-        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-           {
-              matchedToken = jjFillToken();
-              if (specialToken == null)
-                 specialToken = matchedToken;
-              else
-              {
-                 matchedToken.specialToken = specialToken;
-                 specialToken = (specialToken.next = matchedToken);
-              }
-              SkipLexicalActions(matchedToken);
-           }
-           else 
-              SkipLexicalActions(null);
-         if (jjnewLexState[jjmatchedKind] != -1)
-           curLexState = jjnewLexState[jjmatchedKind];
-           continue EOFLoop;
-        }
-        MoreLexicalActions();
-      if (jjnewLexState[jjmatchedKind] != -1)
-        curLexState = jjnewLexState[jjmatchedKind];
-        curPos = 0;
-        jjmatchedKind = 0x7fffffff;
-        try {
-           curChar = input_stream.readChar();
-           continue;
-        }
-        catch (java.io.IOException e1) { }
-     }
-     int error_line = input_stream.getEndLine();
-     int error_column = input_stream.getEndColumn();
-     String error_after = null;
-     boolean EOFSeen = false;
-     try { input_stream.readChar(); input_stream.backup(1); }
-     catch (java.io.IOException e1) {
-        EOFSeen = true;
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-        if (curChar == '\n' || curChar == '\r') {
-           error_line++;
-           error_column = 0;
-        }
-        else
-           error_column++;
-     }
-     if (!EOFSeen) {
-        input_stream.backup(1);
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-     }
-     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-   }
-  }
-}
-
-void SkipLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      default :
-         break;
-   }
-}
-void MoreLexicalActions()
-{
-   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
-   switch(jjmatchedKind)
-   {
-      case 6 :
-         if (image == null)
-            image = new StringBuffer();
-         image.append(input_stream.GetSuffix(jjimageLen));
-         jjimageLen = 0;
-                   input_stream.backup(1);
-         break;
-      default : 
-         break;
-   }
-}
-void TokenLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      case 124 :
-        if (image == null)
-            image = new StringBuffer();
-            image.append(jjstrLiteralImages[124]);
-     matchedToken.kind = GT;
-     ((Token.GTToken)matchedToken).realKind = RUNSIGNEDSHIFT;
-     input_stream.backup(2);
-     matchedToken.image = ">";
-         break;
-      case 125 :
-        if (image == null)
-            image = new StringBuffer();
-            image.append(jjstrLiteralImages[125]);
-     matchedToken.kind = GT;
-     ((Token.GTToken)matchedToken).realKind = RSIGNEDSHIFT;
-     input_stream.backup(1);
-     matchedToken.image = ">";
-         break;
-      default : 
-         break;
-   }
-}
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/ParseException.java b/src/net/sourceforge/cobertura/javancss/parser/java15/ParseException.java
deleted file mode 100644
index d9f4289..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/ParseException.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 4.1 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
-package net.sourceforge.cobertura.javancss.parser.java15;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.  The boolean
-   * flag "specialConstructor" is also set to true to indicate that
-   * this constructor was used to create this object.
-   * This constructor calls its super class with the empty string
-   * to force the "toString" method of parent class "Throwable" to
-   * print the error message in the form:
-   *     ParseException: <result of getMessage>
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super("");
-    specialConstructor = true;
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-    specialConstructor = false;
-  }
-
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-    specialConstructor = false;
-  }
-
-  /**
-   * This variable determines which constructor was used to create
-   * this object and thereby affects the semantics of the
-   * "getMessage" method (see below).
-   */
-  protected boolean specialConstructor;
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * This method has the standard behavior when this object has been
-   * created using the standard constructors.  Otherwise, it uses
-   * "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser), then this method is called during the printing
-   * of the final stack trace, and hence the correct error message
-   * gets displayed.
-   */
-  public String getMessage() {
-    if (!specialConstructor) {
-      return super.getMessage();
-    }
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-    retval += expected.toString();
-    return retval;
-  }
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  protected String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-}
-/* JavaCC - OriginalChecksum=e07eeb809ef62869a5836bb515bc01e5 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/Token.java b/src/net/sourceforge/cobertura/javancss/parser/java15/Token.java
deleted file mode 100644
index 9f14603..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/Token.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/**
- * Describes the input token stream.
- */
-
-package net.sourceforge.cobertura.javancss.parser.java15;
-
-public class Token {
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /**
-   * beginLine and beginColumn describe the position of the first character
-   * of this token; endLine and endColumn describe the position of the
-   * last character of this token.
-   */
-  public int beginLine, beginColumn, endLine, endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-     return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simlpy add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken();
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use it in your lexical actions.
-   */
-  public static final Token newToken(int ofKind)
-  {
-     switch(ofKind)
-     {
-       default : return new Token();
-       case JavaParser15Constants.RUNSIGNEDSHIFT:
-       case JavaParser15Constants.RSIGNEDSHIFT:
-       case JavaParser15Constants.GT:
-          return new GTToken();
-     }
-  }
-
-  public static class GTToken extends Token
-  {
-     int realKind = JavaParser15Constants.GT;
-  }
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/TokenMgrError.java b/src/net/sourceforge/cobertura/javancss/parser/java15/TokenMgrError.java
deleted file mode 100644
index 88440ec..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/TokenMgrError.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 4.1 */
-/* JavaCCOptions: */
-package net.sourceforge.cobertura.javancss.parser.java15;
-
-/** Token Manager Error. */
-public class TokenMgrError extends Error
-{
-
-   /*
-    * Ordinals for various reasons why an Error of this type can be thrown.
-    */
-
-   /**
-    * Lexical error occurred.
-    */
-   static final int LEXICAL_ERROR = 0;
-
-   /**
-    * An attempt was made to create a second instance of a static token manager.
-    */
-   static final int STATIC_LEXER_ERROR = 1;
-
-   /**
-    * Tried to change to an invalid lexical state.
-    */
-   static final int INVALID_LEXICAL_STATE = 2;
-
-   /**
-    * Detected (and bailed out of) an infinite loop in the token manager.
-    */
-   static final int LOOP_DETECTED = 3;
-
-   /**
-    * Indicates the reason why the exception is thrown. It will have
-    * one of the above 4 values.
-    */
-   int errorCode;
-
-   /**
-    * Replaces unprintable characters by their escaped (or unicode escaped)
-    * equivalents in the given string
-    */
-   protected static final String addEscapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-   /**
-    * Returns a detailed message for the Error when it is thrown by the
-    * token manager to indicate a lexical error.
-    * Parameters :
-    *    EOFSeen     : indicates if EOF caused the lexical error
-    *    curLexState : lexical state in which this error occurred
-    *    errorLine   : line number when the error occurred
-    *    errorColumn : column number when the error occurred
-    *    errorAfter  : prefix that was seen before this error occurred
-    *    curchar     : the offending character
-    * Note: You can customize the lexical error message by modifying this method.
-    */
-   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-      return("Lexical error at line " +
-           errorLine + ", column " +
-           errorColumn + ".  Encountered: " +
-           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-           "after : \"" + addEscapes(errorAfter) + "\"");
-   }
-
-   /**
-    * You can also modify the body of this method to customize your error messages.
-    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-    * of end-users concern, so you can return something like :
-    *
-    *     "Internal Error : Please file a bug report .... "
-    *
-    * from this method for such cases in the release version of your parser.
-    */
-   public String getMessage() {
-      return super.getMessage();
-   }
-
-   /*
-    * Constructors of various flavors follow.
-    */
-
-   /** No arg constructor. */
-   public TokenMgrError() {
-   }
-
-   /** Constructor with message and reason. */
-   public TokenMgrError(String message, int reason) {
-      super(message);
-      errorCode = reason;
-   }
-
-   /** Full Constructor. */
-   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-   }
-}
-/* JavaCC - OriginalChecksum=a8b95413d91ef43eb316f9594e077ab0 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaCharStream.java b/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaCharStream.java
deleted file mode 100644
index 3b6087f..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaCharStream.java
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 4.1 */
-/* JavaCCOptions:STATIC=false */
-package net.sourceforge.cobertura.javancss.parser.java15.debug;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (with java-like unicode escape processing).
- */
-
-public class JavaCharStream
-{
-/** Whether parser is static. */
-  public static final boolean staticFlag = false;
-  static final int hexval(char c) throws java.io.IOException {
-    switch(c)
-    {
-       case '0' :
-          return 0;
-       case '1' :
-          return 1;
-       case '2' :
-          return 2;
-       case '3' :
-          return 3;
-       case '4' :
-          return 4;
-       case '5' :
-          return 5;
-       case '6' :
-          return 6;
-       case '7' :
-          return 7;
-       case '8' :
-          return 8;
-       case '9' :
-          return 9;
-
-       case 'a' :
-       case 'A' :
-          return 10;
-       case 'b' :
-       case 'B' :
-          return 11;
-       case 'c' :
-       case 'C' :
-          return 12;
-       case 'd' :
-       case 'D' :
-          return 13;
-       case 'e' :
-       case 'E' :
-          return 14;
-       case 'f' :
-       case 'F' :
-          return 15;
-    }
-
-    throw new java.io.IOException(); // Should never come here
-  }
-
-/** Position in buffer. */
-  public int bufpos = -1;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] nextCharBuf;
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int nextCharInd = -1;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-     char[] newbuffer = new char[bufsize + 2048];
-     int newbufline[] = new int[bufsize + 2048];
-     int newbufcolumn[] = new int[bufsize + 2048];
-
-     try
-     {
-        if (wrapAround)
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           System.arraycopy(buffer, 0, newbuffer,
-                                             bufsize - tokenBegin, bufpos);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-           bufcolumn = newbufcolumn;
-
-           bufpos += (bufsize - tokenBegin);
-        }
-        else
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           bufcolumn = newbufcolumn;
-
-           bufpos -= tokenBegin;
-        }
-     }
-     catch (Throwable t)
-     {
-        throw new Error(t.getMessage());
-     }
-
-     available = (bufsize += 2048);
-     tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-     int i;
-     if (maxNextCharInd == 4096)
-        maxNextCharInd = nextCharInd = 0;
-
-     try {
-        if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
-                                            4096 - maxNextCharInd)) == -1)
-        {
-           inputStream.close();
-           throw new java.io.IOException();
-        }
-        else
-           maxNextCharInd += i;
-        return;
-     }
-     catch(java.io.IOException e) {
-        if (bufpos != 0)
-        {
-           --bufpos;
-           backup(0);
-        }
-        else
-        {
-           bufline[bufpos] = line;
-           bufcolumn[bufpos] = column;
-        }
-        throw e;
-     }
-  }
-
-  protected char ReadByte() throws java.io.IOException
-  {
-     if (++nextCharInd >= maxNextCharInd)
-        FillBuff();
-
-     return nextCharBuf[nextCharInd];
-  }
-
-/** @return starting character for token. */
-  public char BeginToken() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        tokenBegin = bufpos;
-        return buffer[bufpos];
-     }
-
-     tokenBegin = 0;
-     bufpos = -1;
-
-     return readChar();
-  }
-
-  protected void AdjustBuffSize()
-  {
-     if (available == bufsize)
-     {
-        if (tokenBegin > 2048)
-        {
-           bufpos = 0;
-           available = tokenBegin;
-        }
-        else
-           ExpandBuff(false);
-     }
-     else if (available > tokenBegin)
-        available = bufsize;
-     else if ((tokenBegin - available) < 2048)
-        ExpandBuff(true);
-     else
-        available = tokenBegin;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-     column++;
-
-     if (prevCharIsLF)
-     {
-        prevCharIsLF = false;
-        line += (column = 1);
-     }
-     else if (prevCharIsCR)
-     {
-        prevCharIsCR = false;
-        if (c == '\n')
-        {
-           prevCharIsLF = true;
-        }
-        else
-           line += (column = 1);
-     }
-
-     switch (c)
-     {
-        case '\r' :
-           prevCharIsCR = true;
-           break;
-        case '\n' :
-           prevCharIsLF = true;
-           break;
-        case '\t' :
-           column--;
-           column += (tabSize - (column % tabSize));
-           break;
-        default :
-           break;
-     }
-
-     bufline[bufpos] = line;
-     bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        return buffer[bufpos];
-     }
-
-     char c;
-
-     if (++bufpos == available)
-        AdjustBuffSize();
-
-     if ((buffer[bufpos] = c = ReadByte()) == '\\')
-     {
-        UpdateLineColumn(c);
-
-        int backSlashCnt = 1;
-
-        for (;;) // Read all the backslashes
-        {
-           if (++bufpos == available)
-              AdjustBuffSize();
-
-           try
-           {
-              if ((buffer[bufpos] = c = ReadByte()) != '\\')
-              {
-                 UpdateLineColumn(c);
-                 // found a non-backslash char.
-                 if ((c == 'u') && ((backSlashCnt & 1) == 1))
-                 {
-                    if (--bufpos < 0)
-                       bufpos = bufsize - 1;
-
-                    break;
-                 }
-
-                 backup(backSlashCnt);
-                 return '\\';
-              }
-           }
-           catch(java.io.IOException e)
-           {
-              if (backSlashCnt > 1)
-                 backup(backSlashCnt-1);
-
-              return '\\';
-           }
-
-           UpdateLineColumn(c);
-           backSlashCnt++;
-        }
-
-        // Here, we have seen an odd number of backslash's followed by a 'u'
-        try
-        {
-           while ((c = ReadByte()) == 'u')
-              ++column;
-
-           buffer[bufpos] = c = (char)(hexval(c) << 12 |
-                                       hexval(ReadByte()) << 8 |
-                                       hexval(ReadByte()) << 4 |
-                                       hexval(ReadByte()));
-
-           column += 4;
-        }
-        catch(java.io.IOException e)
-        {
-           throw new Error("Invalid escape character at line " + line +
-                                         " column " + column + ".");
-        }
-
-        if (backSlashCnt == 1)
-           return c;
-        else
-        {
-           backup(backSlashCnt - 1);
-           return '\\';
-        }
-     }
-     else
-     {
-        UpdateLineColumn(c);
-        return c;
-     }
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-  public int getColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-  public int getLine() {
-     return bufline[bufpos];
-  }
-
-/** Get end column. */
-  public int getEndColumn() {
-     return bufcolumn[bufpos];
-  }
-
-/** Get end line. */
-  public int getEndLine() {
-     return bufline[bufpos];
-  }
-
-/** @return column of token start */
-  public int getBeginColumn() {
-     return bufcolumn[tokenBegin];
-  }
-
-/** @return line number of token start */
-  public int getBeginLine() {
-     return bufline[tokenBegin];
-  }
-
-/** Retreat. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-       bufpos += bufsize;
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-    nextCharBuf = new char[4096];
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.Reader dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                 int startline, int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-      nextCharBuf = new char[4096];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    nextCharInd = bufpos = -1;
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream,
-                                        int startline, int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
-                        int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, int startline,
-                        int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     this(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Constructor. */
-  public JavaCharStream(java.io.InputStream dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-     ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-/** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-
-  /** @return token image as String */
-  public String GetImage()
-  {
-     if (bufpos >= tokenBegin)
-        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-     else
-        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  /** @return suffix */
-  public char[] GetSuffix(int len)
-  {
-     char[] ret = new char[len];
-
-     if ((bufpos + 1) >= len)
-        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-     else
-     {
-        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                          len - bufpos - 1);
-        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-     }
-
-     return ret;
-  }
-
-  /** Set buffers back to null when finished. */
-  public void Done()
-  {
-     nextCharBuf = null;
-     buffer = null;
-     bufline = null;
-     bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-     int start = tokenBegin;
-     int len;
-
-     if (bufpos >= tokenBegin)
-     {
-        len = bufpos - tokenBegin + inBuf + 1;
-     }
-     else
-     {
-        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-     }
-
-     int i = 0, j = 0, k = 0;
-     int nextColDiff = 0, columnDiff = 0;
-
-     while (i < len &&
-            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-     {
-        bufline[j] = newLine;
-        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-        bufcolumn[j] = newCol + columnDiff;
-        columnDiff = nextColDiff;
-        i++;
-     }
-
-     if (i < len)
-     {
-        bufline[j] = newLine++;
-        bufcolumn[j] = newCol + columnDiff;
-
-        while (i++ < len)
-        {
-           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-              bufline[j] = newLine++;
-           else
-              bufline[j] = newLine;
-        }
-     }
-
-     line = bufline[j];
-     column = bufcolumn[j];
-  }
-
-}
-/* JavaCC - OriginalChecksum=3bced93e01c0a998378298081a0c2697 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15Debug.java b/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15Debug.java
deleted file mode 100644
index d8af290..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15Debug.java
+++ /dev/null
@@ -1,7044 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParser15Debug.java */
-package net.sourceforge.cobertura.javancss.parser.java15.debug;
-
-import java.io.*;
-
-import net.sourceforge.cobertura.javancss.parser.JavaParserInterface;
-import java.util.*;
-
-import net.sourceforge.cobertura.javancss.FunctionMetric;
-import net.sourceforge.cobertura.javancss.ObjectMetric;
-import net.sourceforge.cobertura.javancss.PackageMetric;
-
-/**
- * Grammar to parse Java version 1.5
- * @author Sreenivasa Viswanadha - Simplified and enhanced for 1.5
- */
-public class JavaParser15Debug implements JavaParserInterface, JavaParser15DebugConstants {
-    private boolean _bReturn         = false;
-    private int     _ncss            = 0;     // general counter
-    private int     _loc             = 0;
-    private int     _cyc             = 1;
-    private int     _localCases      = 0;
-    private String  _sName           = "";    // name of last token
-    private String  _sParameter      = "";
-    private String  _sPackage        = "";
-    private String  _sClass          = "";
-    private String  _sFunction       = "";
-    private int     _functions       = 0;     // number of functions in this class
-    //private int     _topLevelClasses = 0;
-    private int     _classes         = 0;
-    private int     _classLevel      = 0;
-    private int     _anonClassCount  = 1;
-
-    private int     _jvdcLines = 0;           // added by SMS
-    private int     _jvdc      = 0;
-    private boolean _bPrivate  = true;//false;        // added by SMS
-    private boolean _bPublic   = true;        // added by SMS
-
-    /**
-     * For each class the number of formal
-     * comments in toplevel methods, constructors, inner
-     * classes, and for the class itself are counted.
-     * The top level comment has to be directly before
-     * the class definition, not before the package or
-     * import statement as it is often seen in source code
-     * examples (at the beginning of your source files you
-     * should instead put your copyright notice).
-     */
-    private int    _javadocs   = 0;              // global javadocs
-    private List/*<FunctionMetric>*/ _vFunctions = new ArrayList();   // holds the statistics for each method
-
-    /** 
-     * Metrics for each class/interface are stored in this
-     * vector.
-     */
-    private List/*<ObjectMetric>*/ _vClasses = new ArrayList();
-    private List _vImports = new ArrayList();
-    private Object[] _aoPackage = null;
-    private Map/*<String,PackageMetric>*/ _htPackage = new HashMap();
-    private PackageMetric _pPackageMetric;
-
-    private Token _tmpToken = null;
-    /** Argh, too much of a state machine. */
-    private Token _tmpResultToken = null;
-
-    private String _formatPackage(String sPackage_) {
-        if (sPackage_.equals("")) {
-            return ".";
-        }
-
-        return sPackage_.substring(0, sPackage_.length() - 1);
-    }
-
-
-    public void parse() throws Exception {
-      CompilationUnit();
-    }
-
-    public void parseImportUnit() throws Exception {
-      ImportUnit();
-    }
-
-    public int getNcss() {
-        return _ncss;
-    }
-
-    public int getLOC() {
-        return _loc;
-    }
-
-    // added by SMS
-    public int getJvdc() {
-        return _jvdc;
-    }
-
-    /*public int getTopLevelClasses() {
-      return _topLevelClasses;
-      }*/
-
-    public List/*<FunctionMetric>*/ getFunction() {
-        return _vFunctions;
-    }
-
-    /**
-     * @return Top level classes in sorted order
-     */
-    public List/*<ObjectMetric>*/ getObject() {
-        Collections.sort(_vClasses);
-        return _vClasses;
-    }
-
-    /**
-     * @return The empty package consists of the name ".".
-     */
-    public Map/*<String,PackageMetric>*/ getPackage() {
-        return _htPackage;
-    }
-
-    public List getImports() {
-        return _vImports;
-    }
-
-    /**
-     * name, beginLine, ...
-     */
-    public Object[] getPackageObjects() {
-        return _aoPackage;
-    }
-
-    /**
-     * if javancss is used with cat *.java a long
-     * input stream might get generated, so line
-     * number information in case of an parse exception
-     * is not very useful.
-     */
-    public String getLastFunction() {
-        return _sPackage + _sClass + _sFunction;
-    }
-   /**
-    * Class to hold modifiers.
-    */
-   static public final class ModifierSet
-   {
-     /* Definitions of the bits in the modifiers field.  */
-     public static final int PUBLIC = 0x0001;
-     public static final int PROTECTED = 0x0002;
-     public static final int PRIVATE = 0x0004;
-     public static final int ABSTRACT = 0x0008;
-     public static final int STATIC = 0x0010;
-     public static final int FINAL = 0x0020;
-     public static final int SYNCHRONIZED = 0x0040;
-     public static final int NATIVE = 0x0080;
-     public static final int TRANSIENT = 0x0100;
-     public static final int VOLATILE = 0x0200;
-     public static final int STRICTFP = 0x1000;
-
-     /** A set of accessors that indicate whether the specified modifier
-         is in the set. */
-
-     public boolean isPublic(int modifiers)
-     {
-       return (modifiers & PUBLIC) != 0;
-     }
-
-     public boolean isProtected(int modifiers)
-     {
-       return (modifiers & PROTECTED) != 0;
-     }
-
-     public boolean isPrivate(int modifiers)
-     {
-       return (modifiers & PRIVATE) != 0;
-     }
-
-     public boolean isStatic(int modifiers)
-     {
-       return (modifiers & STATIC) != 0;
-     }
-
-     public boolean isAbstract(int modifiers)
-     {
-       return (modifiers & ABSTRACT) != 0;
-     }
-
-     public boolean isFinal(int modifiers)
-     {
-       return (modifiers & FINAL) != 0;
-     }
-
-     public boolean isNative(int modifiers)
-     {
-       return (modifiers & NATIVE) != 0;
-     }
-
-     public boolean isStrictfp(int modifiers)
-     {
-       return (modifiers & STRICTFP) != 0;
-     }
-
-     public boolean isSynchronized(int modifiers)
-     {
-       return (modifiers & SYNCHRONIZED) != 0;
-     }
-
-     public boolean isTransient(int modifiers)
-      {
-       return (modifiers & TRANSIENT) != 0;
-     }
-
-     public boolean isVolatile(int modifiers)
-     {
-       return (modifiers & VOLATILE) != 0;
-     }
-
-     /**
-      * Removes the given modifier.
-      */
-     static int removeModifier(int modifiers, int mod)
-     {
-        return modifiers & ~mod;
-     }
-   }
-
-   public JavaParser15Debug(String fileName)
-   {
-      this(System.in);
-      try { ReInit(new FileInputStream(new File(fileName))); }
-      catch(Exception e) { e.printStackTrace(); }
-   }
-
-  public static void main(String args[]) {
-    JavaParser15Debug parser;
-    if (args.length == 0) {
-      System.out.println("Java Parser Version 1.5:  Reading from standard input . . .");
-      parser = new JavaParser15Debug(System.in);
-    } else if (args.length == 1) {
-      System.out.println("Java Parser Version 1.5:  Reading from file " + args[0] + " . . .");
-      try {
-        parser = new JavaParser15Debug(new java.io.FileInputStream(args[0]));
-      } catch (java.io.FileNotFoundException e) {
-        System.out.println("Java Parser Version 1.5:  File " + args[0] + " not found.");
-        return;
-      }
-    } else {
-      System.out.println("Java Parser Version 1.5:  Usage is one of:");
-      System.out.println("         java javancss.parser.java15.debug.JavaParser15Debug < inputfile");
-      System.out.println("OR");
-      System.out.println("         java javancss.parser.java15.debug.JavaParser15Debug inputfile");
-      return;
-    }
-    try {
-      parser.CompilationUnit();
-      System.out.println("Java Parser Version 1.1:  Java program parsed successfully.");
-    } catch (ParseException e) {
-      System.out.println(e.getMessage());
-      System.out.println("Java Parser Version 1.1:  Encountered errors during parse.");
-    }
-  }
-
-/*****************************************
- * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
- *****************************************/
-
-/*
- * Program structuring syntax follows.
- */
-  final public void CompilationUnit() throws ParseException {
-    trace_call("CompilationUnit");
-    try {
-      if (jj_2_1(2147483647)) {
-        PackageDeclaration();
-      } else {
-        ;
-      }
-      label_1:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPORT:
-          ;
-          break;
-        default:
-          break label_1;
-        }
-        ImportDeclaration();
-      }
-      label_2:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case CLASS:
-        case ENUM:
-        case FINAL:
-        case INTERFACE:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case STATIC:
-        case STRICTFP:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case SEMICOLON:
-        case AT:
-          ;
-          break;
-        default:
-          break label_2;
-        }
-        TypeDeclaration();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case 127:
-        jj_consume_token(127);
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STUFF_TO_IGNORE:
-        jj_consume_token(STUFF_TO_IGNORE);
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(0);
-    } finally {
-      trace_return("CompilationUnit");
-    }
-  }
-
-  final public void PackageDeclaration() throws ParseException {
-    trace_call("PackageDeclaration");
-    try {
-      Modifiers();
-      jj_consume_token(PACKAGE);
-      Name();
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("PackageDeclaration");
-    }
-  }
-
-  final public void ImportUnit() throws ParseException {
-    trace_call("ImportUnit");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case NATIVE:
-      case PACKAGE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case AT:
-        PackageDeclaration();
-        break;
-      default:
-        ;
-      }
-      label_3:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPORT:
-          ;
-          break;
-        default:
-          break label_3;
-        }
-        ImportDeclaration();
-      }
-      label_4:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case FINAL:
-        case PUBLIC:
-        case STRICTFP:
-        case SYNCHRONIZED:
-          ;
-          break;
-        default:
-          break label_4;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-          break;
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-          break;
-        case SYNCHRONIZED:
-          jj_consume_token(SYNCHRONIZED);
-          break;
-        case STRICTFP:
-          jj_consume_token(STRICTFP);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CLASS:
-        jj_consume_token(CLASS);
-        break;
-      case INTERFACE:
-        jj_consume_token(INTERFACE);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("ImportUnit");
-    }
-  }
-
-  final public void ImportDeclaration() throws ParseException {
-    trace_call("ImportDeclaration");
-    try {
-      jj_consume_token(IMPORT);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      default:
-        ;
-      }
-      Name();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case DOT:
-        jj_consume_token(DOT);
-        jj_consume_token(STAR);
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("ImportDeclaration");
-    }
-  }
-
-/*
- * Modifiers. We match all modifiers in a single rule to reduce the chances of
- * syntax errors for simple modifier mistakes. It will also enable us to give
- * better error messages.
- */
-  final public int Modifiers() throws ParseException {
-    trace_call("Modifiers");
-    try {
-   int modifiers = 0;
-      label_5:
-      while (true) {
-        if (jj_2_2(2)) {
-          ;
-        } else {
-          break label_5;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PUBLIC:
-          jj_consume_token(PUBLIC);
-              modifiers |= ModifierSet.PUBLIC;
-          break;
-        case STATIC:
-          jj_consume_token(STATIC);
-              modifiers |= ModifierSet.STATIC;
-          break;
-        case PROTECTED:
-          jj_consume_token(PROTECTED);
-                 modifiers |= ModifierSet.PROTECTED;
-          break;
-        case PRIVATE:
-          jj_consume_token(PRIVATE);
-               modifiers |= ModifierSet.PRIVATE;
-          break;
-        case FINAL:
-          jj_consume_token(FINAL);
-             modifiers |= ModifierSet.FINAL;
-          break;
-        case ABSTRACT:
-          jj_consume_token(ABSTRACT);
-                modifiers |= ModifierSet.ABSTRACT;
-          break;
-        case SYNCHRONIZED:
-          jj_consume_token(SYNCHRONIZED);
-                    modifiers |= ModifierSet.SYNCHRONIZED;
-          break;
-        case NATIVE:
-          jj_consume_token(NATIVE);
-              modifiers |= ModifierSet.NATIVE;
-          break;
-        case TRANSIENT:
-          jj_consume_token(TRANSIENT);
-                 modifiers |= ModifierSet.TRANSIENT;
-          break;
-        case VOLATILE:
-          jj_consume_token(VOLATILE);
-                modifiers |= ModifierSet.VOLATILE;
-          break;
-        case STRICTFP:
-          jj_consume_token(STRICTFP);
-                modifiers |= ModifierSet.STRICTFP;
-          break;
-        case AT:
-          Annotation();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    {if (true) return modifiers;}
-    throw new Error("Missing return statement in function");
-    } finally {
-      trace_return("Modifiers");
-    }
-  }
-
-/*
- * Declaration syntax follows.
- */
-  final public void TypeDeclaration() throws ParseException {
-    trace_call("TypeDeclaration");
-    try {
-   int modifiers;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        break;
-      case ABSTRACT:
-      case CLASS:
-      case ENUM:
-      case FINAL:
-      case INTERFACE:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case AT:
-        modifiers = Modifiers();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CLASS:
-        case INTERFACE:
-          ClassOrInterfaceDeclaration(modifiers);
-          break;
-        case ENUM:
-          EnumDeclaration(modifiers);
-          break;
-        case AT:
-          AnnotationTypeDeclaration(modifiers);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("TypeDeclaration");
-    }
-  }
-
-  final public void ClassOrInterfaceDeclaration(int modifiers) throws ParseException {
-    trace_call("ClassOrInterfaceDeclaration");
-    try {
-   boolean isInterface = false;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CLASS:
-        jj_consume_token(CLASS);
-        break;
-      case INTERFACE:
-        jj_consume_token(INTERFACE);
-                            isInterface = true;
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      jj_consume_token(IDENTIFIER);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        ExtendsList(isInterface);
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPLEMENTS:
-        ImplementsList(isInterface);
-        break;
-      default:
-        ;
-      }
-      ClassOrInterfaceBody(isInterface);
-    } finally {
-      trace_return("ClassOrInterfaceDeclaration");
-    }
-  }
-
-  final public void ExtendsList(boolean isInterface) throws ParseException {
-    trace_call("ExtendsList");
-    try {
-   boolean extendsMoreThanOne = false;
-      jj_consume_token(EXTENDS);
-      ClassOrInterfaceType();
-      label_6:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_6;
-        }
-        jj_consume_token(COMMA);
-        ClassOrInterfaceType();
-                                  extendsMoreThanOne = true;
-      }
-      if (extendsMoreThanOne && !isInterface)
-         {if (true) throw new ParseException("A class cannot extend more than one other class");}
-    } finally {
-      trace_return("ExtendsList");
-    }
-  }
-
-  final public void ImplementsList(boolean isInterface) throws ParseException {
-    trace_call("ImplementsList");
-    try {
-      jj_consume_token(IMPLEMENTS);
-      ClassOrInterfaceType();
-      label_7:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_7;
-        }
-        jj_consume_token(COMMA);
-        ClassOrInterfaceType();
-      }
-      if (isInterface)
-         {if (true) throw new ParseException("An interface cannot implement other interfaces");}
-    } finally {
-      trace_return("ImplementsList");
-    }
-  }
-
-  final public void EnumDeclaration(int modifiers) throws ParseException {
-    trace_call("EnumDeclaration");
-    try {
-      jj_consume_token(ENUM);
-      jj_consume_token(IDENTIFIER);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IMPLEMENTS:
-        ImplementsList(false);
-        break;
-      default:
-        ;
-      }
-      EnumBody();
-    } finally {
-      trace_return("EnumDeclaration");
-    }
-  }
-
-  final public void EnumBody() throws ParseException {
-    trace_call("EnumBody");
-    try {
-      jj_consume_token(LBRACE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case FINAL:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-        EnumConstant();
-        label_8:
-        while (true) {
-          if (jj_2_3(2)) {
-            ;
-          } else {
-            break label_8;
-          }
-          jj_consume_token(COMMA);
-          EnumConstant();
-        }
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        jj_consume_token(COMMA);
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        label_9:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case CLASS:
-          case DOUBLE:
-          case ENUM:
-          case FINAL:
-          case FLOAT:
-          case INT:
-          case INTERFACE:
-          case LONG:
-          case NATIVE:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case SHORT:
-          case STATIC:
-          case STRICTFP:
-          case SYNCHRONIZED:
-          case TRANSIENT:
-          case VOID:
-          case VOLATILE:
-          case IDENTIFIER:
-          case LBRACE:
-          case SEMICOLON:
-          case AT:
-          case LT:
-            ;
-            break;
-          default:
-            break label_9;
-          }
-          ClassOrInterfaceBodyDeclaration(false);
-        }
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("EnumBody");
-    }
-  }
-
-  final public void EnumConstant() throws ParseException {
-    trace_call("EnumConstant");
-    try {
-      Modifiers();
-      jj_consume_token(IDENTIFIER);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        Arguments();
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACE:
-        ClassOrInterfaceBody(false);
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("EnumConstant");
-    }
-  }
-
-  final public void TypeParameters() throws ParseException {
-    trace_call("TypeParameters");
-    try {
-      jj_consume_token(LT);
-      TypeParameter();
-      label_10:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_10;
-        }
-        jj_consume_token(COMMA);
-        TypeParameter();
-      }
-      jj_consume_token(GT);
-    } finally {
-      trace_return("TypeParameters");
-    }
-  }
-
-  final public void TypeParameter() throws ParseException {
-    trace_call("TypeParameter");
-    try {
-      jj_consume_token(IDENTIFIER);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        TypeBound();
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("TypeParameter");
-    }
-  }
-
-  final public void TypeBound() throws ParseException {
-    trace_call("TypeBound");
-    try {
-      jj_consume_token(EXTENDS);
-      ClassOrInterfaceType();
-      label_11:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_AND:
-          ;
-          break;
-        default:
-          break label_11;
-        }
-        jj_consume_token(BIT_AND);
-        ClassOrInterfaceType();
-      }
-    } finally {
-      trace_return("TypeBound");
-    }
-  }
-
-  final public void ClassOrInterfaceBody(boolean isInterface) throws ParseException {
-    trace_call("ClassOrInterfaceBody");
-    try {
-      jj_consume_token(LBRACE);
-      label_12:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case LT:
-          ;
-          break;
-        default:
-          break label_12;
-        }
-        ClassOrInterfaceBodyDeclaration(isInterface);
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("ClassOrInterfaceBody");
-    }
-  }
-
-  final public void ClassOrInterfaceBodyDeclaration(boolean isInterface) throws ParseException {
-    trace_call("ClassOrInterfaceBodyDeclaration");
-    try {
-   boolean isNestedInterface = false;
-   int modifiers;
-      if (jj_2_6(2)) {
-        Initializer();
-     if (isInterface)
-        {if (true) throw new ParseException("An interface cannot have initializers");}
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOID:
-        case VOLATILE:
-        case IDENTIFIER:
-        case AT:
-        case LT:
-          modifiers = Modifiers();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case CLASS:
-          case INTERFACE:
-            ClassOrInterfaceDeclaration(modifiers);
-            break;
-          case ENUM:
-            EnumDeclaration(modifiers);
-            break;
-          default:
-            if (jj_2_4(2147483647)) {
-              ConstructorDeclaration();
-            } else if (jj_2_5(2147483647)) {
-              FieldDeclaration(modifiers);
-            } else {
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case BOOLEAN:
-              case BYTE:
-              case CHAR:
-              case DOUBLE:
-              case FLOAT:
-              case INT:
-              case LONG:
-              case SHORT:
-              case VOID:
-              case IDENTIFIER:
-              case LT:
-                MethodDeclaration(modifiers);
-                break;
-              default:
-                jj_consume_token(-1);
-                throw new ParseException();
-              }
-            }
-          }
-          break;
-        case SEMICOLON:
-          jj_consume_token(SEMICOLON);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("ClassOrInterfaceBodyDeclaration");
-    }
-  }
-
-  final public void FieldDeclaration(int modifiers) throws ParseException {
-    trace_call("FieldDeclaration");
-    try {
-      Type();
-      VariableDeclarator();
-      label_13:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_13;
-        }
-        jj_consume_token(COMMA);
-        VariableDeclarator();
-      }
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("FieldDeclaration");
-    }
-  }
-
-  final public void VariableDeclarator() throws ParseException {
-    trace_call("VariableDeclarator");
-    try {
-      VariableDeclaratorId();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        jj_consume_token(ASSIGN);
-        VariableInitializer();
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("VariableDeclarator");
-    }
-  }
-
-  final public void VariableDeclaratorId() throws ParseException {
-    trace_call("VariableDeclaratorId");
-    try {
-      jj_consume_token(IDENTIFIER);
-      label_14:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ;
-          break;
-        default:
-          break label_14;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-    } finally {
-      trace_return("VariableDeclaratorId");
-    }
-  }
-
-  final public void VariableInitializer() throws ParseException {
-    trace_call("VariableInitializer");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACE:
-        ArrayInitializer();
-        break;
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        Expression();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("VariableInitializer");
-    }
-  }
-
-  final public void ArrayInitializer() throws ParseException {
-    trace_call("ArrayInitializer");
-    try {
-      jj_consume_token(LBRACE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        VariableInitializer();
-        label_15:
-        while (true) {
-          if (jj_2_7(2)) {
-            ;
-          } else {
-            break label_15;
-          }
-          jj_consume_token(COMMA);
-          VariableInitializer();
-        }
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        jj_consume_token(COMMA);
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("ArrayInitializer");
-    }
-  }
-
-  final public void MethodDeclaration(int modifiers) throws ParseException {
-    trace_call("MethodDeclaration");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        ;
-      }
-      ResultType();
-      MethodDeclarator();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case THROWS:
-        jj_consume_token(THROWS);
-        NameList();
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LBRACE:
-        Block();
-        break;
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("MethodDeclaration");
-    }
-  }
-
-  final public void MethodDeclarator() throws ParseException {
-    trace_call("MethodDeclarator");
-    try {
-      jj_consume_token(IDENTIFIER);
-      FormalParameters();
-      label_16:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          ;
-          break;
-        default:
-          break label_16;
-        }
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      }
-    } finally {
-      trace_return("MethodDeclarator");
-    }
-  }
-
-  final public void FormalParameters() throws ParseException {
-    trace_call("FormalParameters");
-    try {
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-        FormalParameter();
-        label_17:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case COMMA:
-            ;
-            break;
-          default:
-            break label_17;
-          }
-          jj_consume_token(COMMA);
-          FormalParameter();
-        }
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("FormalParameters");
-    }
-  }
-
-  final public void FormalParameter() throws ParseException {
-    trace_call("FormalParameter");
-    try {
-      Modifiers();
-      Type();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ELLIPSIS:
-        jj_consume_token(ELLIPSIS);
-        break;
-      default:
-        ;
-      }
-      VariableDeclaratorId();
-    } finally {
-      trace_return("FormalParameter");
-    }
-  }
-
-  final public void ConstructorDeclaration() throws ParseException {
-    trace_call("ConstructorDeclaration");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeParameters();
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(IDENTIFIER);
-      FormalParameters();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case THROWS:
-        jj_consume_token(THROWS);
-        NameList();
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(LBRACE);
-      if (jj_2_8(2147483647)) {
-        ExplicitConstructorInvocation();
-      } else {
-        ;
-      }
-      label_18:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case RETURN:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRANSIENT:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case VOLATILE:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          ;
-          break;
-        default:
-          break label_18;
-        }
-        BlockStatement();
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("ConstructorDeclaration");
-    }
-  }
-
-  final public void ExplicitConstructorInvocation() throws ParseException {
-    trace_call("ExplicitConstructorInvocation");
-    try {
-      label_19:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IDENTIFIER:
-          ;
-          break;
-        default:
-          break label_19;
-        }
-        jj_consume_token(IDENTIFIER);
-        jj_consume_token(DOT);
-      }
-      if (jj_2_9(2)) {
-        jj_consume_token(THIS);
-        jj_consume_token(DOT);
-      } else {
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        TypeArguments();
-        break;
-      default:
-        ;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case THIS:
-        jj_consume_token(THIS);
-        break;
-      case SUPER:
-        jj_consume_token(SUPER);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      Arguments();
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("ExplicitConstructorInvocation");
-    }
-  }
-
-  final public void Initializer() throws ParseException {
-    trace_call("Initializer");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STATIC:
-        jj_consume_token(STATIC);
-        break;
-      default:
-        ;
-      }
-      Block();
-    } finally {
-      trace_return("Initializer");
-    }
-  }
-
-/*
- * Type, name and expression syntax follows.
- */
-  final public void Type() throws ParseException {
-    trace_call("Type");
-    try {
-      if (jj_2_10(2)) {
-        ReferenceType();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case SHORT:
-          PrimitiveType();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("Type");
-    }
-  }
-
-  final public void ReferenceType() throws ParseException {
-    trace_call("ReferenceType");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-        PrimitiveType();
-        label_20:
-        while (true) {
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-          if (jj_2_11(2)) {
-            ;
-          } else {
-            break label_20;
-          }
-        }
-        break;
-      case IDENTIFIER:
-        ClassOrInterfaceType();
-        label_21:
-        while (true) {
-          if (jj_2_12(2)) {
-            ;
-          } else {
-            break label_21;
-          }
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("ReferenceType");
-    }
-  }
-
-  final public void ClassOrInterfaceType() throws ParseException {
-    trace_call("ClassOrInterfaceType");
-    try {
-      jj_consume_token(IDENTIFIER);
-      if (jj_2_13(2)) {
-        TypeArguments();
-      } else {
-        ;
-      }
-      label_22:
-      while (true) {
-        if (jj_2_14(2)) {
-          ;
-        } else {
-          break label_22;
-        }
-        jj_consume_token(DOT);
-        jj_consume_token(IDENTIFIER);
-        if (jj_2_15(2)) {
-          TypeArguments();
-        } else {
-          ;
-        }
-      }
-    } finally {
-      trace_return("ClassOrInterfaceType");
-    }
-  }
-
-  final public void TypeArguments() throws ParseException {
-    trace_call("TypeArguments");
-    try {
-      jj_consume_token(LT);
-      TypeArgument();
-      label_23:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_23;
-        }
-        jj_consume_token(COMMA);
-        TypeArgument();
-      }
-      jj_consume_token(GT);
-    } finally {
-      trace_return("TypeArguments");
-    }
-  }
-
-  final public void TypeArgument() throws ParseException {
-    trace_call("TypeArgument");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-      case IDENTIFIER:
-        ReferenceType();
-        break;
-      case HOOK:
-        jj_consume_token(HOOK);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EXTENDS:
-        case SUPER:
-          WildcardBounds();
-          break;
-        default:
-          ;
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("TypeArgument");
-    }
-  }
-
-  final public void WildcardBounds() throws ParseException {
-    trace_call("WildcardBounds");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        jj_consume_token(EXTENDS);
-        ReferenceType();
-        break;
-      case SUPER:
-        jj_consume_token(SUPER);
-        ReferenceType();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("WildcardBounds");
-    }
-  }
-
-  final public void PrimitiveType() throws ParseException {
-    trace_call("PrimitiveType");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-        jj_consume_token(BOOLEAN);
-        break;
-      case CHAR:
-        jj_consume_token(CHAR);
-        break;
-      case BYTE:
-        jj_consume_token(BYTE);
-        break;
-      case SHORT:
-        jj_consume_token(SHORT);
-        break;
-      case INT:
-        jj_consume_token(INT);
-        break;
-      case LONG:
-        jj_consume_token(LONG);
-        break;
-      case FLOAT:
-        jj_consume_token(FLOAT);
-        break;
-      case DOUBLE:
-        jj_consume_token(DOUBLE);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("PrimitiveType");
-    }
-  }
-
-  final public void ResultType() throws ParseException {
-    trace_call("ResultType");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case VOID:
-        jj_consume_token(VOID);
-        break;
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-      case IDENTIFIER:
-        Type();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("ResultType");
-    }
-  }
-
-  final public void Name() throws ParseException {
-    trace_call("Name");
-    try {
-      jj_consume_token(IDENTIFIER);
-      label_24:
-      while (true) {
-        if (jj_2_16(2)) {
-          ;
-        } else {
-          break label_24;
-        }
-        jj_consume_token(DOT);
-        jj_consume_token(IDENTIFIER);
-      }
-    } finally {
-      trace_return("Name");
-    }
-  }
-
-  final public void NameList() throws ParseException {
-    trace_call("NameList");
-    try {
-      Name();
-      label_25:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_25;
-        }
-        jj_consume_token(COMMA);
-        Name();
-      }
-    } finally {
-      trace_return("NameList");
-    }
-  }
-
-/*
- * Expression syntax follows.
- */
-  final public void Expression() throws ParseException {
-    trace_call("Expression");
-    try {
-      ConditionalExpression();
-      if (jj_2_17(2)) {
-        AssignmentOperator();
-        Expression();
-      } else {
-        ;
-      }
-    } finally {
-      trace_return("Expression");
-    }
-  }
-
-  final public void AssignmentOperator() throws ParseException {
-    trace_call("AssignmentOperator");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        jj_consume_token(ASSIGN);
-        break;
-      case STARASSIGN:
-        jj_consume_token(STARASSIGN);
-        break;
-      case SLASHASSIGN:
-        jj_consume_token(SLASHASSIGN);
-        break;
-      case REMASSIGN:
-        jj_consume_token(REMASSIGN);
-        break;
-      case PLUSASSIGN:
-        jj_consume_token(PLUSASSIGN);
-        break;
-      case MINUSASSIGN:
-        jj_consume_token(MINUSASSIGN);
-        break;
-      case LSHIFTASSIGN:
-        jj_consume_token(LSHIFTASSIGN);
-        break;
-      case RSIGNEDSHIFTASSIGN:
-        jj_consume_token(RSIGNEDSHIFTASSIGN);
-        break;
-      case RUNSIGNEDSHIFTASSIGN:
-        jj_consume_token(RUNSIGNEDSHIFTASSIGN);
-        break;
-      case ANDASSIGN:
-        jj_consume_token(ANDASSIGN);
-        break;
-      case XORASSIGN:
-        jj_consume_token(XORASSIGN);
-        break;
-      case ORASSIGN:
-        jj_consume_token(ORASSIGN);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("AssignmentOperator");
-    }
-  }
-
-  final public void ConditionalExpression() throws ParseException {
-    trace_call("ConditionalExpression");
-    try {
-      ConditionalOrExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case HOOK:
-        jj_consume_token(HOOK);
-        Expression();
-        jj_consume_token(COLON);
-        Expression();
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("ConditionalExpression");
-    }
-  }
-
-  final public void ConditionalOrExpression() throws ParseException {
-    trace_call("ConditionalOrExpression");
-    try {
-      ConditionalAndExpression();
-      label_26:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_OR:
-          ;
-          break;
-        default:
-          break label_26;
-        }
-        jj_consume_token(SC_OR);
-        ConditionalAndExpression();
-      }
-    } finally {
-      trace_return("ConditionalOrExpression");
-    }
-  }
-
-  final public void ConditionalAndExpression() throws ParseException {
-    trace_call("ConditionalAndExpression");
-    try {
-      InclusiveOrExpression();
-      label_27:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_AND:
-          ;
-          break;
-        default:
-          break label_27;
-        }
-        jj_consume_token(SC_AND);
-        InclusiveOrExpression();
-      }
-    } finally {
-      trace_return("ConditionalAndExpression");
-    }
-  }
-
-  final public void InclusiveOrExpression() throws ParseException {
-    trace_call("InclusiveOrExpression");
-    try {
-      ExclusiveOrExpression();
-      label_28:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_OR:
-          ;
-          break;
-        default:
-          break label_28;
-        }
-        jj_consume_token(BIT_OR);
-        ExclusiveOrExpression();
-      }
-    } finally {
-      trace_return("InclusiveOrExpression");
-    }
-  }
-
-  final public void ExclusiveOrExpression() throws ParseException {
-    trace_call("ExclusiveOrExpression");
-    try {
-      AndExpression();
-      label_29:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case XOR:
-          ;
-          break;
-        default:
-          break label_29;
-        }
-        jj_consume_token(XOR);
-        AndExpression();
-      }
-    } finally {
-      trace_return("ExclusiveOrExpression");
-    }
-  }
-
-  final public void AndExpression() throws ParseException {
-    trace_call("AndExpression");
-    try {
-      EqualityExpression();
-      label_30:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_AND:
-          ;
-          break;
-        default:
-          break label_30;
-        }
-        jj_consume_token(BIT_AND);
-        EqualityExpression();
-      }
-    } finally {
-      trace_return("AndExpression");
-    }
-  }
-
-  final public void EqualityExpression() throws ParseException {
-    trace_call("EqualityExpression");
-    try {
-      InstanceOfExpression();
-      label_31:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EQ:
-        case NE:
-          ;
-          break;
-        default:
-          break label_31;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EQ:
-          jj_consume_token(EQ);
-          break;
-        case NE:
-          jj_consume_token(NE);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        InstanceOfExpression();
-      }
-    } finally {
-      trace_return("EqualityExpression");
-    }
-  }
-
-  final public void InstanceOfExpression() throws ParseException {
-    trace_call("InstanceOfExpression");
-    try {
-      RelationalExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INSTANCEOF:
-        jj_consume_token(INSTANCEOF);
-        Type();
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("InstanceOfExpression");
-    }
-  }
-
-  final public void RelationalExpression() throws ParseException {
-    trace_call("RelationalExpression");
-    try {
-      ShiftExpression();
-      label_32:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-        case LE:
-        case GE:
-        case GT:
-          ;
-          break;
-        default:
-          break label_32;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LT:
-          jj_consume_token(LT);
-          break;
-        case GT:
-          jj_consume_token(GT);
-          break;
-        case LE:
-          jj_consume_token(LE);
-          break;
-        case GE:
-          jj_consume_token(GE);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        ShiftExpression();
-      }
-    } finally {
-      trace_return("RelationalExpression");
-    }
-  }
-
-  final public void ShiftExpression() throws ParseException {
-    trace_call("ShiftExpression");
-    try {
-      AdditiveExpression();
-      label_33:
-      while (true) {
-        if (jj_2_18(1)) {
-          ;
-        } else {
-          break label_33;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LSHIFT:
-          jj_consume_token(LSHIFT);
-          break;
-        default:
-          if (jj_2_19(1)) {
-            RSIGNEDSHIFT();
-          } else if (jj_2_20(1)) {
-            RUNSIGNEDSHIFT();
-          } else {
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-        AdditiveExpression();
-      }
-    } finally {
-      trace_return("ShiftExpression");
-    }
-  }
-
-  final public void AdditiveExpression() throws ParseException {
-    trace_call("AdditiveExpression");
-    try {
-      MultiplicativeExpression();
-      label_34:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-        case MINUS:
-          ;
-          break;
-        default:
-          break label_34;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-          jj_consume_token(PLUS);
-          break;
-        case MINUS:
-          jj_consume_token(MINUS);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        MultiplicativeExpression();
-      }
-    } finally {
-      trace_return("AdditiveExpression");
-    }
-  }
-
-  final public void MultiplicativeExpression() throws ParseException {
-    trace_call("MultiplicativeExpression");
-    try {
-      UnaryExpression();
-      label_35:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STAR:
-        case SLASH:
-        case REM:
-          ;
-          break;
-        default:
-          break label_35;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STAR:
-          jj_consume_token(STAR);
-          break;
-        case SLASH:
-          jj_consume_token(SLASH);
-          break;
-        case REM:
-          jj_consume_token(REM);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        UnaryExpression();
-      }
-    } finally {
-      trace_return("MultiplicativeExpression");
-    }
-  }
-
-  final public void UnaryExpression() throws ParseException {
-    trace_call("UnaryExpression");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-      case MINUS:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-          jj_consume_token(PLUS);
-          break;
-        case MINUS:
-          jj_consume_token(MINUS);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        UnaryExpression();
-        break;
-      case INCR:
-        PreIncrementExpression();
-        break;
-      case DECR:
-        PreDecrementExpression();
-        break;
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-        UnaryExpressionNotPlusMinus();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("UnaryExpression");
-    }
-  }
-
-  final public void PreIncrementExpression() throws ParseException {
-    trace_call("PreIncrementExpression");
-    try {
-      jj_consume_token(INCR);
-      PrimaryExpression();
-    } finally {
-      trace_return("PreIncrementExpression");
-    }
-  }
-
-  final public void PreDecrementExpression() throws ParseException {
-    trace_call("PreDecrementExpression");
-    try {
-      jj_consume_token(DECR);
-      PrimaryExpression();
-    } finally {
-      trace_return("PreDecrementExpression");
-    }
-  }
-
-  final public void UnaryExpressionNotPlusMinus() throws ParseException {
-    trace_call("UnaryExpressionNotPlusMinus");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BANG:
-      case TILDE:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case TILDE:
-          jj_consume_token(TILDE);
-          break;
-        case BANG:
-          jj_consume_token(BANG);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        UnaryExpression();
-        break;
-      default:
-        if (jj_2_21(2147483647)) {
-          CastExpression();
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FALSE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NEW:
-          case NULL:
-          case SHORT:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case VOID:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-            PostfixExpression();
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    } finally {
-      trace_return("UnaryExpressionNotPlusMinus");
-    }
-  }
-
-// This production is to determine lookahead only.  The LOOKAHEAD specifications
-// below are not used, but they are there just to indicate that we know about
-// this.
-  final public void CastLookahead() throws ParseException {
-    trace_call("CastLookahead");
-    try {
-      if (jj_2_22(2)) {
-        jj_consume_token(LPAREN);
-        PrimitiveType();
-      } else if (jj_2_23(2147483647)) {
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(LBRACKET);
-        jj_consume_token(RBRACKET);
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          Type();
-          jj_consume_token(RPAREN);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case TILDE:
-            jj_consume_token(TILDE);
-            break;
-          case BANG:
-            jj_consume_token(BANG);
-            break;
-          case LPAREN:
-            jj_consume_token(LPAREN);
-            break;
-          case IDENTIFIER:
-            jj_consume_token(IDENTIFIER);
-            break;
-          case THIS:
-            jj_consume_token(THIS);
-            break;
-          case SUPER:
-            jj_consume_token(SUPER);
-            break;
-          case NEW:
-            jj_consume_token(NEW);
-            break;
-          case FALSE:
-          case NULL:
-          case TRUE:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-            Literal();
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("CastLookahead");
-    }
-  }
-
-  final public void PostfixExpression() throws ParseException {
-    trace_call("PostfixExpression");
-    try {
-      PrimaryExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INCR:
-      case DECR:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case INCR:
-          jj_consume_token(INCR);
-          break;
-        case DECR:
-          jj_consume_token(DECR);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("PostfixExpression");
-    }
-  }
-
-  final public void CastExpression() throws ParseException {
-    trace_call("CastExpression");
-    try {
-      if (jj_2_24(2147483647)) {
-        jj_consume_token(LPAREN);
-        Type();
-        jj_consume_token(RPAREN);
-        UnaryExpression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          Type();
-          jj_consume_token(RPAREN);
-          UnaryExpressionNotPlusMinus();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("CastExpression");
-    }
-  }
-
-  final public void PrimaryExpression() throws ParseException {
-    trace_call("PrimaryExpression");
-    try {
-      PrimaryPrefix();
-      label_36:
-      while (true) {
-        if (jj_2_25(2)) {
-          ;
-        } else {
-          break label_36;
-        }
-        PrimarySuffix();
-      }
-    } finally {
-      trace_return("PrimaryExpression");
-    }
-  }
-
-  final public void MemberSelector() throws ParseException {
-    trace_call("MemberSelector");
-    try {
-      jj_consume_token(DOT);
-      TypeArguments();
-      jj_consume_token(IDENTIFIER);
-    } finally {
-      trace_return("MemberSelector");
-    }
-  }
-
-  final public void PrimaryPrefix() throws ParseException {
-    trace_call("PrimaryPrefix");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case FALSE:
-      case NULL:
-      case TRUE:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-        Literal();
-        break;
-      default:
-        if (jj_2_26(2147483647)) {
-          label_37:
-          while (true) {
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case IDENTIFIER:
-              ;
-              break;
-            default:
-              break label_37;
-            }
-            jj_consume_token(IDENTIFIER);
-            jj_consume_token(DOT);
-          }
-          jj_consume_token(THIS);
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case SUPER:
-            jj_consume_token(SUPER);
-            jj_consume_token(DOT);
-            jj_consume_token(IDENTIFIER);
-            break;
-          case LPAREN:
-            jj_consume_token(LPAREN);
-            Expression();
-            jj_consume_token(RPAREN);
-            break;
-          case NEW:
-            AllocationExpression();
-            break;
-          default:
-            if (jj_2_27(2147483647)) {
-              ResultType();
-              jj_consume_token(DOT);
-              jj_consume_token(CLASS);
-            } else {
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case IDENTIFIER:
-                Name();
-                break;
-              default:
-                jj_consume_token(-1);
-                throw new ParseException();
-              }
-            }
-          }
-        }
-      }
-    } finally {
-      trace_return("PrimaryPrefix");
-    }
-  }
-
-  final public void PrimarySuffix() throws ParseException {
-    trace_call("PrimarySuffix");
-    try {
-      if (jj_2_28(2147483647)) {
-        jj_consume_token(DOT);
-        jj_consume_token(SUPER);
-      } else if (jj_2_29(2147483647)) {
-        jj_consume_token(DOT);
-        jj_consume_token(THIS);
-      } else if (jj_2_30(2)) {
-        jj_consume_token(DOT);
-        AllocationExpression();
-      } else if (jj_2_31(3)) {
-        MemberSelector();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          jj_consume_token(LBRACKET);
-          Expression();
-          jj_consume_token(RBRACKET);
-          break;
-        case DOT:
-          jj_consume_token(DOT);
-          jj_consume_token(IDENTIFIER);
-          break;
-        case LPAREN:
-          Arguments();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("PrimarySuffix");
-    }
-  }
-
-  final public void Literal() throws ParseException {
-    trace_call("Literal");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INTEGER_LITERAL:
-        jj_consume_token(INTEGER_LITERAL);
-        break;
-      case FLOATING_POINT_LITERAL:
-        jj_consume_token(FLOATING_POINT_LITERAL);
-        break;
-      case CHARACTER_LITERAL:
-        jj_consume_token(CHARACTER_LITERAL);
-        break;
-      case STRING_LITERAL:
-        jj_consume_token(STRING_LITERAL);
-        break;
-      case FALSE:
-      case TRUE:
-        BooleanLiteral();
-        break;
-      case NULL:
-        NullLiteral();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("Literal");
-    }
-  }
-
-  final public void BooleanLiteral() throws ParseException {
-    trace_call("BooleanLiteral");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case TRUE:
-        jj_consume_token(TRUE);
-        break;
-      case FALSE:
-        jj_consume_token(FALSE);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("BooleanLiteral");
-    }
-  }
-
-  final public void NullLiteral() throws ParseException {
-    trace_call("NullLiteral");
-    try {
-      jj_consume_token(NULL);
-    } finally {
-      trace_return("NullLiteral");
-    }
-  }
-
-  final public void Arguments() throws ParseException {
-    trace_call("Arguments");
-    try {
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        ArgumentList();
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("Arguments");
-    }
-  }
-
-  final public void ArgumentList() throws ParseException {
-    trace_call("ArgumentList");
-    try {
-      Expression();
-      label_38:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_38;
-        }
-        jj_consume_token(COMMA);
-        Expression();
-      }
-    } finally {
-      trace_return("ArgumentList");
-    }
-  }
-
-  final public void AllocationExpression() throws ParseException {
-    trace_call("AllocationExpression");
-    try {
-      if (jj_2_32(2)) {
-        jj_consume_token(NEW);
-        PrimitiveType();
-        ArrayDimsAndInits();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case NEW:
-          jj_consume_token(NEW);
-          ClassOrInterfaceType();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LT:
-            TypeArguments();
-            break;
-          default:
-            ;
-          }
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LBRACKET:
-            ArrayDimsAndInits();
-            break;
-          case LPAREN:
-            Arguments();
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case LBRACE:
-              ClassOrInterfaceBody(false);
-              break;
-            default:
-              ;
-            }
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("AllocationExpression");
-    }
-  }
-
-/*
- * The third LOOKAHEAD specification below is to parse to PrimarySuffix
- * if there is an expression between the "[...]".
- */
-  final public void ArrayDimsAndInits() throws ParseException {
-    trace_call("ArrayDimsAndInits");
-    try {
-      if (jj_2_35(2)) {
-        label_39:
-        while (true) {
-          jj_consume_token(LBRACKET);
-          Expression();
-          jj_consume_token(RBRACKET);
-          if (jj_2_33(2)) {
-            ;
-          } else {
-            break label_39;
-          }
-        }
-        label_40:
-        while (true) {
-          if (jj_2_34(2)) {
-            ;
-          } else {
-            break label_40;
-          }
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-        }
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LBRACKET:
-          label_41:
-          while (true) {
-            jj_consume_token(LBRACKET);
-            jj_consume_token(RBRACKET);
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case LBRACKET:
-              ;
-              break;
-            default:
-              break label_41;
-            }
-          }
-          ArrayInitializer();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("ArrayDimsAndInits");
-    }
-  }
-
-/*
- * Statement syntax follows.
- */
-  final public void Statement() throws ParseException {
-    trace_call("Statement");
-    try {
-      if (jj_2_36(2)) {
-        LabeledStatement();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-          AssertStatement();
-          break;
-        case LBRACE:
-          Block();
-          break;
-        case SEMICOLON:
-          EmptyStatement();
-          break;
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case INCR:
-        case DECR:
-          StatementExpression();
-          jj_consume_token(SEMICOLON);
-          break;
-        case SWITCH:
-          SwitchStatement();
-          break;
-        case IF:
-          IfStatement();
-          break;
-        case WHILE:
-          WhileStatement();
-          break;
-        case DO:
-          DoStatement();
-          break;
-        case FOR:
-          ForStatement();
-          break;
-        case BREAK:
-          BreakStatement();
-          break;
-        case CONTINUE:
-          ContinueStatement();
-          break;
-        case RETURN:
-          ReturnStatement();
-          break;
-        case THROW:
-          ThrowStatement();
-          break;
-        case SYNCHRONIZED:
-          SynchronizedStatement();
-          break;
-        case TRY:
-          TryStatement();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("Statement");
-    }
-  }
-
-  final public void AssertStatement() throws ParseException {
-    trace_call("AssertStatement");
-    try {
-      jj_consume_token(ASSERT);
-      Expression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COLON:
-        jj_consume_token(COLON);
-        Expression();
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("AssertStatement");
-    }
-  }
-
-  final public void LabeledStatement() throws ParseException {
-    trace_call("LabeledStatement");
-    try {
-      jj_consume_token(IDENTIFIER);
-      jj_consume_token(COLON);
-      Statement();
-    } finally {
-      trace_return("LabeledStatement");
-    }
-  }
-
-  final public void Block() throws ParseException {
-    trace_call("Block");
-    try {
-      jj_consume_token(LBRACE);
-      label_42:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case RETURN:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRANSIENT:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case VOLATILE:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          ;
-          break;
-        default:
-          break label_42;
-        }
-        BlockStatement();
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("Block");
-    }
-  }
-
-  final public void BlockStatement() throws ParseException {
-    trace_call("BlockStatement");
-    try {
-      if (jj_2_37(2147483647)) {
-        LocalVariableDeclaration();
-        jj_consume_token(SEMICOLON);
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSERT:
-        case BOOLEAN:
-        case BREAK:
-        case BYTE:
-        case CHAR:
-        case CONTINUE:
-        case DO:
-        case DOUBLE:
-        case FALSE:
-        case FLOAT:
-        case FOR:
-        case IF:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case RETURN:
-        case SHORT:
-        case SUPER:
-        case SWITCH:
-        case SYNCHRONIZED:
-        case THIS:
-        case THROW:
-        case TRUE:
-        case TRY:
-        case VOID:
-        case WHILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
-        case INCR:
-        case DECR:
-          Statement();
-          break;
-        case CLASS:
-        case INTERFACE:
-          ClassOrInterfaceDeclaration(0);
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("BlockStatement");
-    }
-  }
-
-  final public void LocalVariableDeclaration() throws ParseException {
-    trace_call("LocalVariableDeclaration");
-    try {
-      Modifiers();
-      Type();
-      VariableDeclarator();
-      label_43:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_43;
-        }
-        jj_consume_token(COMMA);
-        VariableDeclarator();
-      }
-    } finally {
-      trace_return("LocalVariableDeclaration");
-    }
-  }
-
-  final public void EmptyStatement() throws ParseException {
-    trace_call("EmptyStatement");
-    try {
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("EmptyStatement");
-    }
-  }
-
-  final public void StatementExpression() throws ParseException {
-    trace_call("StatementExpression");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INCR:
-        PreIncrementExpression();
-        break;
-      case DECR:
-        PreDecrementExpression();
-        break;
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-        PrimaryExpression();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ASSIGN:
-        case INCR:
-        case DECR:
-        case PLUSASSIGN:
-        case MINUSASSIGN:
-        case STARASSIGN:
-        case SLASHASSIGN:
-        case ANDASSIGN:
-        case ORASSIGN:
-        case XORASSIGN:
-        case REMASSIGN:
-        case LSHIFTASSIGN:
-        case RSIGNEDSHIFTASSIGN:
-        case RUNSIGNEDSHIFTASSIGN:
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case INCR:
-            jj_consume_token(INCR);
-            break;
-          case DECR:
-            jj_consume_token(DECR);
-            break;
-          case ASSIGN:
-          case PLUSASSIGN:
-          case MINUSASSIGN:
-          case STARASSIGN:
-          case SLASHASSIGN:
-          case ANDASSIGN:
-          case ORASSIGN:
-          case XORASSIGN:
-          case REMASSIGN:
-          case LSHIFTASSIGN:
-          case RSIGNEDSHIFTASSIGN:
-          case RUNSIGNEDSHIFTASSIGN:
-            AssignmentOperator();
-            Expression();
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-          break;
-        default:
-          ;
-        }
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("StatementExpression");
-    }
-  }
-
-  final public void SwitchStatement() throws ParseException {
-    trace_call("SwitchStatement");
-    try {
-      jj_consume_token(SWITCH);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      jj_consume_token(LBRACE);
-      label_44:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CASE:
-        case _DEFAULT:
-          ;
-          break;
-        default:
-          break label_44;
-        }
-        SwitchLabel();
-        label_45:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case ASSERT:
-          case BOOLEAN:
-          case BREAK:
-          case BYTE:
-          case CHAR:
-          case CLASS:
-          case CONTINUE:
-          case DO:
-          case DOUBLE:
-          case FALSE:
-          case FINAL:
-          case FLOAT:
-          case FOR:
-          case IF:
-          case INT:
-          case INTERFACE:
-          case LONG:
-          case NATIVE:
-          case NEW:
-          case NULL:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case RETURN:
-          case SHORT:
-          case STATIC:
-          case STRICTFP:
-          case SUPER:
-          case SWITCH:
-          case SYNCHRONIZED:
-          case THIS:
-          case THROW:
-          case TRANSIENT:
-          case TRUE:
-          case TRY:
-          case VOID:
-          case VOLATILE:
-          case WHILE:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case LBRACE:
-          case SEMICOLON:
-          case AT:
-          case INCR:
-          case DECR:
-            ;
-            break;
-          default:
-            break label_45;
-          }
-          BlockStatement();
-        }
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("SwitchStatement");
-    }
-  }
-
-  final public void SwitchLabel() throws ParseException {
-    trace_call("SwitchLabel");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CASE:
-        jj_consume_token(CASE);
-        Expression();
-        jj_consume_token(COLON);
-        break;
-      case _DEFAULT:
-        jj_consume_token(_DEFAULT);
-        jj_consume_token(COLON);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("SwitchLabel");
-    }
-  }
-
-  final public void IfStatement() throws ParseException {
-    trace_call("IfStatement");
-    try {
-      jj_consume_token(IF);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      Statement();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ELSE:
-        jj_consume_token(ELSE);
-        Statement();
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("IfStatement");
-    }
-  }
-
-  final public void WhileStatement() throws ParseException {
-    trace_call("WhileStatement");
-    try {
-      jj_consume_token(WHILE);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      Statement();
-    } finally {
-      trace_return("WhileStatement");
-    }
-  }
-
-  final public void DoStatement() throws ParseException {
-    trace_call("DoStatement");
-    try {
-      jj_consume_token(DO);
-      Statement();
-      jj_consume_token(WHILE);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("DoStatement");
-    }
-  }
-
-  final public void ForStatement() throws ParseException {
-    trace_call("ForStatement");
-    try {
-      jj_consume_token(FOR);
-      jj_consume_token(LPAREN);
-      if (jj_2_38(2147483647)) {
-        Modifiers();
-        Type();
-        jj_consume_token(IDENTIFIER);
-        jj_consume_token(COLON);
-        Expression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FALSE:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NATIVE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SUPER:
-        case SYNCHRONIZED:
-        case THIS:
-        case TRANSIENT:
-        case TRUE:
-        case VOID:
-        case VOLATILE:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case SEMICOLON:
-        case AT:
-        case INCR:
-        case DECR:
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ABSTRACT:
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FALSE:
-          case FINAL:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NATIVE:
-          case NEW:
-          case NULL:
-          case PRIVATE:
-          case PROTECTED:
-          case PUBLIC:
-          case SHORT:
-          case STATIC:
-          case STRICTFP:
-          case SUPER:
-          case SYNCHRONIZED:
-          case THIS:
-          case TRANSIENT:
-          case TRUE:
-          case VOID:
-          case VOLATILE:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case AT:
-          case INCR:
-          case DECR:
-            ForInit();
-            break;
-          default:
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FALSE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NEW:
-          case NULL:
-          case SHORT:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case VOID:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case BANG:
-          case TILDE:
-          case INCR:
-          case DECR:
-          case PLUS:
-          case MINUS:
-            Expression();
-            break;
-          default:
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FALSE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case NEW:
-          case NULL:
-          case SHORT:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case VOID:
-          case INTEGER_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case CHARACTER_LITERAL:
-          case STRING_LITERAL:
-          case IDENTIFIER:
-          case LPAREN:
-          case INCR:
-          case DECR:
-            ForUpdate();
-            break;
-          default:
-            ;
-          }
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-      jj_consume_token(RPAREN);
-      Statement();
-    } finally {
-      trace_return("ForStatement");
-    }
-  }
-
-  final public void ForInit() throws ParseException {
-    trace_call("ForInit");
-    try {
-      if (jj_2_39(2147483647)) {
-        LocalVariableDeclaration();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case DOUBLE:
-        case FALSE:
-        case FLOAT:
-        case INT:
-        case LONG:
-        case NEW:
-        case NULL:
-        case SHORT:
-        case SUPER:
-        case THIS:
-        case TRUE:
-        case VOID:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case CHARACTER_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case INCR:
-        case DECR:
-          StatementExpressionList();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("ForInit");
-    }
-  }
-
-  final public void StatementExpressionList() throws ParseException {
-    trace_call("StatementExpressionList");
-    try {
-      StatementExpression();
-      label_46:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_46;
-        }
-        jj_consume_token(COMMA);
-        StatementExpression();
-      }
-    } finally {
-      trace_return("StatementExpressionList");
-    }
-  }
-
-  final public void ForUpdate() throws ParseException {
-    trace_call("ForUpdate");
-    try {
-      StatementExpressionList();
-    } finally {
-      trace_return("ForUpdate");
-    }
-  }
-
-  final public void BreakStatement() throws ParseException {
-    trace_call("BreakStatement");
-    try {
-      jj_consume_token(BREAK);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IDENTIFIER:
-        jj_consume_token(IDENTIFIER);
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("BreakStatement");
-    }
-  }
-
-  final public void ContinueStatement() throws ParseException {
-    trace_call("ContinueStatement");
-    try {
-      jj_consume_token(CONTINUE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IDENTIFIER:
-        jj_consume_token(IDENTIFIER);
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("ContinueStatement");
-    }
-  }
-
-  final public void ReturnStatement() throws ParseException {
-    trace_call("ReturnStatement");
-    try {
-      jj_consume_token(RETURN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        Expression();
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("ReturnStatement");
-    }
-  }
-
-  final public void ThrowStatement() throws ParseException {
-    trace_call("ThrowStatement");
-    try {
-      jj_consume_token(THROW);
-      Expression();
-      jj_consume_token(SEMICOLON);
-    } finally {
-      trace_return("ThrowStatement");
-    }
-  }
-
-  final public void SynchronizedStatement() throws ParseException {
-    trace_call("SynchronizedStatement");
-    try {
-      jj_consume_token(SYNCHRONIZED);
-      jj_consume_token(LPAREN);
-      Expression();
-      jj_consume_token(RPAREN);
-      Block();
-    } finally {
-      trace_return("SynchronizedStatement");
-    }
-  }
-
-  final public void TryStatement() throws ParseException {
-    trace_call("TryStatement");
-    try {
-      jj_consume_token(TRY);
-      Block();
-      label_47:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CATCH:
-          ;
-          break;
-        default:
-          break label_47;
-        }
-        jj_consume_token(CATCH);
-        jj_consume_token(LPAREN);
-        FormalParameter();
-        jj_consume_token(RPAREN);
-        Block();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case FINALLY:
-        jj_consume_token(FINALLY);
-        Block();
-        break;
-      default:
-        ;
-      }
-    } finally {
-      trace_return("TryStatement");
-    }
-  }
-
-/* We use productions to match >>>, >> and > so that we can keep the
- * type declaration syntax with generics clean
- */
-  final public void RUNSIGNEDSHIFT() throws ParseException {
-    trace_call("RUNSIGNEDSHIFT");
-    try {
-      if (getToken(1).kind == GT &&
-                      ((Token.GTToken)getToken(1)).realKind == RUNSIGNEDSHIFT) {
-
-      } else {
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      jj_consume_token(GT);
-      jj_consume_token(GT);
-      jj_consume_token(GT);
-    } finally {
-      trace_return("RUNSIGNEDSHIFT");
-    }
-  }
-
-  final public void RSIGNEDSHIFT() throws ParseException {
-    trace_call("RSIGNEDSHIFT");
-    try {
-      if (getToken(1).kind == GT &&
-                      ((Token.GTToken)getToken(1)).realKind == RSIGNEDSHIFT) {
-
-      } else {
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      jj_consume_token(GT);
-      jj_consume_token(GT);
-    } finally {
-      trace_return("RSIGNEDSHIFT");
-    }
-  }
-
-/* Annotation syntax follows. */
-  final public void Annotation() throws ParseException {
-    trace_call("Annotation");
-    try {
-      if (jj_2_40(2147483647)) {
-        NormalAnnotation();
-      } else if (jj_2_41(2147483647)) {
-        SingleMemberAnnotation();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          MarkerAnnotation();
-          break;
-        default:
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } finally {
-      trace_return("Annotation");
-    }
-  }
-
-  final public void NormalAnnotation() throws ParseException {
-    trace_call("NormalAnnotation");
-    try {
-      jj_consume_token(AT);
-      Name();
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IDENTIFIER:
-        MemberValuePairs();
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("NormalAnnotation");
-    }
-  }
-
-  final public void MarkerAnnotation() throws ParseException {
-    trace_call("MarkerAnnotation");
-    try {
-      jj_consume_token(AT);
-      Name();
-    } finally {
-      trace_return("MarkerAnnotation");
-    }
-  }
-
-  final public void SingleMemberAnnotation() throws ParseException {
-    trace_call("SingleMemberAnnotation");
-    try {
-      jj_consume_token(AT);
-      Name();
-      jj_consume_token(LPAREN);
-      MemberValue();
-      jj_consume_token(RPAREN);
-    } finally {
-      trace_return("SingleMemberAnnotation");
-    }
-  }
-
-  final public void MemberValuePairs() throws ParseException {
-    trace_call("MemberValuePairs");
-    try {
-      MemberValuePair();
-      label_48:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          break label_48;
-        }
-        jj_consume_token(COMMA);
-        MemberValuePair();
-      }
-    } finally {
-      trace_return("MemberValuePairs");
-    }
-  }
-
-  final public void MemberValuePair() throws ParseException {
-    trace_call("MemberValuePair");
-    try {
-      jj_consume_token(IDENTIFIER);
-      jj_consume_token(ASSIGN);
-      MemberValue();
-    } finally {
-      trace_return("MemberValuePair");
-    }
-  }
-
-  final public void MemberValue() throws ParseException {
-    trace_call("MemberValue");
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AT:
-        Annotation();
-        break;
-      case LBRACE:
-        MemberValueArrayInitializer();
-        break;
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FALSE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case NEW:
-      case NULL:
-      case SHORT:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case VOID:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case CHARACTER_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        ConditionalExpression();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("MemberValue");
-    }
-  }
-
-  final public void MemberValueArrayInitializer() throws ParseException {
-    trace_call("MemberValueArrayInitializer");
-    try {
-      jj_consume_token(LBRACE);
-      MemberValue();
-      label_49:
-      while (true) {
-        if (jj_2_42(2)) {
-          ;
-        } else {
-          break label_49;
-        }
-        jj_consume_token(COMMA);
-        MemberValue();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COMMA:
-        jj_consume_token(COMMA);
-        break;
-      default:
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("MemberValueArrayInitializer");
-    }
-  }
-
-/* Annotation Types. */
-  final public void AnnotationTypeDeclaration(int modifiers) throws ParseException {
-    trace_call("AnnotationTypeDeclaration");
-    try {
-      jj_consume_token(AT);
-      jj_consume_token(INTERFACE);
-      jj_consume_token(IDENTIFIER);
-      AnnotationTypeBody();
-    } finally {
-      trace_return("AnnotationTypeDeclaration");
-    }
-  }
-
-  final public void AnnotationTypeBody() throws ParseException {
-    trace_call("AnnotationTypeBody");
-    try {
-      jj_consume_token(LBRACE);
-      label_50:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ABSTRACT:
-        case BOOLEAN:
-        case BYTE:
-        case CHAR:
-        case CLASS:
-        case DOUBLE:
-        case ENUM:
-        case FINAL:
-        case FLOAT:
-        case INT:
-        case INTERFACE:
-        case LONG:
-        case NATIVE:
-        case PRIVATE:
-        case PROTECTED:
-        case PUBLIC:
-        case SHORT:
-        case STATIC:
-        case STRICTFP:
-        case SYNCHRONIZED:
-        case TRANSIENT:
-        case VOLATILE:
-        case IDENTIFIER:
-        case SEMICOLON:
-        case AT:
-          ;
-          break;
-        default:
-          break label_50;
-        }
-        AnnotationTypeMemberDeclaration();
-      }
-      jj_consume_token(RBRACE);
-    } finally {
-      trace_return("AnnotationTypeBody");
-    }
-  }
-
-  final public void AnnotationTypeMemberDeclaration() throws ParseException {
-    trace_call("AnnotationTypeMemberDeclaration");
-    try {
-   int modifiers;
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ABSTRACT:
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case CLASS:
-      case DOUBLE:
-      case ENUM:
-      case FINAL:
-      case FLOAT:
-      case INT:
-      case INTERFACE:
-      case LONG:
-      case NATIVE:
-      case PRIVATE:
-      case PROTECTED:
-      case PUBLIC:
-      case SHORT:
-      case STATIC:
-      case STRICTFP:
-      case SYNCHRONIZED:
-      case TRANSIENT:
-      case VOLATILE:
-      case IDENTIFIER:
-      case AT:
-        modifiers = Modifiers();
-        if (jj_2_43(2147483647)) {
-          Type();
-          jj_consume_token(IDENTIFIER);
-          jj_consume_token(LPAREN);
-          jj_consume_token(RPAREN);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case _DEFAULT:
-            DefaultValue();
-            break;
-          default:
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case CLASS:
-          case INTERFACE:
-            ClassOrInterfaceDeclaration(modifiers);
-            break;
-          case ENUM:
-            EnumDeclaration(modifiers);
-            break;
-          case AT:
-            AnnotationTypeDeclaration(modifiers);
-            break;
-          case BOOLEAN:
-          case BYTE:
-          case CHAR:
-          case DOUBLE:
-          case FLOAT:
-          case INT:
-          case LONG:
-          case SHORT:
-          case IDENTIFIER:
-            FieldDeclaration(modifiers);
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-        break;
-      case SEMICOLON:
-        jj_consume_token(SEMICOLON);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-      trace_return("AnnotationTypeMemberDeclaration");
-    }
-  }
-
-  final public void DefaultValue() throws ParseException {
-    trace_call("DefaultValue");
-    try {
-      jj_consume_token(_DEFAULT);
-      MemberValue();
-    } finally {
-      trace_return("DefaultValue");
-    }
-  }
-
-  private boolean jj_2_1(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_2(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_2(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_3(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_3(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_4(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_4(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_5(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_5(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_6(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_6(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_7(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_7(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_8(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_8(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_9(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_9(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_10(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_10(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_11(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_11(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_12(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_12(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_13(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_13(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_14(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_14(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_15(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_15(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_16(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_16(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_17(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_17(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_18(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_18(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_19(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_19(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_20(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_20(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_21(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_21(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_22(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_22(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_23(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_23(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_24(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_24(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_25(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_25(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_26(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_26(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_27(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_27(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_28(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_28(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_29(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_29(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_30(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_30(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_31(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_31(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_32(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_32(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_33(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_33(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_34(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_34(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_35(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_35(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_36(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_36(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_37(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_37(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_38(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_38(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_39(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_39(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_40(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_40(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_41(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_41(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_42(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_42(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_2_43(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_43(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  private boolean jj_3R_124() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_13()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_14()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_99() {
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_12()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_98() {
-    if (jj_3R_78()) return true;
-    Token xsp;
-    if (jj_3_11()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_11()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_71() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_98()) {
-    jj_scanpos = xsp;
-    if (jj_3R_99()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_9() {
-    if (jj_scan_token(THIS)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_263() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_277()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_91() {
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
-  private boolean jj_3_10() {
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_66() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_10()) {
-    jj_scanpos = xsp;
-    if (jj_3R_91()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_68() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(51)) jj_scanpos = xsp;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3_8() {
-    if (jj_3R_70()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_96() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_280() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_95() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_285() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_284()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_70() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_95()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3_9()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_96()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) return true;
-    }
-    if (jj_3R_97()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_265() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_264() {
-    if (jj_3R_70()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_261() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_253() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_261()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_3R_262()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_263()) jj_scanpos = xsp;
-    if (jj_scan_token(LBRACE)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_264()) jj_scanpos = xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_265()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_270() {
-    if (jj_scan_token(THROWS)) return true;
-    if (jj_3R_277()) return true;
-    return false;
-  }
-
-  private boolean jj_3_7() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_69()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_284() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(123)) jj_scanpos = xsp;
-    if (jj_3R_278()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_276() {
-    if (jj_3R_284()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_285()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_262() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_276()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_269() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_3R_262()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_280()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_43() {
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_271() {
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_268() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_255() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_268()) jj_scanpos = xsp;
-    if (jj_3R_81()) return true;
-    if (jj_3R_269()) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_270()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_271()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_243() {
-    if (jj_3R_69()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_7()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_279() {
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_69()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_267() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_266()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_287() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_122() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_243()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3_42() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_88()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_67() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_94() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_93() {
-    if (jj_3R_122()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_69() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_93()) {
-    jj_scanpos = xsp;
-    if (jj_3R_94()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_278() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_287()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_266() {
-    if (jj_3R_278()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_279()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_129() {
-    if (jj_scan_token(LBRACE)) return true;
-    if (jj_3R_88()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_42()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_156() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_155()) return true;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_67()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(89)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_65() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_115() {
-    if (jj_3R_101()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_254() {
-    if (jj_3R_66()) return true;
-    if (jj_3R_266()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_267()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3_4() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_65()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_114() {
-    if (jj_3R_129()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_113() {
-    if (jj_3R_89()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_88() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_113()) {
-    jj_scanpos = xsp;
-    if (jj_3R_114()) {
-    jj_scanpos = xsp;
-    if (jj_3R_115()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_251() {
-    if (jj_3R_255()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_155() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_88()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_148() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_124()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_250() {
-    if (jj_3R_254()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_249() {
-    if (jj_3R_253()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_248() {
-    if (jj_3R_252()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_147() {
-    if (jj_3R_155()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_156()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_247() {
-    if (jj_3R_151()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_139() {
-    if (jj_3R_147()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_87() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_289() {
-    if (jj_3R_242()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_131() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_88()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_246() {
-    if (jj_3R_85()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_247()) {
-    jj_scanpos = xsp;
-    if (jj_3R_248()) {
-    jj_scanpos = xsp;
-    if (jj_3R_249()) {
-    jj_scanpos = xsp;
-    if (jj_3R_250()) {
-    jj_scanpos = xsp;
-    if (jj_3R_251()) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_132() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    return false;
-  }
-
-  private boolean jj_3_6() {
-    if (jj_3R_68()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_245() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_6()) {
-    jj_scanpos = xsp;
-    if (jj_3R_246()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_41() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_244() {
-    if (jj_3R_245()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_130() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_139()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_120() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
-  private boolean jj_3_40() {
-    if (jj_scan_token(AT)) return true;
-    if (jj_3R_86()) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_87()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(80)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_133() {
-    if (jj_3R_140()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_288() {
-    if (jj_3R_97()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_242() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_244()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_118() {
-    if (jj_3R_132()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_117() {
-    if (jj_3R_131()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_140() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_148()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_116() {
-    if (jj_3R_130()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_102() {
-    return false;
-  }
-
-  private boolean jj_3R_89() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_116()) {
-    jj_scanpos = xsp;
-    if (jj_3R_117()) {
-    jj_scanpos = xsp;
-    if (jj_3R_118()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_119() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_133()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_3() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_64()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_103() {
-    return false;
-  }
-
-  private boolean jj_3R_90() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_119()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_120()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_75() {
-    jj_lookingAhead = true;
-    jj_semLA = getToken(1).kind == GT &&
-                ((Token.GTToken)getToken(1)).realKind == RSIGNEDSHIFT;
-    jj_lookingAhead = false;
-    if (!jj_semLA || jj_3R_102()) return true;
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_283() {
-    if (jj_3R_245()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_64() {
-    if (jj_3R_85()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_288()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_289()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_76() {
-    jj_lookingAhead = true;
-    jj_semLA = getToken(1).kind == GT &&
-                ((Token.GTToken)getToken(1)).realKind == RUNSIGNEDSHIFT;
-    jj_lookingAhead = false;
-    if (!jj_semLA || jj_3R_103()) return true;
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_275() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_283()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_274() {
-    if (jj_3R_64()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_3()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_260() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_274()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(86)) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_275()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_298() {
-    if (jj_scan_token(FINALLY)) return true;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_297() {
-    if (jj_scan_token(CATCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_284()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_259() {
-    if (jj_3R_273()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_187() {
-    if (jj_scan_token(TRY)) return true;
-    if (jj_3R_92()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_297()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_298()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_252() {
-    if (jj_scan_token(ENUM)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_259()) jj_scanpos = xsp;
-    if (jj_3R_260()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_282() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_124()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_186() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_296() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_273() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_282()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_185() {
-    if (jj_scan_token(THROW)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_304() {
-    if (jj_3R_309()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_281() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_124()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_313() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_176()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_184() {
-    if (jj_scan_token(RETURN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_296()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_272() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_281()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_171() {
-    if (jj_scan_token(INTERFACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_183() {
-    if (jj_scan_token(CONTINUE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(76)) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_258() {
-    if (jj_3R_273()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_257() {
-    if (jj_3R_272()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_256() {
-    if (jj_3R_90()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_182() {
-    if (jj_scan_token(BREAK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(76)) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_151() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(20)) {
-    jj_scanpos = xsp;
-    if (jj_3R_171()) return true;
-    }
-    if (jj_scan_token(IDENTIFIER)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_256()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_257()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_258()) jj_scanpos = xsp;
-    if (jj_3R_242()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_309() {
-    if (jj_3R_312()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_303() {
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3_39() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_312() {
-    if (jj_3R_176()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_313()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_293() {
-    if (jj_scan_token(ELSE)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_311() {
-    if (jj_3R_312()) return true;
-    return false;
-  }
-
-  private boolean jj_3_38() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_310() {
-    if (jj_3R_149()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_308() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_310()) {
-    jj_scanpos = xsp;
-    if (jj_3R_311()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_302() {
-    if (jj_3R_308()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_295() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_302()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_303()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_304()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_294() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_181() {
-    if (jj_scan_token(FOR)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_294()) {
-    jj_scanpos = xsp;
-    if (jj_3R_295()) return true;
-    }
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_63() {
-    if (jj_3R_89()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_62() {
-    if (jj_scan_token(STRICTFP)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_61() {
-    if (jj_scan_token(VOLATILE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_180() {
-    if (jj_scan_token(DO)) return true;
-    if (jj_3R_150()) return true;
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_60() {
-    if (jj_scan_token(TRANSIENT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_59() {
-    if (jj_scan_token(NATIVE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_58() {
-    if (jj_scan_token(SYNCHRONIZED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_179() {
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_57() {
-    if (jj_scan_token(ABSTRACT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_56() {
-    if (jj_scan_token(FINAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_301() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_55() {
-    if (jj_scan_token(PRIVATE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_178() {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_150()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_293()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_54() {
-    if (jj_scan_token(PROTECTED)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_53() {
-    if (jj_scan_token(STATIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_52() {
-    if (jj_scan_token(PUBLIC)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_52()) {
-    jj_scanpos = xsp;
-    if (jj_3R_53()) {
-    jj_scanpos = xsp;
-    if (jj_3R_54()) {
-    jj_scanpos = xsp;
-    if (jj_3R_55()) {
-    jj_scanpos = xsp;
-    if (jj_3R_56()) {
-    jj_scanpos = xsp;
-    if (jj_3R_57()) {
-    jj_scanpos = xsp;
-    if (jj_3R_58()) {
-    jj_scanpos = xsp;
-    if (jj_3R_59()) {
-    jj_scanpos = xsp;
-    if (jj_3R_60()) {
-    jj_scanpos = xsp;
-    if (jj_3R_61()) {
-    jj_scanpos = xsp;
-    if (jj_3R_62()) {
-    jj_scanpos = xsp;
-    if (jj_3R_63()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_307() {
-    if (jj_scan_token(_DEFAULT)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_85() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_2()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_306() {
-    if (jj_scan_token(CASE)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_300() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_306()) {
-    jj_scanpos = xsp;
-    if (jj_3R_307()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_290() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_266()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_292() {
-    if (jj_3R_300()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_301()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_177() {
-    if (jj_scan_token(SWITCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_292()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_305() {
-    if (jj_3R_73()) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_299() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(101)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(102)) {
-    jj_scanpos = xsp;
-    if (jj_3R_305()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_194() {
-    if (jj_3R_199()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_299()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_51() {
-    if (jj_3R_89()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_193() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3_1() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_51()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(PACKAGE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_176() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_192()) {
-    jj_scanpos = xsp;
-    if (jj_3R_193()) {
-    jj_scanpos = xsp;
-    if (jj_3R_194()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_192() {
-    if (jj_3R_197()) return true;
-    return false;
-  }
-
-  private boolean jj_3_37() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_149() {
-    if (jj_3R_85()) return true;
-    if (jj_3R_66()) return true;
-    if (jj_3R_266()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_290()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_291() {
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_143() {
-    if (jj_3R_151()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_142() {
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_141() {
-    if (jj_3R_149()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_134() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_141()) {
-    jj_scanpos = xsp;
-    if (jj_3R_142()) {
-    jj_scanpos = xsp;
-    if (jj_3R_143()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_121() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_92() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_121()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_84() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_150()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_175() {
-    if (jj_scan_token(ASSERT)) return true;
-    if (jj_3R_74()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_291()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_170() {
-    if (jj_3R_187()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_169() {
-    if (jj_3R_186()) return true;
-    return false;
-  }
-
-  private boolean jj_3_34() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_168() {
-    if (jj_3R_185()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_167() {
-    if (jj_3R_184()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_166() {
-    if (jj_3R_183()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_165() {
-    if (jj_3R_182()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_164() {
-    if (jj_3R_181()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_163() {
-    if (jj_3R_180()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_162() {
-    if (jj_3R_179()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_161() {
-    if (jj_3R_178()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_160() {
-    if (jj_3R_177()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_159() {
-    if (jj_3R_176()) return true;
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_158() {
-    if (jj_3R_92()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_157() {
-    if (jj_3R_175()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_236() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3_36() {
-    if (jj_3R_84()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_150() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_36()) {
-    jj_scanpos = xsp;
-    if (jj_3R_157()) {
-    jj_scanpos = xsp;
-    if (jj_3R_158()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(85)) {
-    jj_scanpos = xsp;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
-    if (jj_3R_160()) {
-    jj_scanpos = xsp;
-    if (jj_3R_161()) {
-    jj_scanpos = xsp;
-    if (jj_3R_162()) {
-    jj_scanpos = xsp;
-    if (jj_3R_163()) {
-    jj_scanpos = xsp;
-    if (jj_3R_164()) {
-    jj_scanpos = xsp;
-    if (jj_3R_165()) {
-    jj_scanpos = xsp;
-    if (jj_3R_166()) {
-    jj_scanpos = xsp;
-    if (jj_3R_167()) {
-    jj_scanpos = xsp;
-    if (jj_3R_168()) {
-    jj_scanpos = xsp;
-    if (jj_3R_169()) {
-    jj_scanpos = xsp;
-    if (jj_3R_170()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_240() {
-    if (jj_3R_242()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_241() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_33() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_239() {
-    Token xsp;
-    if (jj_3R_241()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_241()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_3R_122()) return true;
-    return false;
-  }
-
-  private boolean jj_3_35() {
-    Token xsp;
-    if (jj_3_33()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_33()) { jj_scanpos = xsp; break; }
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_34()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_235() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_35()) {
-    jj_scanpos = xsp;
-    if (jj_3R_239()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_238() {
-    if (jj_3R_97()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_240()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_144() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_237() {
-    if (jj_3R_235()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_112() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_124()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_236()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_237()) {
-    jj_scanpos = xsp;
-    if (jj_3R_238()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_82() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_32()) {
-    jj_scanpos = xsp;
-    if (jj_3R_112()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_32() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_78()) return true;
-    if (jj_3R_235()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_136() {
-    if (jj_3R_74()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_144()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_123() {
-    if (jj_3R_136()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_97() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_123()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_154() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(60)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(29)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_146() {
-    if (jj_3R_154()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_128() {
-    if (jj_3R_138()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_138() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(65)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(69)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(74)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(75)) {
-    jj_scanpos = xsp;
-    if (jj_3R_146()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(44)) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_110() {
-    if (jj_3R_97()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_109() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_29() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_108() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_28() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3_31() {
-    if (jj_3R_83()) return true;
-    return false;
-  }
-
-  private boolean jj_3_30() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_82()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_107() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3_27() {
-    if (jj_3R_81()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_106() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(SUPER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_79() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_106()) {
-    jj_scanpos = xsp;
-    if (jj_3R_107()) {
-    jj_scanpos = xsp;
-    if (jj_3_30()) {
-    jj_scanpos = xsp;
-    if (jj_3_31()) {
-    jj_scanpos = xsp;
-    if (jj_3R_108()) {
-    jj_scanpos = xsp;
-    if (jj_3R_109()) {
-    jj_scanpos = xsp;
-    if (jj_3R_110()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_80() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_211() {
-    if (jj_3R_86()) return true;
-    return false;
-  }
-
-  private boolean jj_3_26() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_80()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_210() {
-    if (jj_3R_81()) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(CLASS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_209() {
-    if (jj_3R_82()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_208() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3_25() {
-    if (jj_3R_79()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_207() {
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_214() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_206() {
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_214()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(THIS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_202() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_205()) {
-    jj_scanpos = xsp;
-    if (jj_3R_206()) {
-    jj_scanpos = xsp;
-    if (jj_3R_207()) {
-    jj_scanpos = xsp;
-    if (jj_3R_208()) {
-    jj_scanpos = xsp;
-    if (jj_3R_209()) {
-    jj_scanpos = xsp;
-    if (jj_3R_210()) {
-    jj_scanpos = xsp;
-    if (jj_3R_211()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_205() {
-    if (jj_3R_138()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_234() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(101)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(102)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_83() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_72()) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3_24() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_199() {
-    if (jj_3R_202()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_25()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_233() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_230() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_232()) {
-    jj_scanpos = xsp;
-    if (jj_3R_233()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_232() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3_23() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_231() {
-    if (jj_3R_199()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_234()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_105() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(92)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(91)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(79)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(76)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(56)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(53)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(43)) {
-    jj_scanpos = xsp;
-    if (jj_3R_128()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_104() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_66()) return true;
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3_22() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_78()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_77() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_22()) {
-    jj_scanpos = xsp;
-    if (jj_3R_104()) {
-    jj_scanpos = xsp;
-    if (jj_3R_105()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_21() {
-    if (jj_3R_77()) return true;
-    return false;
-  }
-
-  private boolean jj_3_20() {
-    if (jj_3R_76()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_228() {
-    if (jj_3R_231()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_227() {
-    if (jj_3R_230()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_224() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_226()) {
-    jj_scanpos = xsp;
-    if (jj_3R_227()) {
-    jj_scanpos = xsp;
-    if (jj_3R_228()) return true;
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_226() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(92)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(91)) return true;
-    }
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_198() {
-    if (jj_scan_token(DECR)) return true;
-    if (jj_3R_199()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_225() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(103)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(104)) return true;
-    }
-    if (jj_3R_216()) return true;
-    return false;
-  }
-
-  private boolean jj_3_19() {
-    if (jj_3R_75()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_229() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(105)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(106)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(110)) return true;
-    }
-    }
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_197() {
-    if (jj_scan_token(INCR)) return true;
-    if (jj_3R_199()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_223() {
-    if (jj_3R_224()) return true;
-    return false;
-  }
-
-  private boolean jj_3_18() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(111)) {
-    jj_scanpos = xsp;
-    if (jj_3_19()) {
-    jj_scanpos = xsp;
-    if (jj_3_20()) return true;
-    }
-    }
-    if (jj_3R_213()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_222() {
-    if (jj_3R_198()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_221() {
-    if (jj_3R_197()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_218() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_220()) {
-    jj_scanpos = xsp;
-    if (jj_3R_221()) {
-    jj_scanpos = xsp;
-    if (jj_3R_222()) {
-    jj_scanpos = xsp;
-    if (jj_3R_223()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_220() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(103)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(104)) return true;
-    }
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_219() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(90)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(126)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(96)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(97)) return true;
-    }
-    }
-    }
-    if (jj_3R_204()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_217() {
-    if (jj_scan_token(INSTANCEOF)) return true;
-    if (jj_3R_66()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_216() {
-    if (jj_3R_218()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_229()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_215() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(95)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(98)) return true;
-    }
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_213() {
-    if (jj_3R_216()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_225()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_204() {
-    if (jj_3R_213()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_18()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_212() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_201() {
-    if (jj_3R_204()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_219()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_200() {
-    if (jj_scan_token(BIT_OR)) return true;
-    if (jj_3R_153()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_196() {
-    if (jj_3R_201()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_217()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_203() {
-    if (jj_scan_token(XOR)) return true;
-    if (jj_3R_174()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_195() {
-    if (jj_scan_token(SC_AND)) return true;
-    if (jj_3R_145()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_191() {
-    if (jj_3R_196()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_215()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_190() {
-    if (jj_scan_token(SC_OR)) return true;
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_174() {
-    if (jj_3R_191()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_212()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_173() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_74()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_153() {
-    if (jj_3R_174()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_203()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_145() {
-    if (jj_3R_153()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_200()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_137() {
-    if (jj_3R_145()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_195()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_127() {
-    if (jj_3R_137()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_190()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_101() {
-    if (jj_3R_127()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_173()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_73() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(89)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(114)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(115)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(119)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(112)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(113)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(120)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(121)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(122)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(116)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(118)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(117)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_17() {
-    if (jj_3R_73()) return true;
-    if (jj_3R_74()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_74() {
-    if (jj_3R_101()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_17()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3R_286() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_86()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_277() {
-    if (jj_3R_86()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_286()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_16() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_86() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_16()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_111() {
-    if (jj_3R_66()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_81() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(62)) {
-    jj_scanpos = xsp;
-    if (jj_3R_111()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_15() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_78() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(14)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(19)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(16)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(50)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(39)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(41)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(32)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(25)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_135() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_100()) return true;
-    return false;
-  }
-
-  private boolean jj_3_12() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_189() {
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_152() {
-    if (jj_3R_172()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_172() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_188()) {
-    jj_scanpos = xsp;
-    if (jj_3R_189()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_188() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_126() {
-    if (jj_scan_token(HOOK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_152()) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_13() {
-    if (jj_3R_72()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_125() {
-    if (jj_3R_71()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_100() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_125()) {
-    jj_scanpos = xsp;
-    if (jj_3R_126()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_11() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_72() {
-    if (jj_scan_token(LT)) return true;
-    if (jj_3R_100()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_135()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(GT)) return true;
-    return false;
-  }
-
-  private boolean jj_3_14() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_15()) jj_scanpos = xsp;
-    return false;
-  }
-
-  /** Generated Token Manager. */
-  public JavaParser15DebugTokenManager token_source;
-  JavaCharStream jj_input_stream;
-  /** Current token. */
-  public Token token;
-  /** Next token. */
-  public Token jj_nt;
-  private int jj_ntk;
-  private Token jj_scanpos, jj_lastpos;
-  private int jj_la;
-  /** Whether we are looking ahead. */
-  private boolean jj_lookingAhead = false;
-  private boolean jj_semLA;
-
-  /** Constructor with InputStream. */
-  public JavaParser15Debug(java.io.InputStream stream) {
-     this(stream, null);
-  }
-  /** Constructor with InputStream and supplied encoding */
-  public JavaParser15Debug(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source = new JavaParser15DebugTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream) {
-     ReInit(stream, null);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Constructor. */
-  public JavaParser15Debug(java.io.Reader stream) {
-    jj_input_stream = new JavaCharStream(stream, 1, 1);
-    token_source = new JavaParser15DebugTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Constructor with generated Token Manager. */
-  public JavaParser15Debug(JavaParser15DebugTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(JavaParser15DebugTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      trace_token(token, "");
-      return token;
-    }
-    token = oldToken;
-    throw generateParseException();
-  }
-
-  static private final class LookaheadSuccess extends java.lang.Error { }
-  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
-  private boolean jj_scan_token(int kind) {
-    if (jj_scanpos == jj_lastpos) {
-      jj_la--;
-      if (jj_scanpos.next == null) {
-        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
-      } else {
-        jj_lastpos = jj_scanpos = jj_scanpos.next;
-      }
-    } else {
-      jj_scanpos = jj_scanpos.next;
-    }
-    if (jj_scanpos.kind != kind) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
-    return false;
-  }
-
-
-/** Get the next Token. */
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-      trace_token(token, " (in getNextToken)");
-    return token;
-  }
-
-/** Get the specific Token. */
-  final public Token getToken(int index) {
-    Token t = jj_lookingAhead ? jj_scanpos : token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
-    }
-    return t;
-  }
-
-  private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
-
-  /** Generate ParseException. */
-  public ParseException generateParseException() {
-    Token errortok = token.next;
-    int line = errortok.beginLine, column = errortok.beginColumn;
-    String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;
-    return new ParseException("Parse error at line " + line + ", column " + column + ".  Encountered: " + mess);
-  }
-
-  private int trace_indent = 0;
-  private boolean trace_enabled = true;
-
-/** Enable tracing. */
-  final public void enable_tracing() {
-    trace_enabled = true;
-  }
-
-/** Disable tracing. */
-  final public void disable_tracing() {
-    trace_enabled = false;
-  }
-
-  private void trace_call(String s) {
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.println("Call:   " + s);
-    }
-    trace_indent = trace_indent + 2;
-  }
-
-  private void trace_return(String s) {
-    trace_indent = trace_indent - 2;
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.println("Return: " + s);
-    }
-  }
-
-  private void trace_token(Token t, String where) {
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.print("Consumed token: <" + tokenImage[t.kind]);
-      if (t.kind != 0 && !tokenImage[t.kind].equals("\"" + t.image + "\"")) {
-        System.out.print(": \"" + t.image + "\"");
-      }
-      System.out.println(" at line " + t.beginLine + " column " + t.beginColumn + ">" + where);
-    }
-  }
-
-  private void trace_scan(Token t1, int t2) {
-    if (trace_enabled) {
-      for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
-      System.out.print("Visited token: <" + tokenImage[t1.kind]);
-      if (t1.kind != 0 && !tokenImage[t1.kind].equals("\"" + t1.image + "\"")) {
-        System.out.print(": \"" + t1.image + "\"");
-      }
-      System.out.println(" at line " + t1.beginLine + " column " + t1.beginColumn + ">; Expected token: <" + tokenImage[t2] + ">");
-    }
-  }
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15DebugConstants.java b/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15DebugConstants.java
deleted file mode 100644
index aaee32b..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15DebugConstants.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParser15DebugConstants.java */
-package net.sourceforge.cobertura.javancss.parser.java15.debug;
-
-
-/**
- * Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
- */
-public interface JavaParser15DebugConstants {
-
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int SINGLE_LINE_COMMENT = 8;
-  /** RegularExpression Id. */
-  int FORMAL_COMMENT = 9;
-  /** RegularExpression Id. */
-  int MULTI_LINE_COMMENT = 10;
-  /** RegularExpression Id. */
-  int ABSTRACT = 12;
-  /** RegularExpression Id. */
-  int ASSERT = 13;
-  /** RegularExpression Id. */
-  int BOOLEAN = 14;
-  /** RegularExpression Id. */
-  int BREAK = 15;
-  /** RegularExpression Id. */
-  int BYTE = 16;
-  /** RegularExpression Id. */
-  int CASE = 17;
-  /** RegularExpression Id. */
-  int CATCH = 18;
-  /** RegularExpression Id. */
-  int CHAR = 19;
-  /** RegularExpression Id. */
-  int CLASS = 20;
-  /** RegularExpression Id. */
-  int CONST = 21;
-  /** RegularExpression Id. */
-  int CONTINUE = 22;
-  /** RegularExpression Id. */
-  int _DEFAULT = 23;
-  /** RegularExpression Id. */
-  int DO = 24;
-  /** RegularExpression Id. */
-  int DOUBLE = 25;
-  /** RegularExpression Id. */
-  int ELSE = 26;
-  /** RegularExpression Id. */
-  int ENUM = 27;
-  /** RegularExpression Id. */
-  int EXTENDS = 28;
-  /** RegularExpression Id. */
-  int FALSE = 29;
-  /** RegularExpression Id. */
-  int FINAL = 30;
-  /** RegularExpression Id. */
-  int FINALLY = 31;
-  /** RegularExpression Id. */
-  int FLOAT = 32;
-  /** RegularExpression Id. */
-  int FOR = 33;
-  /** RegularExpression Id. */
-  int GOTO = 34;
-  /** RegularExpression Id. */
-  int IF = 35;
-  /** RegularExpression Id. */
-  int IMPLEMENTS = 36;
-  /** RegularExpression Id. */
-  int IMPORT = 37;
-  /** RegularExpression Id. */
-  int INSTANCEOF = 38;
-  /** RegularExpression Id. */
-  int INT = 39;
-  /** RegularExpression Id. */
-  int INTERFACE = 40;
-  /** RegularExpression Id. */
-  int LONG = 41;
-  /** RegularExpression Id. */
-  int NATIVE = 42;
-  /** RegularExpression Id. */
-  int NEW = 43;
-  /** RegularExpression Id. */
-  int NULL = 44;
-  /** RegularExpression Id. */
-  int PACKAGE = 45;
-  /** RegularExpression Id. */
-  int PRIVATE = 46;
-  /** RegularExpression Id. */
-  int PROTECTED = 47;
-  /** RegularExpression Id. */
-  int PUBLIC = 48;
-  /** RegularExpression Id. */
-  int RETURN = 49;
-  /** RegularExpression Id. */
-  int SHORT = 50;
-  /** RegularExpression Id. */
-  int STATIC = 51;
-  /** RegularExpression Id. */
-  int STRICTFP = 52;
-  /** RegularExpression Id. */
-  int SUPER = 53;
-  /** RegularExpression Id. */
-  int SWITCH = 54;
-  /** RegularExpression Id. */
-  int SYNCHRONIZED = 55;
-  /** RegularExpression Id. */
-  int THIS = 56;
-  /** RegularExpression Id. */
-  int THROW = 57;
-  /** RegularExpression Id. */
-  int THROWS = 58;
-  /** RegularExpression Id. */
-  int TRANSIENT = 59;
-  /** RegularExpression Id. */
-  int TRUE = 60;
-  /** RegularExpression Id. */
-  int TRY = 61;
-  /** RegularExpression Id. */
-  int VOID = 62;
-  /** RegularExpression Id. */
-  int VOLATILE = 63;
-  /** RegularExpression Id. */
-  int WHILE = 64;
-  /** RegularExpression Id. */
-  int INTEGER_LITERAL = 65;
-  /** RegularExpression Id. */
-  int DECIMAL_LITERAL = 66;
-  /** RegularExpression Id. */
-  int HEX_LITERAL = 67;
-  /** RegularExpression Id. */
-  int OCTAL_LITERAL = 68;
-  /** RegularExpression Id. */
-  int FLOATING_POINT_LITERAL = 69;
-  /** RegularExpression Id. */
-  int DECIMAL_FLOATING_POINT_LITERAL = 70;
-  /** RegularExpression Id. */
-  int DECIMAL_EXPONENT = 71;
-  /** RegularExpression Id. */
-  int HEXADECIMAL_FLOATING_POINT_LITERAL = 72;
-  /** RegularExpression Id. */
-  int HEXADECIMAL_EXPONENT = 73;
-  /** RegularExpression Id. */
-  int CHARACTER_LITERAL = 74;
-  /** RegularExpression Id. */
-  int STRING_LITERAL = 75;
-  /** RegularExpression Id. */
-  int IDENTIFIER = 76;
-  /** RegularExpression Id. */
-  int LETTER = 77;
-  /** RegularExpression Id. */
-  int PART_LETTER = 78;
-  /** RegularExpression Id. */
-  int LPAREN = 79;
-  /** RegularExpression Id. */
-  int RPAREN = 80;
-  /** RegularExpression Id. */
-  int LBRACE = 81;
-  /** RegularExpression Id. */
-  int RBRACE = 82;
-  /** RegularExpression Id. */
-  int LBRACKET = 83;
-  /** RegularExpression Id. */
-  int RBRACKET = 84;
-  /** RegularExpression Id. */
-  int SEMICOLON = 85;
-  /** RegularExpression Id. */
-  int COMMA = 86;
-  /** RegularExpression Id. */
-  int DOT = 87;
-  /** RegularExpression Id. */
-  int AT = 88;
-  /** RegularExpression Id. */
-  int ASSIGN = 89;
-  /** RegularExpression Id. */
-  int LT = 90;
-  /** RegularExpression Id. */
-  int BANG = 91;
-  /** RegularExpression Id. */
-  int TILDE = 92;
-  /** RegularExpression Id. */
-  int HOOK = 93;
-  /** RegularExpression Id. */
-  int COLON = 94;
-  /** RegularExpression Id. */
-  int EQ = 95;
-  /** RegularExpression Id. */
-  int LE = 96;
-  /** RegularExpression Id. */
-  int GE = 97;
-  /** RegularExpression Id. */
-  int NE = 98;
-  /** RegularExpression Id. */
-  int SC_OR = 99;
-  /** RegularExpression Id. */
-  int SC_AND = 100;
-  /** RegularExpression Id. */
-  int INCR = 101;
-  /** RegularExpression Id. */
-  int DECR = 102;
-  /** RegularExpression Id. */
-  int PLUS = 103;
-  /** RegularExpression Id. */
-  int MINUS = 104;
-  /** RegularExpression Id. */
-  int STAR = 105;
-  /** RegularExpression Id. */
-  int SLASH = 106;
-  /** RegularExpression Id. */
-  int BIT_AND = 107;
-  /** RegularExpression Id. */
-  int BIT_OR = 108;
-  /** RegularExpression Id. */
-  int XOR = 109;
-  /** RegularExpression Id. */
-  int REM = 110;
-  /** RegularExpression Id. */
-  int LSHIFT = 111;
-  /** RegularExpression Id. */
-  int PLUSASSIGN = 112;
-  /** RegularExpression Id. */
-  int MINUSASSIGN = 113;
-  /** RegularExpression Id. */
-  int STARASSIGN = 114;
-  /** RegularExpression Id. */
-  int SLASHASSIGN = 115;
-  /** RegularExpression Id. */
-  int ANDASSIGN = 116;
-  /** RegularExpression Id. */
-  int ORASSIGN = 117;
-  /** RegularExpression Id. */
-  int XORASSIGN = 118;
-  /** RegularExpression Id. */
-  int REMASSIGN = 119;
-  /** RegularExpression Id. */
-  int LSHIFTASSIGN = 120;
-  /** RegularExpression Id. */
-  int RSIGNEDSHIFTASSIGN = 121;
-  /** RegularExpression Id. */
-  int RUNSIGNEDSHIFTASSIGN = 122;
-  /** RegularExpression Id. */
-  int ELLIPSIS = 123;
-  /** RegularExpression Id. */
-  int RUNSIGNEDSHIFT = 124;
-  /** RegularExpression Id. */
-  int RSIGNEDSHIFT = 125;
-  /** RegularExpression Id. */
-  int GT = 126;
-  /** RegularExpression Id. */
-  int STUFF_TO_IGNORE = 128;
-
-  /** Lexical state. */
-  int DEFAULT = 0;
-  /** Lexical state. */
-  int IN_FORMAL_COMMENT = 1;
-  /** Lexical state. */
-  int IN_MULTI_LINE_COMMENT = 2;
-
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "\" \"",
-    "\"\\t\"",
-    "\"\\n\"",
-    "\"\\r\"",
-    "\"\\f\"",
-    "<token of kind 6>",
-    "\"/*\"",
-    "<SINGLE_LINE_COMMENT>",
-    "\"*/\"",
-    "\"*/\"",
-    "<token of kind 11>",
-    "\"abstract\"",
-    "\"assert\"",
-    "\"boolean\"",
-    "\"break\"",
-    "\"byte\"",
-    "\"case\"",
-    "\"catch\"",
-    "\"char\"",
-    "\"class\"",
-    "\"const\"",
-    "\"continue\"",
-    "\"default\"",
-    "\"do\"",
-    "\"double\"",
-    "\"else\"",
-    "\"enum\"",
-    "\"extends\"",
-    "\"false\"",
-    "\"final\"",
-    "\"finally\"",
-    "\"float\"",
-    "\"for\"",
-    "\"goto\"",
-    "\"if\"",
-    "\"implements\"",
-    "\"import\"",
-    "\"instanceof\"",
-    "\"int\"",
-    "\"interface\"",
-    "\"long\"",
-    "\"native\"",
-    "\"new\"",
-    "\"null\"",
-    "\"package\"",
-    "\"private\"",
-    "\"protected\"",
-    "\"public\"",
-    "\"return\"",
-    "\"short\"",
-    "\"static\"",
-    "\"strictfp\"",
-    "\"super\"",
-    "\"switch\"",
-    "\"synchronized\"",
-    "\"this\"",
-    "\"throw\"",
-    "\"throws\"",
-    "\"transient\"",
-    "\"true\"",
-    "\"try\"",
-    "\"void\"",
-    "\"volatile\"",
-    "\"while\"",
-    "<INTEGER_LITERAL>",
-    "<DECIMAL_LITERAL>",
-    "<HEX_LITERAL>",
-    "<OCTAL_LITERAL>",
-    "<FLOATING_POINT_LITERAL>",
-    "<DECIMAL_FLOATING_POINT_LITERAL>",
-    "<DECIMAL_EXPONENT>",
-    "<HEXADECIMAL_FLOATING_POINT_LITERAL>",
-    "<HEXADECIMAL_EXPONENT>",
-    "<CHARACTER_LITERAL>",
-    "<STRING_LITERAL>",
-    "<IDENTIFIER>",
-    "<LETTER>",
-    "<PART_LETTER>",
-    "\"(\"",
-    "\")\"",
-    "\"{\"",
-    "\"}\"",
-    "\"[\"",
-    "\"]\"",
-    "\";\"",
-    "\",\"",
-    "\".\"",
-    "\"@\"",
-    "\"=\"",
-    "\"<\"",
-    "\"!\"",
-    "\"~\"",
-    "\"?\"",
-    "\":\"",
-    "\"==\"",
-    "\"<=\"",
-    "\">=\"",
-    "\"!=\"",
-    "\"||\"",
-    "\"&&\"",
-    "\"++\"",
-    "\"--\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"&\"",
-    "\"|\"",
-    "\"^\"",
-    "\"%\"",
-    "\"<<\"",
-    "\"+=\"",
-    "\"-=\"",
-    "\"*=\"",
-    "\"/=\"",
-    "\"&=\"",
-    "\"|=\"",
-    "\"^=\"",
-    "\"%=\"",
-    "\"<<=\"",
-    "\">>=\"",
-    "\">>>=\"",
-    "\"...\"",
-    "\">>>\"",
-    "\">>\"",
-    "\">\"",
-    "\"\\u001a\"",
-    "<STUFF_TO_IGNORE>",
-  };
-
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15DebugTokenManager.java b/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15DebugTokenManager.java
deleted file mode 100644
index 2d07d2f..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/JavaParser15DebugTokenManager.java
+++ /dev/null
@@ -1,2140 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. JavaParserTokenManager.java */
-package net.sourceforge.cobertura.javancss.parser.java15.debug;
-
-import java.io.*;
-
-public class JavaParser15DebugTokenManager implements JavaParser15DebugConstants
-{
-  public  java.io.PrintStream debugStream = System.out;
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, long active2)
-{
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0xfffffffffffff000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 76;
-            return 28;
-         }
-         if ((active1 & 0x800000000800000L) != 0L)
-            return 4;
-         if ((active0 & 0x80L) != 0L || (active1 & 0x8040000000000L) != 0L)
-            return 47;
-         return -1;
-      case 1:
-         if ((active0 & 0x803000000L) != 0L)
-            return 28;
-         if ((active0 & 0xfffffff7fcfff000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 76;
-               jjmatchedPos = 1;
-            }
-            return 28;
-         }
-         if ((active0 & 0x80L) != 0L)
-            return 45;
-         return -1;
-      case 2:
-         if ((active0 & 0x2000098200000000L) != 0L)
-            return 28;
-         if ((active0 & 0xdffff675fefff000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 76;
-               jjmatchedPos = 2;
-            }
-            return 28;
-         }
-         return -1;
-      case 3:
-         if ((active0 & 0x510012040c0b0000L) != 0L)
-            return 28;
-         if ((active0 & 0x8effe571f2f4f000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 3;
-            return 28;
-         }
-         return -1;
-      case 4:
-         if ((active0 & 0x6240001e0348000L) != 0L || (active1 & 0x1L) != 0L)
-            return 28;
-         if ((active0 & 0x88dbe57012c07000L) != 0L)
-         {
-            if (jjmatchedPos != 4)
-            {
-               jjmatchedKind = 76;
-               jjmatchedPos = 4;
-            }
-            return 28;
-         }
-         return -1;
-      case 5:
-         if ((active0 & 0x44b042002002000L) != 0L)
-            return 28;
-         if ((active0 & 0x8890e15090c05000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 5;
-            return 28;
-         }
-         return -1;
-      case 6:
-         if ((active0 & 0x600090804000L) != 0L)
-            return 28;
-         if ((active0 & 0x8890815000401000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 6;
-            return 28;
-         }
-         return -1;
-      case 7:
-         if ((active0 & 0x880815000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 7;
-            return 28;
-         }
-         if ((active0 & 0x8010000000401000L) != 0L)
-            return 28;
-         return -1;
-      case 8:
-         if ((active0 & 0x800810000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x80005000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 8;
-            return 28;
-         }
-         return -1;
-      case 9:
-         if ((active0 & 0x5000000000L) != 0L)
-            return 28;
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 9;
-            return 28;
-         }
-         return -1;
-      case 10:
-         if ((active0 & 0x80000000000000L) != 0L)
-         {
-            jjmatchedKind = 76;
-            jjmatchedPos = 10;
-            return 28;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0, long active1, long active2)
-{
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1, active2), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 26:
-         return jjStopAtPos(0, 127);
-      case 33:
-         jjmatchedKind = 91;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x400000000L);
-      case 37:
-         jjmatchedKind = 110;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x80000000000000L);
-      case 38:
-         jjmatchedKind = 107;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x10001000000000L);
-      case 40:
-         return jjStopAtPos(0, 79);
-      case 41:
-         return jjStopAtPos(0, 80);
-      case 42:
-         jjmatchedKind = 105;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000000000000L);
-      case 43:
-         jjmatchedKind = 103;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1002000000000L);
-      case 44:
-         return jjStopAtPos(0, 86);
-      case 45:
-         jjmatchedKind = 104;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2004000000000L);
-      case 46:
-         jjmatchedKind = 87;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x800000000000000L);
-      case 47:
-         jjmatchedKind = 106;
-         return jjMoveStringLiteralDfa1_0(0x80L, 0x8000000000000L);
-      case 58:
-         return jjStopAtPos(0, 94);
-      case 59:
-         return jjStopAtPos(0, 85);
-      case 60:
-         jjmatchedKind = 90;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x100800100000000L);
-      case 61:
-         jjmatchedKind = 89;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x80000000L);
-      case 62:
-         jjmatchedKind = 126;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x3600000200000000L);
-      case 63:
-         return jjStopAtPos(0, 93);
-      case 64:
-         return jjStopAtPos(0, 88);
-      case 91:
-         return jjStopAtPos(0, 83);
-      case 93:
-         return jjStopAtPos(0, 84);
-      case 94:
-         jjmatchedKind = 109;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x40000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x3000L, 0x0L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x1c000L, 0x0L);
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0x7e0000L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x3800000L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x1c000000L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x3e0000000L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x400000000L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x1f800000000L, 0x0L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x20000000000L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x1c0000000000L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x1e00000000000L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x0L);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0xfc000000000000L, 0x0L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x3f00000000000000L, 0x0L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0xc000000000000000L, 0x0L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1L);
-      case 123:
-         return jjStopAtPos(0, 81);
-      case 124:
-         jjmatchedKind = 108;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x20000800000000L);
-      case 125:
-         return jjStopAtPos(0, 82);
-      case 126:
-         return jjStopAtPos(0, 92);
-      default :
-         return jjMoveNfa_0(0, 0);
-   }
-}
-private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0, active1, 0L);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 38:
-         if ((active1 & 0x1000000000L) != 0L)
-            return jjStopAtPos(1, 100);
-         break;
-      case 42:
-         if ((active0 & 0x80L) != 0L)
-            return jjStartNfaWithStates_0(1, 7, 45);
-         break;
-      case 43:
-         if ((active1 & 0x2000000000L) != 0L)
-            return jjStopAtPos(1, 101);
-         break;
-      case 45:
-         if ((active1 & 0x4000000000L) != 0L)
-            return jjStopAtPos(1, 102);
-         break;
-      case 46:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000000L);
-      case 60:
-         if ((active1 & 0x800000000000L) != 0L)
-         {
-            jjmatchedKind = 111;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x100000000000000L);
-      case 61:
-         if ((active1 & 0x80000000L) != 0L)
-            return jjStopAtPos(1, 95);
-         else if ((active1 & 0x100000000L) != 0L)
-            return jjStopAtPos(1, 96);
-         else if ((active1 & 0x200000000L) != 0L)
-            return jjStopAtPos(1, 97);
-         else if ((active1 & 0x400000000L) != 0L)
-            return jjStopAtPos(1, 98);
-         else if ((active1 & 0x1000000000000L) != 0L)
-            return jjStopAtPos(1, 112);
-         else if ((active1 & 0x2000000000000L) != 0L)
-            return jjStopAtPos(1, 113);
-         else if ((active1 & 0x4000000000000L) != 0L)
-            return jjStopAtPos(1, 114);
-         else if ((active1 & 0x8000000000000L) != 0L)
-            return jjStopAtPos(1, 115);
-         else if ((active1 & 0x10000000000000L) != 0L)
-            return jjStopAtPos(1, 116);
-         else if ((active1 & 0x20000000000000L) != 0L)
-            return jjStopAtPos(1, 117);
-         else if ((active1 & 0x40000000000000L) != 0L)
-            return jjStopAtPos(1, 118);
-         else if ((active1 & 0x80000000000000L) != 0L)
-            return jjStopAtPos(1, 119);
-         break;
-      case 62:
-         if ((active1 & 0x2000000000000000L) != 0L)
-         {
-            jjmatchedKind = 125;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1600000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x240020060000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2080000800000L, active1, 0L);
-      case 102:
-         if ((active0 & 0x800000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 35, 28);
-         break;
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x704000000080000L, active1, 0x1L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0xc0000000L, active1, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x104100000L, active1, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0x3000000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1c008000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x1000000L) != 0L)
-         {
-            jjmatchedKind = 24;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0xc000020602604000L, active1, 0L);
-      case 114:
-         return jjMoveStringLiteralDfa2_0(active0, 0x3800c00000008000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa2_0(active0, 0x18000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x21100000000000L, active1, 0L);
-      case 119:
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000000000000L, active1, 0L);
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10000000L, active1, 0L);
-      case 121:
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000000010000L, active1, 0L);
-      case 124:
-         if ((active1 & 0x800000000L) != 0L)
-            return jjStopAtPos(1, 99);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(0, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0, active1, 0L);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 46:
-         if ((active1 & 0x800000000000000L) != 0L)
-            return jjStopAtPos(2, 123);
-         break;
-      case 61:
-         if ((active1 & 0x100000000000000L) != 0L)
-            return jjStopAtPos(2, 120);
-         else if ((active1 & 0x200000000000000L) != 0L)
-            return jjStopAtPos(2, 121);
-         break;
-      case 62:
-         if ((active1 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 124;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000000000L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x808000000180000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000L, active1, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000L, active1, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4140400000000000L, active1, 0x1L);
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000100020000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800200c0600000L, active1, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4800100004000L, active1, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20003000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x200000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 33, 28);
-         return jjMoveStringLiteralDfa3_0(active0, 0x610000000000000L, active1, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4004023000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 39;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2050410050000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100000000a000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x80000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 43, 28);
-         break;
-      case 121:
-         if ((active0 & 0x2000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 61, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(1, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(2, active0, active1, 0L);
-      return 3;
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active1 & 0x400000000000000L) != 0L)
-            return jjStopAtPos(3, 122);
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000001c0808000L, active1, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000000040000L, active1, 0L);
-      case 100:
-         if ((active0 & 0x4000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 62, 28);
-         break;
-      case 101:
-         if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_0(3, 16, 28);
-         else if ((active0 & 0x20000L) != 0L)
-            return jjStartNfaWithStates_0(3, 17, 28);
-         else if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 26, 28);
-         else if ((active0 & 0x1000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 60, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x20010010002000L, active1, 0L);
-      case 103:
-         if ((active0 & 0x20000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 41, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x10040000000000L, active1, 0L);
-      case 107:
-         return jjMoveStringLiteralDfa4_0(active0, 0x200000000000L, active1, 0L);
-      case 108:
-         if ((active0 & 0x100000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 44, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x1001000004000L, active1, 0x1L);
-      case 109:
-         if ((active0 & 0x8000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 27, 28);
-         break;
-      case 110:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000000L, active1, 0L);
-      case 111:
-         if ((active0 & 0x400000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 34, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x600002000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(3, 19, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x100000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 56, 28);
-         return jjMoveStringLiteralDfa4_0(active0, 0x20300000L, active1, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0x48804000401000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(2, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(2, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(3, active0, active1, 0L);
-      return 4;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0x604000000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0x50000000000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 29, 28);
-         else if ((active1 & 0x1L) != 0L)
-            return jjStartNfaWithStates_0(4, 64, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x801000004000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x40000L) != 0L)
-            return jjStartNfaWithStates_0(4, 18, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0x9000000400000L, active1, 0L);
-      case 107:
-         if ((active0 & 0x8000L) != 0L)
-            return jjStartNfaWithStates_0(4, 15, 28);
-         break;
-      case 108:
-         if ((active0 & 0x40000000L) != 0L)
-         {
-            jjmatchedKind = 30;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x82000000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa5_0(active0, 0x10000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x20000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 53, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x2012000003000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x100000L) != 0L)
-            return jjStartNfaWithStates_0(4, 20, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000000000000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(4, 21, 28);
-         else if ((active0 & 0x100000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 32, 28);
-         else if ((active0 & 0x4000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 50, 28);
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x800000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa5_0(active0, 0x40000000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x200000000000000L) != 0L)
-         {
-            jjmatchedKind = 57;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x400000000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(3, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(3, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(4, active0, 0L, 0L);
-      return 5;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0x5000L);
-      case 99:
-         if ((active0 & 0x1000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 48, 28);
-         else if ((active0 & 0x8000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 51, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x800000000000L);
-      case 100:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10000000L);
-      case 101:
-         if ((active0 & 0x2000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 25, 28);
-         else if ((active0 & 0x40000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 42, 28);
-         break;
-      case 102:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10000000000L);
-      case 103:
-         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000L);
-      case 104:
-         if ((active0 & 0x40000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 54, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x8800000000000000L);
-      case 108:
-         return jjMoveStringLiteralDfa6_0(active0, 0x80800000L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000L);
-      case 110:
-         if ((active0 & 0x2000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 49, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000400000L);
-      case 114:
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L);
-      case 115:
-         if ((active0 & 0x400000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 58, 28);
-         break;
-      case 116:
-         if ((active0 & 0x2000L) != 0L)
-            return jjStartNfaWithStates_0(5, 13, 28);
-         else if ((active0 & 0x2000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 37, 28);
-         return jjMoveStringLiteralDfa6_0(active0, 0x10400000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(4, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa6_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(4, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(5, active0, 0L, 0L);
-      return 6;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000L);
-      case 99:
-         return jjMoveStringLiteralDfa7_0(active0, 0x4000001000L);
-      case 101:
-         if ((active0 & 0x200000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 45, 28);
-         else if ((active0 & 0x400000000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 46, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x800001000000000L);
-      case 102:
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000000000000L);
-      case 108:
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000000L);
-      case 110:
-         if ((active0 & 0x4000L) != 0L)
-            return jjStartNfaWithStates_0(6, 14, 28);
-         break;
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0x80000000000000L);
-      case 115:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 28, 28);
-         break;
-      case 116:
-         if ((active0 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_0(6, 23, 28);
-         return jjMoveStringLiteralDfa7_0(active0, 0x800000000000L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0x400000L);
-      case 121:
-         if ((active0 & 0x80000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 31, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(5, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa7_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(5, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(6, active0, 0L, 0L);
-      return 7;
-   }
-   switch(curChar)
-   {
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0x10000000000L);
-      case 101:
-         if ((active0 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(7, 22, 28);
-         else if ((active0 & 0x8000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 63, 28);
-         return jjMoveStringLiteralDfa8_0(active0, 0x804000000000L);
-      case 110:
-         return jjMoveStringLiteralDfa8_0(active0, 0x880001000000000L);
-      case 112:
-         if ((active0 & 0x10000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 52, 28);
-         break;
-      case 116:
-         if ((active0 & 0x1000L) != 0L)
-            return jjStartNfaWithStates_0(7, 12, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(6, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa8_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(6, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(7, active0, 0L, 0L);
-      return 8;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x800000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 47, 28);
-         break;
-      case 101:
-         if ((active0 & 0x10000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 40, 28);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active0, 0x80000000000000L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0x4000000000L);
-      case 116:
-         if ((active0 & 0x800000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 59, 28);
-         return jjMoveStringLiteralDfa9_0(active0, 0x1000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(7, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa9_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(7, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(8, active0, 0L, 0L);
-      return 9;
-   }
-   switch(curChar)
-   {
-      case 102:
-         if ((active0 & 0x4000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 38, 28);
-         break;
-      case 115:
-         if ((active0 & 0x1000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 36, 28);
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa10_0(active0, 0x80000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(8, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa10_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(8, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(9, active0, 0L, 0L);
-      return 10;
-   }
-   switch(curChar)
-   {
-      case 101:
-         return jjMoveStringLiteralDfa11_0(active0, 0x80000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(9, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa11_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(9, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(10, active0, 0L, 0L);
-      return 11;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x80000000000000L) != 0L)
-            return jjStartNfaWithStates_0(11, 55, 28);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(10, active0, 0L, 0L);
-}
-private final void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private final void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
-   jjCheckNAdd(jjnextStates[start]);
-   jjCheckNAdd(jjnextStates[start + 1]);
-}
-static final long[] jjbitVec0 = {
-   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec2 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec3 = {
-   0xfff0000000200002L, 0xffffffffffffdfffL, 0xfffff00f7fffffffL, 0x12000000007fffffL
-};
-static final long[] jjbitVec4 = {
-   0x0L, 0x0L, 0x420043c00000000L, 0xff7fffffff7fffffL
-};
-static final long[] jjbitVec5 = {
-   0xffffcffffffffL, 0xffffffffffff0000L, 0xf9ff3fffffffffffL, 0x401f00030003L
-};
-static final long[] jjbitVec6 = {
-   0x0L, 0x400000000000000L, 0xfffffffbffffd740L, 0xffffffcff7fffL
-};
-static final long[] jjbitVec7 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffffff003L, 0x33fffffffff199fL
-};
-static final long[] jjbitVec8 = {
-   0xfffe000000000000L, 0xfffffffe027fffffL, 0xffL, 0x707ffffff0000L
-};
-static final long[] jjbitVec9 = {
-   0x7fffffe00000000L, 0xfffe0000000007ffL, 0xffffffffffffffffL, 0x1c000060002fffffL
-};
-static final long[] jjbitVec10 = {
-   0x1ffffffd0000L, 0x0L, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec11 = {
-   0x23ffffffffffffe0L, 0x3ff010000L, 0x3c5fdfffff99fe0L, 0xf0003b0000000L
-};
-static final long[] jjbitVec12 = {
-   0x36dfdfffff987e0L, 0x1c00005e000000L, 0x23edfdfffffbafe0L, 0x100010000L
-};
-static final long[] jjbitVec13 = {
-   0x23cdfdfffff99fe0L, 0x3b0000000L, 0x3bfc718d63dc7e0L, 0x0L
-};
-static final long[] jjbitVec14 = {
-   0x3effdfffffddfe0L, 0x300000000L, 0x3effdfffffddfe0L, 0x340000000L
-};
-static final long[] jjbitVec15 = {
-   0x3fffdfffffddfe0L, 0x300000000L, 0x2ffbfffffc7fffe0L, 0x7fL
-};
-static final long[] jjbitVec16 = {
-   0x800dfffffffffffeL, 0x7fL, 0x200decaefef02596L, 0x3000005fL
-};
-static final long[] jjbitVec17 = {
-   0x1L, 0x7fffffffeffL, 0xf00L, 0x0L
-};
-static final long[] jjbitVec18 = {
-   0x6fbffffffffL, 0x3f0000L, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-static final long[] jjbitVec19 = {
-   0xffffffffffffffffL, 0xffffffff83ffffffL, 0xffffff07ffffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec20 = {
-   0xffffffffffffff7fL, 0xffffffff3d7f3d7fL, 0x7f3d7fffffff3d7fL, 0xffff7fffff7f7f3dL
-};
-static final long[] jjbitVec21 = {
-   0xffffffff7f3d7fffL, 0x7ffff7fL, 0xffffffff00000000L, 0x1fffffffffffffL
-};
-static final long[] jjbitVec22 = {
-   0xffffffffffffffffL, 0x7f9fffffffffffL, 0xffffffff07fffffeL, 0x7ffffffffffL
-};
-static final long[] jjbitVec23 = {
-   0x0L, 0x0L, 0xfffffffffffffL, 0x8000000L
-};
-static final long[] jjbitVec24 = {
-   0xffffffff00000000L, 0xffffffffffffffL, 0x1ffffffffffL, 0x0L
-};
-static final long[] jjbitVec25 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffff0fffffffL, 0x3ffffffffffffffL
-};
-static final long[] jjbitVec26 = {
-   0xffffffff3f3fffffL, 0x3fffffffaaff3f3fL, 0x5fdfffffffffffffL, 0x1fdc1fff0fcf1fdcL
-};
-static final long[] jjbitVec27 = {
-   0x8000000000000000L, 0x8000000000000001L, 0xffff00000000L, 0x0L
-};
-static final long[] jjbitVec28 = {
-   0x3fbbd503e2ffc84L, 0xffffffff00000000L, 0xfL, 0x0L
-};
-static final long[] jjbitVec29 = {
-   0x73e03fe000000e0L, 0xfffffffffffffffeL, 0xfffffffe601fffffL, 0x7fffffffffffffffL
-};
-static final long[] jjbitVec30 = {
-   0xfffe1fffffffffe0L, 0xffffffffffffffffL, 0xffffff00007fffL, 0x0L
-};
-static final long[] jjbitVec31 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffffffL, 0x0L
-};
-static final long[] jjbitVec32 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffL, 0x0L
-};
-static final long[] jjbitVec33 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0x1fffL, 0x0L
-};
-static final long[] jjbitVec34 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffL, 0x0L
-};
-static final long[] jjbitVec35 = {
-   0x3fffffffffffL, 0x0L, 0x0L, 0x0L
-};
-static final long[] jjbitVec36 = {
-   0x5f7ffdffa0f8007fL, 0xffffffffffffffdbL, 0x3ffffffffffffL, 0xfffffffffff80000L
-};
-static final long[] jjbitVec37 = {
-   0x3fffffffffffffffL, 0xffffffffffff0000L, 0xfffffffffffcffffL, 0xfff0000000000ffL
-};
-static final long[] jjbitVec38 = {
-   0x18000000000000L, 0xffd702000000e000L, 0xffffffffffffffffL, 0x1fffffffffffffffL
-};
-static final long[] jjbitVec39 = {
-   0x87fffffe00000010L, 0xffffffe007fffffeL, 0x7fffffffffffffffL, 0x631cfcfcfcL
-};
-static final long[] jjbitVec40 = {
-   0x0L, 0x0L, 0x420043cffffffffL, 0xff7fffffff7fffffL
-};
-static final long[] jjbitVec41 = {
-   0xffffffffffffffffL, 0x400000700007fffL, 0xfffffffbffffd740L, 0xffffffcff7fffL
-};
-static final long[] jjbitVec42 = {
-   0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffffff07bL, 0x33fffffffff199fL
-};
-static final long[] jjbitVec43 = {
-   0xfffe000000000000L, 0xfffffffe027fffffL, 0xbbfffffbfffe00ffL, 0x707ffffff0016L
-};
-static final long[] jjbitVec44 = {
-   0x7fffffe00000000L, 0xffff03ff003fffffL, 0xffffffffffffffffL, 0x1fff3dff9fefffffL
-};
-static final long[] jjbitVec45 = {
-   0xffff1fffffff8000L, 0x7ffL, 0x1ffffffffffffL, 0x0L
-};
-static final long[] jjbitVec46 = {
-   0xf3ffffffffffffeeL, 0xffcfff1f3fffL, 0xd3c5fdfffff99feeL, 0xfffcfb080399fL
-};
-static final long[] jjbitVec47 = {
-   0xd36dfdfffff987e4L, 0x1fffc05e003987L, 0xf3edfdfffffbafeeL, 0xffc100013bbfL
-};
-static final long[] jjbitVec48 = {
-   0xf3cdfdfffff99feeL, 0xffc3b0c0398fL, 0xc3bfc718d63dc7ecL, 0xff8000803dc7L
-};
-static final long[] jjbitVec49 = {
-   0xc3effdfffffddfeeL, 0xffc300603ddfL, 0xc3effdfffffddfecL, 0xffc340603ddfL
-};
-static final long[] jjbitVec50 = {
-   0xc3fffdfffffddfecL, 0xffc300803dcfL, 0x2ffbfffffc7fffecL, 0xc0000ff5f847fL
-};
-static final long[] jjbitVec51 = {
-   0x87fffffffffffffeL, 0x3ff7fffL, 0x3bffecaefef02596L, 0x33ff3f5fL
-};
-static final long[] jjbitVec52 = {
-   0xc2a003ff03000001L, 0xfffe07fffffffeffL, 0x1ffffffffeff0fdfL, 0x40L
-};
-static final long[] jjbitVec53 = {
-   0x3c7f6fbffffffffL, 0x3ff03ffL, 0xffffffff00000000L, 0x7fffffffff003fL
-};
-static final long[] jjbitVec54 = {
-   0xffffffff7f3d7fffL, 0x3fe0007ffff7fL, 0xffffffff00000000L, 0x1fffffffffffffL
-};
-static final long[] jjbitVec55 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0x3ff080fffffL
-};
-static final long[] jjbitVec56 = {
-   0xffffffff03ff7800L, 0xffffffffffffffL, 0x3ffffffffffL, 0x0L
-};
-static final long[] jjbitVec57 = {
-   0x80007c000000f000L, 0x8000fc0000000001L, 0xffff00000000L, 0x21fff0000L
-};
-static final long[] jjbitVec58 = {
-   0x73efffe000000e0L, 0xfffffffffffffffeL, 0xfffffffe661fffffL, 0x7fffffffffffffffL
-};
-static final long[] jjbitVec59 = {
-   0x5f7ffdffe0f8007fL, 0xffffffffffffffdbL, 0x3ffffffffffffL, 0xfffffffffff80000L
-};
-static final long[] jjbitVec60 = {
-   0x18000f00000000L, 0xffd702000000e000L, 0xffffffffffffffffL, 0x9fffffffffffffffL
-};
-static final long[] jjbitVec61 = {
-   0x87fffffe03ff0010L, 0xffffffe007fffffeL, 0x7fffffffffffffffL, 0xe0000631cfcfcfcL
-};
-private final int jjMoveNfa_0(int startState, int curPos)
-{
-   int[] nextStates;
-   int startsAt = 0;
-   jjnewStateCnt = 70;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int j, kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 47:
-                  if (curChar == 47)
-                  {
-                     if (kind > 8)
-                        kind = 8;
-                     jjCheckNAddStates(0, 2);
-                  }
-                  else if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 45;
-                  break;
-               case 0:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(3, 9);
-                  else if (curChar == 47)
-                     jjAddStates(10, 11);
-                  else if (curChar == 36)
-                  {
-                     if (kind > 76)
-                        kind = 76;
-                     jjCheckNAdd(28);
-                  }
-                  else if (curChar == 34)
-                     jjCheckNAddStates(12, 14);
-                  else if (curChar == 39)
-                     jjAddStates(15, 16);
-                  else if (curChar == 46)
-                     jjCheckNAdd(4);
-                  if ((0x3fe000000000000L & l) != 0L)
-                  {
-                     if (kind > 65)
-                        kind = 65;
-                     jjCheckNAddTwoStates(1, 2);
-                  }
-                  else if (curChar == 48)
-                  {
-                     if (kind > 65)
-                        kind = 65;
-                     jjCheckNAddStates(17, 21);
-                  }
-                  break;
-               case 1:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(1, 2);
-                  break;
-               case 3:
-                  if (curChar == 46)
-                     jjCheckNAdd(4);
-                  break;
-               case 4:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddStates(22, 24);
-                  break;
-               case 6:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(7);
-                  break;
-               case 7:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-                  if (curChar == 39)
-                     jjAddStates(15, 16);
-                  break;
-               case 10:
-                  if ((0xffffff7fffffdbffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 11:
-                  if (curChar == 39 && kind > 74)
-                     kind = 74;
-                  break;
-               case 13:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 14:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(15, 11);
-                  break;
-               case 15:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 16:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 17;
-                  break;
-               case 17:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(15);
-                  break;
-               case 18:
-                  if (curChar == 34)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 19:
-                  if ((0xfffffffbffffdbffL & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 21:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 22:
-                  if (curChar == 34 && kind > 75)
-                     kind = 75;
-                  break;
-               case 23:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(25, 28);
-                  break;
-               case 24:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 25:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 26;
-                  break;
-               case 26:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(24);
-                  break;
-               case 27:
-                  if (curChar != 36)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 28:
-                  if ((0x3ff00100fffc1ffL & l) == 0L)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 29:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(3, 9);
-                  break;
-               case 30:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(29, 31);
-                  break;
-               case 32:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(33);
-                  break;
-               case 33:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(33, 8);
-                  break;
-               case 34:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(34, 35);
-                  break;
-               case 36:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(37);
-                  break;
-               case 37:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(37, 8);
-                  break;
-               case 38:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(38, 39);
-                  break;
-               case 39:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddStates(32, 34);
-                  break;
-               case 40:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddStates(32, 34);
-                  break;
-               case 42:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(43);
-                  break;
-               case 43:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(43, 8);
-                  break;
-               case 44:
-                  if (curChar == 47)
-                     jjAddStates(10, 11);
-                  break;
-               case 45:
-                  if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 46;
-                  break;
-               case 46:
-                  if ((0xffff7fffffffffffL & l) != 0L && kind > 6)
-                     kind = 6;
-                  break;
-               case 48:
-                  if (curChar != 47)
-                     break;
-                  if (kind > 8)
-                     kind = 8;
-                  jjCheckNAddStates(0, 2);
-                  break;
-               case 49:
-                  if ((0xffffffffffffdbffL & l) == 0L)
-                     break;
-                  if (kind > 8)
-                     kind = 8;
-                  jjCheckNAddStates(0, 2);
-                  break;
-               case 50:
-                  if ((0x2400L & l) != 0L && kind > 8)
-                     kind = 8;
-                  break;
-               case 51:
-                  if (curChar == 10 && kind > 8)
-                     kind = 8;
-                  break;
-               case 52:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 51;
-                  break;
-               case 53:
-                  if (curChar != 48)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddStates(17, 21);
-                  break;
-               case 55:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(55, 2);
-                  break;
-               case 56:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(56, 2);
-                  break;
-               case 58:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjAddStates(35, 36);
-                  break;
-               case 59:
-                  if (curChar == 46)
-                     jjCheckNAdd(60);
-                  break;
-               case 60:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(60, 61);
-                  break;
-               case 62:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(63);
-                  break;
-               case 63:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(63, 8);
-                  break;
-               case 65:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(37, 39);
-                  break;
-               case 66:
-                  if (curChar == 46)
-                     jjCheckNAdd(67);
-                  break;
-               case 68:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(69);
-                  break;
-               case 69:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 69)
-                     kind = 69;
-                  jjCheckNAddTwoStates(69, 8);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if ((0x7fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 2:
-                  if ((0x100000001000L & l) != 0L && kind > 65)
-                     kind = 65;
-                  break;
-               case 5:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(40, 41);
-                  break;
-               case 8:
-                  if ((0x5000000050L & l) != 0L && kind > 69)
-                     kind = 69;
-                  break;
-               case 10:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 12:
-                  if (curChar == 92)
-                     jjAddStates(42, 44);
-                  break;
-               case 13:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAdd(11);
-                  break;
-               case 19:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 20:
-                  if (curChar == 92)
-                     jjAddStates(45, 47);
-                  break;
-               case 21:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAddStates(12, 14);
-                  break;
-               case 28:
-                  if ((0x87fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 31:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(48, 49);
-                  break;
-               case 35:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(50, 51);
-                  break;
-               case 41:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(52, 53);
-                  break;
-               case 46:
-                  if (kind > 6)
-                     kind = 6;
-                  break;
-               case 49:
-                  if (kind > 8)
-                     kind = 8;
-                  jjAddStates(0, 2);
-                  break;
-               case 54:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(55);
-                  break;
-               case 55:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAddTwoStates(55, 2);
-                  break;
-               case 57:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAddTwoStates(58, 59);
-                  break;
-               case 58:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddTwoStates(58, 59);
-                  break;
-               case 60:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjAddStates(54, 55);
-                  break;
-               case 61:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjAddStates(56, 57);
-                  break;
-               case 64:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(65);
-                  break;
-               case 65:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddStates(37, 39);
-                  break;
-               case 67:
-                  if ((0x1000000010000L & l) != 0L)
-                     jjAddStates(58, 59);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 0:
-                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 10:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjstateSet[jjnewStateCnt++] = 11;
-                  break;
-               case 19:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(12, 14);
-                  break;
-               case 28:
-                  if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 76)
-                     kind = 76;
-                  jjCheckNAdd(28);
-                  break;
-               case 46:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 6)
-                     kind = 6;
-                  break;
-               case 49:
-                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 8)
-                     kind = 8;
-                  jjAddStates(0, 2);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 70 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
-   switch(curChar)
-   {
-      case 42:
-         return jjMoveStringLiteralDfa1_2(0x400L);
-      default :
-         return 1;
-   }
-}
-private final int jjMoveStringLiteralDfa1_2(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 47:
-         if ((active0 & 0x400L) != 0L)
-            return jjStopAtPos(1, 10);
-         break;
-      default :
-         return 2;
-   }
-   return 2;
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
-   switch(curChar)
-   {
-      case 42:
-         return jjMoveStringLiteralDfa1_1(0x200L);
-      default :
-         return 1;
-   }
-}
-private final int jjMoveStringLiteralDfa1_1(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 47:
-         if ((active0 & 0x200L) != 0L)
-            return jjStopAtPos(1, 9);
-         break;
-      default :
-         return 2;
-   }
-   return 2;
-}
-static final int[] jjnextStates = {
-   49, 50, 52, 30, 31, 8, 34, 35, 38, 39, 47, 48, 19, 20, 22, 10, 
-   12, 54, 56, 2, 57, 64, 4, 5, 8, 19, 20, 24, 22, 30, 31, 8, 
-   40, 41, 8, 58, 59, 65, 66, 67, 6, 7, 13, 14, 16, 21, 23, 25, 
-   32, 33, 36, 37, 42, 43, 60, 61, 62, 63, 68, 69, 
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec2[i2] & l2) != 0L);
-      default : 
-         if ((jjbitVec0[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec4[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec6[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec7[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec8[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec9[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec10[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec11[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec12[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec13[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec14[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec15[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec16[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec17[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec18[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec21[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec23[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec24[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec27[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec29[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec36[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec38[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec39[i2] & l2) != 0L);
-      default : 
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec40[i2] & l2) != 0L);
-      case 2:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      case 3:
-         return ((jjbitVec41[i2] & l2) != 0L);
-      case 4:
-         return ((jjbitVec42[i2] & l2) != 0L);
-      case 5:
-         return ((jjbitVec43[i2] & l2) != 0L);
-      case 6:
-         return ((jjbitVec44[i2] & l2) != 0L);
-      case 7:
-         return ((jjbitVec45[i2] & l2) != 0L);
-      case 9:
-         return ((jjbitVec46[i2] & l2) != 0L);
-      case 10:
-         return ((jjbitVec47[i2] & l2) != 0L);
-      case 11:
-         return ((jjbitVec48[i2] & l2) != 0L);
-      case 12:
-         return ((jjbitVec49[i2] & l2) != 0L);
-      case 13:
-         return ((jjbitVec50[i2] & l2) != 0L);
-      case 14:
-         return ((jjbitVec51[i2] & l2) != 0L);
-      case 15:
-         return ((jjbitVec52[i2] & l2) != 0L);
-      case 16:
-         return ((jjbitVec53[i2] & l2) != 0L);
-      case 17:
-         return ((jjbitVec19[i2] & l2) != 0L);
-      case 18:
-         return ((jjbitVec20[i2] & l2) != 0L);
-      case 19:
-         return ((jjbitVec54[i2] & l2) != 0L);
-      case 20:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 22:
-         return ((jjbitVec22[i2] & l2) != 0L);
-      case 23:
-         return ((jjbitVec55[i2] & l2) != 0L);
-      case 24:
-         return ((jjbitVec56[i2] & l2) != 0L);
-      case 30:
-         return ((jjbitVec25[i2] & l2) != 0L);
-      case 31:
-         return ((jjbitVec26[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec57[i2] & l2) != 0L);
-      case 33:
-         return ((jjbitVec28[i2] & l2) != 0L);
-      case 48:
-         return ((jjbitVec58[i2] & l2) != 0L);
-      case 49:
-         return ((jjbitVec30[i2] & l2) != 0L);
-      case 77:
-         return ((jjbitVec31[i2] & l2) != 0L);
-      case 159:
-         return ((jjbitVec32[i2] & l2) != 0L);
-      case 164:
-         return ((jjbitVec33[i2] & l2) != 0L);
-      case 215:
-         return ((jjbitVec34[i2] & l2) != 0L);
-      case 250:
-         return ((jjbitVec35[i2] & l2) != 0L);
-      case 251:
-         return ((jjbitVec59[i2] & l2) != 0L);
-      case 253:
-         return ((jjbitVec37[i2] & l2) != 0L);
-      case 254:
-         return ((jjbitVec60[i2] & l2) != 0L);
-      case 255:
-         return ((jjbitVec61[i2] & l2) != 0L);
-      default : 
-         if ((jjbitVec3[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, null, null, null, null, 
-"\141\142\163\164\162\141\143\164", "\141\163\163\145\162\164", "\142\157\157\154\145\141\156", 
-"\142\162\145\141\153", "\142\171\164\145", "\143\141\163\145", "\143\141\164\143\150", 
-"\143\150\141\162", "\143\154\141\163\163", "\143\157\156\163\164", 
-"\143\157\156\164\151\156\165\145", "\144\145\146\141\165\154\164", "\144\157", "\144\157\165\142\154\145", 
-"\145\154\163\145", "\145\156\165\155", "\145\170\164\145\156\144\163", "\146\141\154\163\145", 
-"\146\151\156\141\154", "\146\151\156\141\154\154\171", "\146\154\157\141\164", "\146\157\162", 
-"\147\157\164\157", "\151\146", "\151\155\160\154\145\155\145\156\164\163", 
-"\151\155\160\157\162\164", "\151\156\163\164\141\156\143\145\157\146", "\151\156\164", 
-"\151\156\164\145\162\146\141\143\145", "\154\157\156\147", "\156\141\164\151\166\145", "\156\145\167", 
-"\156\165\154\154", "\160\141\143\153\141\147\145", "\160\162\151\166\141\164\145", 
-"\160\162\157\164\145\143\164\145\144", "\160\165\142\154\151\143", "\162\145\164\165\162\156", 
-"\163\150\157\162\164", "\163\164\141\164\151\143", "\163\164\162\151\143\164\146\160", 
-"\163\165\160\145\162", "\163\167\151\164\143\150", 
-"\163\171\156\143\150\162\157\156\151\172\145\144", "\164\150\151\163", "\164\150\162\157\167", "\164\150\162\157\167\163", 
-"\164\162\141\156\163\151\145\156\164", "\164\162\165\145", "\164\162\171", "\166\157\151\144", 
-"\166\157\154\141\164\151\154\145", "\167\150\151\154\145", null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, "\50", "\51", "\173", "\175", "\133", "\135", "\73", 
-"\54", "\56", "\100", "\75", "\74", "\41", "\176", "\77", "\72", "\75\75", "\74\75", 
-"\76\75", "\41\75", "\174\174", "\46\46", "\53\53", "\55\55", "\53", "\55", "\52", 
-"\57", "\46", "\174", "\136", "\45", "\74\74", "\53\75", "\55\75", "\52\75", 
-"\57\75", "\46\75", "\174\75", "\136\75", "\45\75", "\74\74\75", "\76\76\75", 
-"\76\76\76\75", "\56\56\56", "\76\76\76", "\76\76", "\76", "\32", null, };
-public static final String[] lexStateNames = {
-   "DEFAULT", 
-   "IN_FORMAL_COMMENT", 
-   "IN_MULTI_LINE_COMMENT", 
-};
-public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, 1, 2, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xfffffffffffff001L, 0xffffffffffff9c23L, 0x1L, 
-};
-static final long[] jjtoSkip = {
-   0x73eL, 0x0L, 0x0L, 
-};
-static final long[] jjtoSpecial = {
-   0x700L, 0x0L, 0x0L, 
-};
-static final long[] jjtoMore = {
-   0x8c0L, 0x0L, 0x0L, 
-};
-protected JavaCharStream input_stream;
-private final int[] jjrounds = new int[70];
-private final int[] jjstateSet = new int[140];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public JavaParser15DebugTokenManager(JavaCharStream stream){
-   if (JavaCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-public JavaParser15DebugTokenManager(JavaCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
-public void ReInit(JavaCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private final void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 70; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-public void ReInit(JavaCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 3 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   Token t = Token.newToken(jjmatchedKind);
-   t.kind = jjmatchedKind;
-   String im = jjstrLiteralImages[jjmatchedKind];
-   t.image = (im == null) ? input_stream.GetImage() : im;
-   t.beginLine = input_stream.getBeginLine();
-   t.beginColumn = input_stream.getBeginColumn();
-   t.endLine = input_stream.getEndLine();
-   t.endColumn = input_stream.getEndColumn();
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken() 
-{
-  int kind;
-  Token specialToken = null;
-  Token matchedToken;
-  int curPos = 0;
-
-  EOFLoop :
-  for (;;)
-  {   
-   try   
-   {     
-      curChar = input_stream.BeginToken();
-   }     
-   catch(java.io.IOException e)
-   {        
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      matchedToken.specialToken = specialToken;
-      return matchedToken;
-   }
-   image = null;
-   jjimageLen = 0;
-
-   for (;;)
-   {
-     switch(curLexState)
-     {
-       case 0:
-         try { input_stream.backup(0);
-            while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L)
-               curChar = input_stream.BeginToken();
-         }
-         catch (java.io.IOException e1) { continue EOFLoop; }
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_0();
-         if (jjmatchedPos == 0 && jjmatchedKind > 128)
-         {
-            jjmatchedKind = 128;
-         }
-         break;
-       case 1:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_1();
-         if (jjmatchedPos == 0 && jjmatchedKind > 11)
-         {
-            jjmatchedKind = 11;
-         }
-         break;
-       case 2:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_2();
-         if (jjmatchedPos == 0 && jjmatchedKind > 11)
-         {
-            jjmatchedKind = 11;
-         }
-         break;
-     }
-     if (jjmatchedKind != 0x7fffffff)
-     {
-        if (jjmatchedPos + 1 < curPos)
-           input_stream.backup(curPos - jjmatchedPos - 1);
-        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           matchedToken = jjFillToken();
-           matchedToken.specialToken = specialToken;
-           TokenLexicalActions(matchedToken);
-       if (jjnewLexState[jjmatchedKind] != -1)
-         curLexState = jjnewLexState[jjmatchedKind];
-           return matchedToken;
-        }
-        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-           {
-              matchedToken = jjFillToken();
-              if (specialToken == null)
-                 specialToken = matchedToken;
-              else
-              {
-                 matchedToken.specialToken = specialToken;
-                 specialToken = (specialToken.next = matchedToken);
-              }
-              SkipLexicalActions(matchedToken);
-           }
-           else 
-              SkipLexicalActions(null);
-         if (jjnewLexState[jjmatchedKind] != -1)
-           curLexState = jjnewLexState[jjmatchedKind];
-           continue EOFLoop;
-        }
-        MoreLexicalActions();
-      if (jjnewLexState[jjmatchedKind] != -1)
-        curLexState = jjnewLexState[jjmatchedKind];
-        curPos = 0;
-        jjmatchedKind = 0x7fffffff;
-        try {
-           curChar = input_stream.readChar();
-           continue;
-        }
-        catch (java.io.IOException e1) { }
-     }
-     int error_line = input_stream.getEndLine();
-     int error_column = input_stream.getEndColumn();
-     String error_after = null;
-     boolean EOFSeen = false;
-     try { input_stream.readChar(); input_stream.backup(1); }
-     catch (java.io.IOException e1) {
-        EOFSeen = true;
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-        if (curChar == '\n' || curChar == '\r') {
-           error_line++;
-           error_column = 0;
-        }
-        else
-           error_column++;
-     }
-     if (!EOFSeen) {
-        input_stream.backup(1);
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-     }
-     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-   }
-  }
-}
-
-void SkipLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      default :
-         break;
-   }
-}
-void MoreLexicalActions()
-{
-   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
-   switch(jjmatchedKind)
-   {
-      case 6 :
-         if (image == null)
-            image = new StringBuffer();
-         image.append(input_stream.GetSuffix(jjimageLen));
-         jjimageLen = 0;
-                   input_stream.backup(1);
-         break;
-      default : 
-         break;
-   }
-}
-void TokenLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      case 124 :
-        if (image == null)
-            image = new StringBuffer();
-            image.append(jjstrLiteralImages[124]);
-     matchedToken.kind = GT;
-     ((Token.GTToken)matchedToken).realKind = RUNSIGNEDSHIFT;
-     input_stream.backup(2);
-     matchedToken.image = ">";
-         break;
-      case 125 :
-        if (image == null)
-            image = new StringBuffer();
-            image.append(jjstrLiteralImages[125]);
-     matchedToken.kind = GT;
-     ((Token.GTToken)matchedToken).realKind = RSIGNEDSHIFT;
-     input_stream.backup(1);
-     matchedToken.image = ">";
-         break;
-      default : 
-         break;
-   }
-}
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/ParseException.java b/src/net/sourceforge/cobertura/javancss/parser/java15/debug/ParseException.java
deleted file mode 100644
index 6fd710c..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/ParseException.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 4.1 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
-package net.sourceforge.cobertura.javancss.parser.java15.debug;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.  The boolean
-   * flag "specialConstructor" is also set to true to indicate that
-   * this constructor was used to create this object.
-   * This constructor calls its super class with the empty string
-   * to force the "toString" method of parent class "Throwable" to
-   * print the error message in the form:
-   *     ParseException: <result of getMessage>
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super("");
-    specialConstructor = true;
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-    specialConstructor = false;
-  }
-
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-    specialConstructor = false;
-  }
-
-  /**
-   * This variable determines which constructor was used to create
-   * this object and thereby affects the semantics of the
-   * "getMessage" method (see below).
-   */
-  protected boolean specialConstructor;
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * This method has the standard behavior when this object has been
-   * created using the standard constructors.  Otherwise, it uses
-   * "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser), then this method is called during the printing
-   * of the final stack trace, and hence the correct error message
-   * gets displayed.
-   */
-  public String getMessage() {
-    if (!specialConstructor) {
-      return super.getMessage();
-    }
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-    retval += expected.toString();
-    return retval;
-  }
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  protected String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-}
-/* JavaCC - OriginalChecksum=4c15f959e6d67e355e3b2e4945de83e6 (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/Token.java b/src/net/sourceforge/cobertura/javancss/parser/java15/debug/Token.java
deleted file mode 100644
index e48ad82..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/Token.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/**
- * Describes the input token stream.
- */
-
-package net.sourceforge.cobertura.javancss.parser.java15.debug;
-
-public class Token {
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /**
-   * beginLine and beginColumn describe the position of the first character
-   * of this token; endLine and endColumn describe the position of the
-   * last character of this token.
-   */
-  public int beginLine, beginColumn, endLine, endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-     return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simlpy add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken();
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use it in your lexical actions.
-   */
-  public static final Token newToken(int ofKind)
-  {
-     switch(ofKind)
-     {
-       default : return new Token();
-       case JavaParser15DebugConstants.RUNSIGNEDSHIFT:
-       case JavaParser15DebugConstants.RSIGNEDSHIFT:
-       case JavaParser15DebugConstants.GT:
-          return new GTToken();
-     }
-  }
-
-  public static class GTToken extends Token
-  {
-     int realKind = JavaParser15DebugConstants.GT;
-  }
-}
diff --git a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/TokenMgrError.java b/src/net/sourceforge/cobertura/javancss/parser/java15/debug/TokenMgrError.java
deleted file mode 100644
index dd9b456..0000000
--- a/src/net/sourceforge/cobertura/javancss/parser/java15/debug/TokenMgrError.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * This file was taken from JavaNCSS
- * http://www.kclee.com/clemens/java/javancss/
- * Copyright (C) 2000 Chr. Clemens Lee <clemens a.t kclee d.o.t com>
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-
-/*
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING  
- *
- * WARNING TO COBERTURA DEVELOPERS
- *
- * DO NOT MODIFY THIS FILE!
- *
- * MODIFY THE FILES UNDER THE JAVANCSS DIRECTORY LOCATED AT THE ROOT OF THE COBERTURA PROJECT.
- *
- * FOLLOW THE PROCEDURE FOR MERGING THE LATEST JAVANCSS INTO COBERTURA LOCATED AT
- * javancss/coberturaREADME.txt
- *
- * WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   WARNING   
- */
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 4.1 */
-/* JavaCCOptions: */
-package net.sourceforge.cobertura.javancss.parser.java15.debug;
-
-/** Token Manager Error. */
-public class TokenMgrError extends Error
-{
-
-   /*
-    * Ordinals for various reasons why an Error of this type can be thrown.
-    */
-
-   /**
-    * Lexical error occurred.
-    */
-   static final int LEXICAL_ERROR = 0;
-
-   /**
-    * An attempt was made to create a second instance of a static token manager.
-    */
-   static final int STATIC_LEXER_ERROR = 1;
-
-   /**
-    * Tried to change to an invalid lexical state.
-    */
-   static final int INVALID_LEXICAL_STATE = 2;
-
-   /**
-    * Detected (and bailed out of) an infinite loop in the token manager.
-    */
-   static final int LOOP_DETECTED = 3;
-
-   /**
-    * Indicates the reason why the exception is thrown. It will have
-    * one of the above 4 values.
-    */
-   int errorCode;
-
-   /**
-    * Replaces unprintable characters by their escaped (or unicode escaped)
-    * equivalents in the given string
-    */
-   protected static final String addEscapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-   /**
-    * Returns a detailed message for the Error when it is thrown by the
-    * token manager to indicate a lexical error.
-    * Parameters :
-    *    EOFSeen     : indicates if EOF caused the lexical error
-    *    curLexState : lexical state in which this error occurred
-    *    errorLine   : line number when the error occurred
-    *    errorColumn : column number when the error occurred
-    *    errorAfter  : prefix that was seen before this error occurred
-    *    curchar     : the offending character
-    * Note: You can customize the lexical error message by modifying this method.
-    */
-   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-      return("Lexical error at line " +
-           errorLine + ", column " +
-           errorColumn + ".  Encountered: " +
-           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-           "after : \"" + addEscapes(errorAfter) + "\"");
-   }
-
-   /**
-    * You can also modify the body of this method to customize your error messages.
-    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-    * of end-users concern, so you can return something like :
-    *
-    *     "Internal Error : Please file a bug report .... "
-    *
-    * from this method for such cases in the release version of your parser.
-    */
-   public String getMessage() {
-      return super.getMessage();
-   }
-
-   /*
-    * Constructors of various flavors follow.
-    */
-
-   /** No arg constructor. */
-   public TokenMgrError() {
-   }
-
-   /** Constructor with message and reason. */
-   public TokenMgrError(String message, int reason) {
-      super(message);
-      errorCode = reason;
-   }
-
-   /** Full Constructor. */
-   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-   }
-}
-/* JavaCC - OriginalChecksum=e39bf4f5a2252deda5488e6c7380e0fd (do not edit this line) */
diff --git a/src/net/sourceforge/cobertura/merge/Main.java b/src/net/sourceforge/cobertura/merge/Main.java
deleted file mode 100644
index 08ded28..0000000
--- a/src/net/sourceforge/cobertura/merge/Main.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Joakim Erdfelt
- * Copyright (C) 2005 Mark Sinke
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.merge;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.util.CommandLineBuilder;
-import net.sourceforge.cobertura.util.Header;
-
-public class Main
-{
-
-	public Main(String[] args)
-	{
-		File dataFile = CoverageDataFileHandler.getDefaultDataFile();
-		File baseDir = null;
-		List filesToMerge = new ArrayList();
-
-		// Go through all the parameters
-		for (int i = 0; i < args.length; i++)
-		{
-			if (args[i].equals("--datafile"))
-				dataFile = new File(args[++i]);
-			else if (args[i].equals("--basedir"))
-				baseDir = new File(args[++i]);
-			else
-				filesToMerge.add( new File(baseDir, args[i]));
-		}
-
-		// Load coverage data
-		ProjectData projectData = null;
-		if (dataFile.isFile())
-			projectData = CoverageDataFileHandler.loadCoverageData(dataFile);
-		if (projectData == null)
-			projectData = new ProjectData();
-
-		if (filesToMerge.isEmpty())
-		{
-			System.err.println("Error: No files were specified for merging.");
-			System.exit(1);
-		}
-
-		// Merge everything
-		Iterator iter = filesToMerge.iterator();
-		while (iter.hasNext())
-		{
-			File newDataFile = (File)iter.next();
-			ProjectData projectDataNew = CoverageDataFileHandler
-					.loadCoverageData(newDataFile);
-			if (projectDataNew != null)
-				projectData.merge(projectDataNew);
-		}
-
-		// Save the combined data file
-		CoverageDataFileHandler.saveCoverageData(projectData, dataFile);
-	}
-
-	public static void main(String[] args)
-	{
-		Header.print(System.out);
-
-		try {
-			args = CommandLineBuilder.preprocessCommandLineArguments( args);
-		} catch( Exception ex) {
-			System.err.println( "Error: Cannot process arguments: " + ex.getMessage());
-			System.exit(1);
-		}
-		new Main(args);
-	}
-}
diff --git a/src/net/sourceforge/cobertura/reporting/ComplexityCalculator.java b/src/net/sourceforge/cobertura/reporting/ComplexityCalculator.java
deleted file mode 100644
index c34e8c2..0000000
--- a/src/net/sourceforge/cobertura/reporting/ComplexityCalculator.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2008 Tri Bao Ho
- * Copyright (C) 2009 John Lewis
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.reporting;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.PackageData;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.coveragedata.SourceFileData;
-import net.sourceforge.cobertura.javancss.FunctionMetric;
-import net.sourceforge.cobertura.javancss.Javancss;
-import net.sourceforge.cobertura.util.FileFinder;
-import net.sourceforge.cobertura.util.Source;
-
-import org.apache.log4j.Logger;
-
-
-/**
- * Allows complexity computing for source files, packages and a whole project. Average
- * McCabe's number for methods contained in the specified entity is returned. This class
- * depends on FileFinder which is used to map source file names to existing files.
- * 
- * <p>One instance of this class should be used for the same set of source files - an 
- * object of this class can cache computed results.</p>
- * 
- * @author Grzegorz Lukasik
- */
-public class ComplexityCalculator {
- 	private static final Logger logger = Logger.getLogger(ComplexityCalculator.class);
-
-	public static final Complexity ZERO_COMPLEXITY = new Complexity();
-	
-	// Finder used to map source file names to existing files
-	private final FileFinder finder;
-	
-	// Contains pairs (String sourceFileName, Complexity complexity)
-	private Map sourceFileCNNCache = new HashMap();
-
-	// Contains pairs (String packageName, Complexity complexity)
-	private Map packageCNNCache = new HashMap();
-
-	/**
-	 * Creates new calculator. Passed {@link FileFinder} will be used to 
-	 * map source file names to existing files when needed. 
-	 * 
-	 * @param finder {@link FileFinder} that allows to find source files
-	 * @throws NullPointerException if finder is null
-	 */
-	public ComplexityCalculator( FileFinder finder) {
-		if( finder==null)
-			throw new NullPointerException();
-		this.finder = finder;
-	}
-	
- 	/**
-	 * Calculates the code complexity number for an input stream.
-	 * "CCN" stands for "code complexity number."  This is
-	 * sometimes referred to as McCabe's number.  This method
-	 * calculates the average cyclomatic code complexity of all
-	 * methods of all classes in a given directory.  
-	 *
-	 * @param file The input stream for which you want to calculate
-	 *        the complexity
-	 * @return average complexity for the specified input stream 
-	 */
-	private Complexity getAccumlatedCCNForSource(String sourceFileName, Source source) {
-		if (source == null)
-		{
-			return ZERO_COMPLEXITY;
-		}
-		if (!sourceFileName.endsWith(".java"))
-		{
-			return ZERO_COMPLEXITY;
-		}
-		Javancss javancss = new Javancss(source.getInputStream());
-
-		if (javancss.getLastErrorMessage() != null)
-		{
-			//there is an error while parsing the java file. log it
-			logger.warn("JavaNCSS got an error while parsing the java " + source.getOriginDesc() + "\n" 
-						+ javancss.getLastErrorMessage());
-		}
-
-		List methodMetrics = javancss.getFunctionMetrics();
-		int classCcn = 0;
-        for( Iterator method = methodMetrics.iterator(); method.hasNext();)
-        {
-        	FunctionMetric singleMethodMetrics = (FunctionMetric)method.next();
-        	classCcn += singleMethodMetrics.ccn;
-        }
-		
-		return new Complexity( classCcn, methodMetrics.size());
-	}
-
- 	/**
-	 * Calculates the code complexity number for single source file.
-	 * "CCN" stands for "code complexity number."  This is
-	 * sometimes referred to as McCabe's number.  This method
-	 * calculates the average cyclomatic code complexity of all
-	 * methods of all classes in a given directory.  
- 	 * @param sourceFileName 
-	 *
-	 * @param file The source file for which you want to calculate
-	 *        the complexity
-	 * @return average complexity for the specified source file 
- 	 * @throws IOException 
-	 */
-	private Complexity getAccumlatedCCNForSingleFile(String sourceFileName) throws IOException {
-		Source source = finder.getSource(sourceFileName);
-		try
-		{
-	        return getAccumlatedCCNForSource(sourceFileName, source);
-		}
-		finally
-		{
-			if (source != null)
-			{
-				source.close();
-			}
-		}
-	}
-
-	/**
-	 * Computes CCN for all sources contained in the project.
-	 * CCN for whole project is an average CCN for source files.
-	 * All source files for which CCN cannot be computed are ignored.
-	 * 
-	 * @param projectData project to compute CCN for
-	 * @throws NullPointerException if projectData is null
-	 * @return CCN for project or 0 if no source files were found
-	 */
-	public double getCCNForProject( ProjectData projectData) {
-		// Sum complexity for all packages
-		Complexity act = new Complexity();
-		for( Iterator it = projectData.getPackages().iterator(); it.hasNext();) {
-			PackageData packageData = (PackageData)it.next();
-			act.add( getCCNForPackageInternal( packageData));
-		}
-
-		// Return average CCN for source files
-		return act.averageCCN();
-	}
-	
-	/**
-	 * Computes CCN for all sources contained in the specified package.
-	 * All source files that cannot be mapped to existing files are ignored.
-	 * 
-	 * @param packageData package to compute CCN for
-	 * @throws NullPointerException if <code>packageData</code> is <code>null</code>
-	 * @return CCN for the specified package or 0 if no source files were found
-	 */
-	public double getCCNForPackage(PackageData packageData) {
-		return getCCNForPackageInternal(packageData).averageCCN();
-	}
-
-	private Complexity getCCNForPackageInternal(PackageData packageData) {
-		// Return CCN if computed earlier
-		Complexity cachedCCN = (Complexity) packageCNNCache.get( packageData.getName());
-		if( cachedCCN!=null) {
-			return cachedCCN;
-		}
-		
-		// Compute CCN for all source files inside package
-		Complexity act = new Complexity();
-		for( Iterator it = packageData.getSourceFiles().iterator(); it.hasNext();) {
-			SourceFileData sourceData = (SourceFileData)it.next();
-			act.add( getCCNForSourceFileNameInternal( sourceData.getName()));
-		}
-		
-		// Cache result and return it
-		packageCNNCache.put( packageData.getName(), act);
-		return act;
-	}
-
-	
-	/**
-	 * Computes CCN for single source file.
-	 * 
-	 * @param sourceFile source file to compute CCN for
-	 * @throws NullPointerException if <code>sourceFile</code> is <code>null</code>
-	 * @return CCN for the specified source file, 0 if cannot map <code>sourceFile</code> to existing file
-	 */
-	public double getCCNForSourceFile(SourceFileData sourceFile) {
-		return getCCNForSourceFileNameInternal( sourceFile.getName()).averageCCN();
-	}
-
-	private Complexity getCCNForSourceFileNameInternal(String sourceFileName) {
-		// Return CCN if computed earlier
-		Complexity cachedCCN = (Complexity) sourceFileCNNCache.get( sourceFileName);
-		if( cachedCCN!=null) {
-			return cachedCCN;
-		}
-
-	    // Compute CCN and cache it for further use
-		Complexity result = ZERO_COMPLEXITY;
-		try {
-			result = getAccumlatedCCNForSingleFile( sourceFileName );
-		} catch( IOException ex) {
-			logger.info( "Cannot find source file during CCN computation, source=["+sourceFileName+"]");
-		}
-		sourceFileCNNCache.put( sourceFileName, result);
-		return result;
-	}
-
-	/**
-	 * Computes CCN for source file the specified class belongs to.
-	 * 
-	 * @param classData package to compute CCN for
-	 * @return CCN for source file the specified class belongs to
-	 * @throws NullPointerException if <code>classData</code> is <code>null</code>
-	 */
-	public double getCCNForClass(ClassData classData) {
-		return getCCNForSourceFileNameInternal( classData.getSourceFileName()).averageCCN();
-	}
-
-
-	/**
-	 * Represents complexity of source file, package or project. Stores the number of
-	 * methods inside entity and accumlated complexity for these methods.
-	 */
-	private static class Complexity {
-		private double accumlatedCCN;
-		private int methodsNum;
-		public Complexity(double accumlatedCCN, int methodsNum) {
-			this.accumlatedCCN = accumlatedCCN;
-			this.methodsNum = methodsNum;
-		}
-		public Complexity() {
-			this(0,0);
-		}
-		public double averageCCN() {
-			if( methodsNum==0) {
-				return 0;
-			}
-			return accumlatedCCN/methodsNum;
-		}
-		public void add( Complexity second) {
-			accumlatedCCN += second.accumlatedCCN;
-			methodsNum += second.methodsNum;
-		}
-	}
-}
diff --git a/src/net/sourceforge/cobertura/reporting/Main.java b/src/net/sourceforge/cobertura/reporting/Main.java
deleted file mode 100644
index 6c2078e..0000000
--- a/src/net/sourceforge/cobertura/reporting/Main.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2003 jcoverage ltd.
- * Copyright (C) 2005 Mark Doliner
- * Copyright (C) 2005 Jeremy Thomerson
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2006 Dan Godfrey
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.reporting;
-
-import java.io.File;
-
-import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.reporting.html.HTMLReport;
-import net.sourceforge.cobertura.reporting.xml.SummaryXMLReport;
-import net.sourceforge.cobertura.reporting.xml.XMLReport;
-import net.sourceforge.cobertura.util.CommandLineBuilder;
-import net.sourceforge.cobertura.util.FileFinder;
-import net.sourceforge.cobertura.util.Header;
-
-import org.apache.log4j.Logger;
-
-public class Main {
-
-	private static final Logger LOGGER = Logger.getLogger(Main.class);
-
-	private String format = "html";
-	private File dataFile = null;
-	private File destinationDir = null;
-	private String encoding = "UTF-8";
-	
-	private void parseArguments(String[] args) throws Exception {
-		FileFinder finder = new FileFinder();
-		String baseDir = null;
-		for (int i = 0; i < args.length; i++) {
-			if (args[i].equals("--basedir")) {
-				baseDir = args[++i];
-			} else if (args[i].equals("--datafile")) {
-				setDataFile( args[++i]);
-			} else if (args[i].equals("--destination")) {
-				setDestination( args[++i]);
-			} else if (args[i].equals("--format")) {
-				setFormat( args[++i]);
-			} else if (args[i].equals("--encoding")) {
-				setEncoding( args[++i]);
-			} else {
-				if( baseDir==null) {
-					finder.addSourceDirectory( args[i]);
-				} else {
-					finder.addSourceFile( baseDir, args[i]);
-				}
-			}
-		}
-
-		if (dataFile == null)
-			dataFile = CoverageDataFileHandler.getDefaultDataFile();
-
-		if (destinationDir == null)
-		{
-			System.err.println("Error: destination directory must be set");
-			System.exit(1);
-		}
-
-		if (format == null)
-		{
-			System.err.println("Error: format must be set");
-			System.exit(1);
-		}
-		
-		if (LOGGER.isDebugEnabled())
-		{
-			LOGGER.debug("format is " + format + " encoding is " + encoding);
-			LOGGER.debug("dataFile is " + dataFile.getAbsolutePath());
-			LOGGER.debug("destinationDir is "
-					+ destinationDir.getAbsolutePath());
-		}
-
-		ProjectData projectData = CoverageDataFileHandler.loadCoverageData(dataFile);
-
-		if (projectData == null) {
-			System.err.println("Error: Unable to read from data file " + dataFile.getAbsolutePath());
-			System.exit(1);
-		}
-
-		ComplexityCalculator complexity = new ComplexityCalculator(finder);
-		if (format.equalsIgnoreCase("html")) {
-			new HTMLReport(projectData, destinationDir, finder, complexity, encoding);
-		} else if (format.equalsIgnoreCase("xml")) {
-			new XMLReport(projectData, destinationDir, finder, complexity);
-		} else if (format.equalsIgnoreCase("summaryXml")) {
-			new SummaryXMLReport(projectData, destinationDir, finder, complexity);
-		}
-	}
-	
-	private void setFormat(String value) 
-	{
-		format = value;
-		if (!format.equalsIgnoreCase("html") 
-				&& !format.equalsIgnoreCase("xml")
-				&& !format.equalsIgnoreCase("summaryXml")) {
-			System.err.println("" +
-					"Error: format \"" +
-					format + "\" is invalid. Must be either html or xml or summaryXml"
-					);
-			System.exit(1);
-		}
-	}
-
-	private void setDataFile(String value) 
-	{
-		dataFile = new File(value);
-		if (!dataFile.exists())
-		{
-			System.err.println("Error: data file " + dataFile.getAbsolutePath()
-					+ " does not exist");
-			System.exit(1);
-		}
-		if (!dataFile.isFile())
-		{
-			System.err.println("Error: data file " + dataFile.getAbsolutePath()
-					+ " must be a regular file");
-			System.exit(1);
-		}
-	}
-
-	private void setDestination(String value) 
-	{
-		destinationDir = new File(value);
-		if (destinationDir.exists() && !destinationDir.isDirectory())
-		{
-			System.err.println("Error: destination directory " + destinationDir
-					+ " already exists but is not a directory");
-			System.exit(1);
-		}
-		destinationDir.mkdirs();
-	}
-
-	private void setEncoding(String encoding){
-		this.encoding = encoding;
-	}
-	
-	public static void main(String[] args) throws Exception {
-		Header.print(System.out);
-
-		long startTime = System.currentTimeMillis();
-
-		Main main = new Main();
-
-		try {
-			args = CommandLineBuilder.preprocessCommandLineArguments( args);
-		} catch( Exception ex) {
-			System.err.println( "Error: Cannot process arguments: " + ex.getMessage());
-			System.exit(1);
-		}
-		
-		main.parseArguments(args);
-
-		long stopTime = System.currentTimeMillis();
-		System.out.println("Report time: " + (stopTime - startTime) + "ms");
-	}
-
-}
diff --git a/src/net/sourceforge/cobertura/util/ConfigurationUtil.java b/src/net/sourceforge/cobertura/util/ConfigurationUtil.java
deleted file mode 100644
index f24539f..0000000
--- a/src/net/sourceforge/cobertura/util/ConfigurationUtil.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2007 Joakim Erdfelt
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Properties;
-
-/**
- * A Utility Class to load the configuration.
- * 
- * Checks for values using the following hierarchy.
- * 1) System Property matching key.
- * 2) cobertura.properties Resource Property matching key.
- * 3) hardcoded default value
- * 
- * @author Joakim Erdfelt
- */
-public class ConfigurationUtil
-{
-    public static final String RESOURCE = "/cobertura.properties";
-
-    private Properties props;
-
-    public ConfigurationUtil()
-    {
-        init();
-    }
-
-    public void init()
-    {
-        props = new Properties();
-
-        URL url = this.getClass().getResource( RESOURCE );
-        if ( url == null )
-        {
-            DEBUG( "Unable to find configuration resource in classpath of name " + RESOURCE + ", using empty configuration." );
-            return;
-        }
-
-        InputStream is = null;
-        try
-        {
-            is = url.openStream();
-            props.load( is );
-        }
-        catch ( IOException e )
-        {
-            System.err.println( "ERROR: Unable to load configuration resource " + RESOURCE + " - " + e.getMessage() );
-        }
-        finally
-        {
-            IOUtil.closeInputStream( is );
-        }
-    }
-
-    public String getProperty( String key, String defvalue )
-    {
-        String value = System.getProperty( key );
-        if ( value != null )
-        {
-            DEBUG("Using system property value [" + value + "] for key [" + key + "]");
-            return value;
-        }
-
-        value = props.getProperty( key );
-        if ( value != null )
-        {
-            DEBUG("Using cobertura.properties value [" + value + "] for key [" + key + "]");
-            return value;
-        }
-
-        DEBUG("Using default value [" + defvalue + "] for key [" + key + "]");
-        return defvalue;
-    }
-
-    public String getDatafile()
-    {
-        return getProperty( "net.sourceforge.cobertura.datafile", "cobertura.ser" );
-    }
-    
-    /**
-     * Poor mans debugging.
-     * Intentionally didn't use log4j, as we dont want to introduce that dependency on instrumented files.
-     */
-    private void DEBUG(String msg)
-    {
-        if(false)
-        {
-            System.out.println("[Cobertura:ConfigurationUtil] " + msg);
-        }
-    }
-}
diff --git a/test/HelloWorld.java b/test/HelloWorld.java
deleted file mode 100644
index 9c6b739..0000000
--- a/test/HelloWorld.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Mark Doliner
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/**
- * This class is used by the JUnit test for instrumenting
- * a class.  This is just a basic class where we can check
- * that the number of lines and branches is correct.
- *
- * If you change this file you'll need to update the line
- * numbers referenced in net.sourceforge.cobertura.instrument.InstrumentTest
- */
-public class HelloWorld
-{
-
-	private final static String inEnglish = "Hello, world!";
-	private final static String enEspanol = "¡Hola, mundo!";
-	private String useThisOne;
-	private int iterations;
-
-	public HelloWorld(boolean useSpanish, int iterations)
-	{
-		if (useSpanish)
-			useThisOne = enEspanol;
-		else
-			useThisOne = inEnglish;
-
-		try
-		{
-			this.iterations = iterations;
-		}
-		catch (Exception e)
-		{
-			iterations = 1;
-		}
-	}
-
-	public void sayHello()
-	{
-		for (int i = 0; i < iterations; i++)
-		{
-			System.out.println(useThisOne);
-		}
-
-		switch (iterations)
-		{
-			case 0:
-				System.out
-						.println("Why don't you want to greet the world?!?");
-			default:
-				System.out.println("Hello to you too, bub.");
-		}
-	}
-
-	public static void main(String[] args)
-	{
-		HelloWorld helloWorld = new HelloWorld(false, 3);
-		helloWorld.sayHello();
-	}
-}
\ No newline at end of file
diff --git a/test/log4j.xml b/test/log4j.xml
deleted file mode 100644
index 4711c75..0000000
--- a/test/log4j.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
-		<layout class="org.apache.log4j.SimpleLayout"/>
-	</appender>
-
-	<root>
-		<priority value ="debug" />
-		<appender-ref ref="ConsoleAppender"/>
-	</root>
-
-</log4j:configuration>
diff --git a/test/net/sourceforge/cobertura/coveragedata/SwitchDataTest.java b/test/net/sourceforge/cobertura/coveragedata/SwitchDataTest.java
deleted file mode 100644
index bf2bc79..0000000
--- a/test/net/sourceforge/cobertura/coveragedata/SwitchDataTest.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import junit.framework.TestCase;
-
-public class SwitchDataTest extends TestCase
-{
-
-	private final SwitchData a = new SwitchData(0, new int[] { 0, 1, 2, 3 });
-
-	private final SwitchData b = new SwitchData(1, 1, 9);
-
-	public void testEquals()
-	{
-		assertFalse(a.equals(null));
-		assertFalse(a.equals(Integer.valueOf(4)));
-
-		assertTrue(a.equals(a));
-		assertFalse(a.equals(b));
-
-		SwitchData aPrime = new SwitchData(0, new int[] { 0, 1, 2, 3 });
-		assertTrue(a.equals(aPrime));
-	}
-
-	public void testHashCode()
-	{
-		assertEquals(a.hashCode(), a.hashCode());
-
-		SwitchData aPrime = new SwitchData(0, new int[] { 0, 1, 2, 3 });
-		assertEquals(a.hashCode(), aPrime.hashCode());
-	}
-
-	public void testGetSwitchNumber()
-	{
-		assertEquals(0, a.getSwitchNumber());
-		assertEquals(1, b.getSwitchNumber());
-	}
-
-	public void testGetNumbers()
-	{
-		assertEquals(0, a.getBranchCoverageRate(), 0);
-		assertEquals(5, a.getNumberOfValidBranches(), 0);
-		assertEquals(0, a.getNumberOfCoveredBranches(), 0);
-
-		for (int i = 0; i < 5; i++)
-		{
-			a.touchBranch(1,1);
-			assertEquals(0.2, a.getBranchCoverageRate(), 0);
-			assertEquals(5, a.getNumberOfValidBranches(), 0);
-			assertEquals(1, a.getNumberOfCoveredBranches(), 0);
-		}
-
-		a.touchBranch(-1,1);
-		assertEquals(0.4, a.getBranchCoverageRate(), 0);
-		assertEquals(5, a.getNumberOfValidBranches(), 0);
-		assertEquals(2, a.getNumberOfCoveredBranches(), 0);
-
-		a.touchBranch(0,1);
-		assertEquals(0.6, a.getBranchCoverageRate(), 0);
-		assertEquals(5, a.getNumberOfValidBranches(), 0);
-		assertEquals(3, a.getNumberOfCoveredBranches(), 0);
-
-		a.touchBranch(2,1);
-		assertEquals(0.8, a.getBranchCoverageRate(), 0);
-		assertEquals(5, a.getNumberOfValidBranches(), 0);
-		assertEquals(4, a.getNumberOfCoveredBranches(), 0);
-
-		a.touchBranch(3,1);
-		assertEquals(1, a.getBranchCoverageRate(), 0);
-		assertEquals(5, a.getNumberOfValidBranches(), 0);
-		assertEquals(5, a.getNumberOfCoveredBranches(), 0);
-	}
-
-	public void testTouch()
-	{
-		assertEquals(0, a.getHits(0));
-		for (int i = 0; i < 400; i++)
-			a.touchBranch(0,1);
-		assertEquals(400, a.getHits(0));
-
-		assertEquals(0, a.getHits(1));
-		for (int i = 0; i < 4500; i++)
-			a.touchBranch(1,1);
-		assertEquals(4500, a.getHits(1));
-
-		assertEquals(0, a.getHits(2));
-		for (int i = 0; i < 300; i++)
-			a.touchBranch(2,1);
-		assertEquals(300, a.getHits(2));
-
-		assertEquals(0, a.getHits(3));
-		for (int i = 0; i < 800; i++)
-			a.touchBranch(3,1);
-		assertEquals(800, a.getHits(3));
-
-		assertEquals(0, a.getDefaultHits());
-		for (int i = 0; i < 200; i++)
-			a.touchBranch(-1,1);
-		assertEquals(200, a.getDefaultHits());
-	}
-
-	public void testMerge()
-	{
-		a.touchBranch(0,1);
-		a.touchBranch(0,1);
-		a.touchBranch(2,1);
-		a.touchBranch(-1,1);
-		SwitchData x = new SwitchData(0);
-		x.touchBranch(3,1);
-		x.touchBranch(3,1);
-		a.merge(x);
-		assertEquals(2, a.getHits(0));
-		assertEquals(0, a.getHits(1));
-		assertEquals(1, a.getHits(2));
-		assertEquals(2, a.getHits(3));
-		assertEquals(1, a.getDefaultHits());
-
-		x = new SwitchData(0);
-		x.touchBranch(5,1);
-		x.touchBranch(-1,1);
-		a.merge(x);
-		assertEquals(2, a.getHits(0));
-		assertEquals(0, a.getHits(1));
-		assertEquals(1, a.getHits(2));
-		assertEquals(2, a.getHits(3));
-		assertEquals(0, a.getHits(4));
-		assertEquals(1, a.getHits(5));
-		assertEquals(2, a.getDefaultHits());
-	}
-	
-	private static void touchIteratively(SwitchData data, int num)
-	{
-		/*
-		 * When this test fails, it usually does so well before 2000 iterations.   If it
-		 * gets past 2000, it will usually pass, so there is not much need in going much
-		 * past 2000.
-		 */
-		for (int i=0; i<2000; i++)
-		{
-			/*
-			 * The following yield is needed to make sure the other thread gets
-			 * some CPU.  Otherwise, this thread will get too much of a jump ahead
-			 * of the other thread.
-			 */
-			Thread.yield(); 
-			
-			data.touchBranch(i,1);
-		}
-	}
-	
-	private void runTestWithTwoThreads() throws Throwable
-	{
-		final SwitchData data = new SwitchData(2);
-		final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>();
-		
-		ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") {
-			public void uncaughtException(Thread thread, Throwable t)
-			{
-				/*
-				 * Save the Throwable for later use and interrupt this thread so it exits
-				 */
-				possibleThrowable.set(t);
-				thread.interrupt();
-			}
-		};
-		
-		/*
-		 * Create two threads using the above thread group
-		 */
-		Thread thread1 = new Thread(threadGroup, "1") {
-			public void run()
-			{
-				touchIteratively(data, 0);
-			}
-		};
-		Thread thread2 = new Thread(threadGroup, "2") {
-			public void run()
-			{
-				touchIteratively(data, 1);
-			}
-		};
-		thread1.start();
-		thread2.start();
-		/*
-		 * Wait for the threads to exit
-		 */
-		if (thread1.isAlive()) thread1.join();
-		if (thread2.isAlive()) thread2.join();
-		Throwable t = possibleThrowable.get();
-		if (t != null)
-		{
-			throw t;
-		}
-	}
-
-	public void testMultiThreaded() throws Throwable
-	{
-		/*
-		 * This test will often pass with only one iteration.
-		 * It passes once in a while with 4.   It never passes
-		 * with 10 (I hope).
-		 */
-		for (int i=0; i<10; i++)
-		{
-			runTestWithTwoThreads();
-		}
-	}
-}
diff --git a/test/net/sourceforge/cobertura/coveragedata/TouchCollectorTest.java b/test/net/sourceforge/cobertura/coveragedata/TouchCollectorTest.java
deleted file mode 100644
index 617a357..0000000
--- a/test/net/sourceforge/cobertura/coveragedata/TouchCollectorTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2010 John Lewis
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import junit.framework.TestCase;
-
-public class TouchCollectorTest extends TestCase
-{
-	private static void touchIteratively(int num)
-	{
-		for (int i=0; i<2000; i++)
-		{
-			/*
-			 * The following yield is needed to make sure the other thread gets
-			 * some CPU.  Otherwise, this thread will get too much of a jump ahead
-			 * of the other thread.
-			 */
-			Thread.yield(); 
-			
-			TouchCollector.touch(Integer.toString(i),1);
-		}
-	}
-
-	private void runTestWithTwoThreads() throws Throwable
-	{
-		final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>();
-
-		ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") {
-			public void uncaughtException(Thread thread, Throwable t)
-			{
-				/*
-				 * Save the Throwable for later use and interrupt this thread so it exits
-				 */
-				possibleThrowable.set(t);
-				thread.interrupt();
-			}
-		};
-
-		/*
-		 * Create two threads using the above thread group
-		 */
-		Thread thread1 = new Thread(threadGroup, "1") {
-			public void run()
-			{
-				touchIteratively(0);
-			}
-		};
-		Thread thread2 = new Thread(threadGroup, "2") {
-			public void run()
-			{
-				touchIteratively(1);
-			}
-		};
-		thread1.start();
-		thread2.start();
-		/*
-		 * Wait for the threads to exit
-		 */
-		if (thread1.isAlive()) thread1.join();
-		if (thread2.isAlive()) thread2.join();
-		Throwable t = possibleThrowable.get();
-		if (t != null)
-		{
-			throw t;
-		}
-		TouchCollector.applyTouchesOnProjectData(new ProjectData());
-	}
-
-	/**
-	 * Tests the thread safety of the TouchCollector.   Since TouchCollector has all
-	 * static methods, it is difficult to get this test to fail everytime if
-	 * there is a thread problem.
-	 * 
-	 * At the time this test was written, TouchCollector had a problem, but
-	 * this test needed to be run a few times before seeing a failure.   The
-	 * majority of times it would fail though.
-	 */
-	public void testMultiThreaded() throws Throwable
-	{
-		runTestWithTwoThreads();
-	}
-
-}
diff --git a/test/net/sourceforge/cobertura/coveragedata/countermaps/AtomicCounterMapTest.java b/test/net/sourceforge/cobertura/coveragedata/countermaps/AtomicCounterMapTest.java
deleted file mode 100644
index 7ccd23d..0000000
--- a/test/net/sourceforge/cobertura/coveragedata/countermaps/AtomicCounterMapTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2010 Piotr Tabor
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.coveragedata.countermaps;
-
-import java.util.Map;
-
-import junit.framework.Assert;
-
-import org.junit.Test;
-
-
-public class AtomicCounterMapTest {
-	
-	@Test
-	public void incrementTest(){
-		AtomicCounterMap<Integer> map=new AtomicCounterMap<Integer>();
-		for(int i=0; i<1000; i++){
-			for(int j=i; j>=0; j-- ){
-				map.incrementValue(j);				
-			}
-		}
-		Map<Integer,Integer> res=map.getFinalStateAndCleanIt();
-		Assert.assertEquals(1000, res.size());
-		for(Map.Entry<Integer, Integer> ii:res.entrySet()){
-			Assert.assertEquals(1000,ii.getKey()+ii.getValue());
-		}
-		Assert.assertEquals(0, map.getFinalStateAndCleanIt().size());	
-		
-		
-		for(int i=0; i<100; i++){
-			for(int j=i; j>=0; j-- ){
-				map.incrementValue(j,2);				
-				map.incrementValue(j,-1);
-			}
-		}		
-		res=map.getFinalStateAndCleanIt();
-		Assert.assertEquals(100, res.size());
-		for(Map.Entry<Integer, Integer> ii:res.entrySet()){
-			Assert.assertEquals(100,ii.getKey()+ii.getValue());
-		}
-	}
-	
-	//1.347;1.288;1.729;1.287 - counters.putIfAbsent(key, new AtomicInteger(inc)); return ...
-	//1.982;1.965;1.965
-	//1.935;1.944,1.937 - no return
-	//1.923;1.960;1.325;1.951 - final
-	@Test
-	public void performanceTestInit(){
-		AtomicCounterMap<Integer> map=new AtomicCounterMap<Integer>();
-		for(int i=0; i<1000000; i++){
-			map.incrementValue(i);				
-		}
-	}
-	
-	//1.349;1,760;1.363;1.780
-	//0.718;0.678;0,681 AtomicInteger v=counters.get(key);if(v!=null){return v.incrementAndGet();}else{v=counters.putIfAbsent(key, new AtomicInteger(1));return (v!=null)?v.incrementAndGet():1;}
-	//0.679,0.689,0.681 - no return
-	//0.675;0.680,0.710,0.679 - final
-	@Test
-	public void performanceTestOverride(){
-		AtomicCounterMap<Integer> map=new AtomicCounterMap<Integer>();
-		for(int i=0; i<10000000; i++){
-			map.incrementValue(1);				
-		}
-	}
-	
-}
diff --git a/test/net/sourceforge/cobertura/merge/MergeTest.java b/test/net/sourceforge/cobertura/merge/MergeTest.java
deleted file mode 100644
index c9357d1..0000000
--- a/test/net/sourceforge/cobertura/merge/MergeTest.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2006 Jiri Mares
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.merge;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import junit.framework.TestCase;
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.LineData;
-import net.sourceforge.cobertura.coveragedata.PackageData;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.coveragedata.SourceFileData;
-
-/**
- * Tests merge feature by calling directly ProjectData.merge method.
- */
-public class MergeTest extends TestCase {
-	private ClassData firstClass = new ClassData("test.First");
-	private ClassData secondClass = new ClassData("test.Second");
-	private ClassData thirdClass = new ClassData("test.Third");
-	private ClassData firstClassB = new ClassData("test.First");
-	private ClassData fourthClass = new ClassData("test.me.Fourth");
-	private ClassData fifthClass = new ClassData("beautiful.Fourth");
-	private ClassData sixthClass = new ClassData("Fourth");
-	private ClassData seventhClass = new ClassData("Seventh");
-
-	private ProjectData greenProject = new ProjectData();
-	private ProjectData redProject = new ProjectData();
-
-	public void testMergePackages() {
-		greenProject.addClassData( firstClass);
-		greenProject.addClassData( fourthClass);
-		redProject.addClassData( fifthClass);
-		redProject.addClassData( sixthClass);
-		redProject.addClassData( seventhClass);
-		
-		//merge with null - should not change the greenProject
-		greenProject.merge(null);
-		
-		greenProject.merge( redProject);
-		
-		Iterator subpackages = greenProject.getSubPackages( "").iterator();
-		assertEquals( "", ((PackageData)subpackages.next()).getName());
-		assertEquals( "beautiful", ((PackageData)subpackages.next()).getName());
-		assertEquals( "test", ((PackageData)subpackages.next()).getName());
-		assertEquals( "test.me", ((PackageData)subpackages.next()).getName());
-		assertFalse( subpackages.hasNext());
-		
-		assertEquals(5, greenProject.getClasses().size());
-		assertEquals(3, redProject.getClasses().size());
-
-		assertNotNull( greenProject.getClassData("test.First"));
-		assertNotNull( greenProject.getClassData("test.me.Fourth"));
-		assertNotNull( greenProject.getClassData("beautiful.Fourth"));
-		assertNotNull( greenProject.getClassData("Fourth"));
-		assertNotNull( greenProject.getClassData("Seventh"));
-		assertNull( redProject.getClassData( "test.First"));
-		
-		Iterator packages = greenProject.getPackages().iterator();
-		
-		PackageData first = (PackageData) packages.next();
-		assertEquals( "", first.getName());
-		assertEquals( 2, first.getNumberOfChildren());
-		assertNotNull( first.getChild("Fourth"));
-		assertNotNull( first.getChild("Seventh"));
-		
-		PackageData beautiful = (PackageData) packages.next();
-		assertEquals( "beautiful", beautiful.getName());
-		assertEquals( 1, beautiful.getNumberOfChildren());
-		assertNotNull( beautiful.getChild("Fourth"));
-		
-		PackageData test = (PackageData) packages.next();
-		assertEquals( "test", test.getName());
-		assertEquals( 1, test.getNumberOfChildren());
-		assertNotNull( test.getChild("First"));
-		assertNull( test.getChild("test/me/First.java"));
-		assertNull( test.getChild("Fourth.java"));
-		
-		PackageData testMe = (PackageData) packages.next();
-		assertEquals( "test.me", testMe.getName());
-		assertEquals( 1, testMe.getNumberOfChildren());
-		assertNull( testMe.getChild("test/First.java"));
-		assertNotNull( testMe.getChild("Fourth"));
-		assertNull( testMe.getChild("Fourth.java"));
-		
-		assertFalse( packages.hasNext());
-	}
-
-	
-	public void testMergeDifferentClassData() {
-		greenProject.addClassData( firstClass);
-		
-		redProject.addClassData( secondClass);
-		redProject.addClassData( thirdClass);
-		
-		greenProject.merge( redProject);
-		
-		assertEquals( 1, greenProject.getNumberOfChildren());
-		assertEquals( 3, greenProject.getClasses().size());
-		
-		assertNotNull( greenProject.getClassData("test.First"));
-		assertNotNull( greenProject.getClassData("test.Second"));
-		assertNotNull( greenProject.getClassData("test.Third"));
-
-		assertNull( redProject.getClassData("test.First"));
-		assertNotNull( redProject.getClassData("test.Second"));
-		assertNotNull( redProject.getClassData("test.Third"));
-	}
-	
-	public void testMergeSimillarClassData() {
-		greenProject.addClassData( secondClass);
-		greenProject.addClassData( thirdClass);
-		
-		redProject.addClassData( firstClass);
-		redProject.addClassData( thirdClass);
-		
-		greenProject.merge( redProject);
-
-		assertEquals( 1, greenProject.getNumberOfChildren());
-		assertEquals( 3, greenProject.getClasses().size());
-		
-		assertNotNull( greenProject.getClassData("test.First"));
-		assertNotNull( greenProject.getClassData("test.Second"));
-		assertNotNull( greenProject.getClassData("test.Third"));
-
-		assertNotNull( redProject.getClassData("test.First"));
-		assertNull( redProject.getClassData("test.Second"));
-		assertNotNull( redProject.getClassData("test.Third"));
-	}
-
-	public void testMergeDifferentLineNumbers() {
-		firstClass.addLine( 2, "helloWorld","()V");
-		firstClass.addLine( 3, "helloWorld","()V");
-		greenProject.addClassData( firstClass);
-		
-		firstClassB.addLine( 1, "helloWorld","()V");
-		firstClassB.addLine( 5, "helloWorld","()V");
-		redProject.addClassData( firstClassB);
-		
-		greenProject.merge( redProject);
-		
-		ClassData cd = greenProject.getClassData("test.First");
-		assertNotNull( cd);
-		assertEquals( 4, cd.getNumberOfValidLines());
-		assertEquals( 2, redProject.getClassData("test.First").getNumberOfValidLines());
-		
-		Iterator lines = cd.getLines().iterator();
-		LineData line1 = (LineData) lines.next();
-		assertEquals( 1, line1.getLineNumber());
-		LineData line2 = (LineData) lines.next();
-		assertEquals( 2, line2.getLineNumber());
-		LineData line3 = (LineData) lines.next();
-		assertEquals( 3, line3.getLineNumber());
-		LineData line5 = (LineData) lines.next();
-		assertEquals( 5, line5.getLineNumber());
-		assertFalse( lines.hasNext());
-	}
-
-	public void testMergeSimillarLineNumbers() {
-		firstClass.addLine( 2, "helloWorld","()V");
-		firstClass.touch(2,1);
-		firstClass.touch(2,1);
-		firstClass.addLine( 3, "helloWorld","()V");
-		greenProject.addClassData( firstClass);
-		
-		firstClassB.addLine( 2, "helloWorld","()V");
-		firstClassB.touch(2,1);
-		firstClassB.touch(2,1);
-		firstClassB.touch(2,1);
-		firstClassB.addLine( 3, "helloWorld","()V");
-		firstClassB.touch(3,1);
-		firstClassB.addLine( 7, "helloWorld","()V");
-		redProject.addClassData( firstClassB);
-		
-		greenProject.merge( redProject);
-		
-		ClassData cd = greenProject.getClassData("test.First");
-		assertNotNull( cd);
-		assertEquals( 3, cd.getNumberOfValidLines());
-		assertEquals( 3, redProject.getClassData("test.First").getNumberOfValidLines());
-		
-		Iterator lines = cd.getLines().iterator();
-		LineData line2 = (LineData) lines.next();
-		assertEquals( 2, line2.getLineNumber());
-		assertEquals( 5, line2.getHits());
-		LineData line3 = (LineData) lines.next();
-		assertEquals( 3, line3.getLineNumber());
-		assertEquals( 1, line3.getHits());
-		LineData line7 = (LineData) lines.next();
-		assertEquals( 7, line7.getLineNumber());
-		assertEquals( 0, line7.getHits());
-		assertFalse( lines.hasNext());
-	}
-	
-	public void testMergeBranches() {
-		firstClass.addLine( 1, "helloWorld","()V");
-		firstClass.addLineJump(1, 0);
-		firstClass.addLine( 2, "helloWorld","()V");
-		firstClass.addLineJump(2, 0);
-		firstClass.addLineJump(2, 1);
-		firstClass.addLine( 3, "helloWorld","()V");
-		firstClass.addLine( 4, "helloWorld","()V");
-		firstClass.addLineSwitch(4, 0, 0, 2);
-		firstClass.addLine( 5, "helloWorld","()V");
-		firstClass.addLine( 8, "helloWorld","()V");
-		greenProject.addClassData( firstClass);
-		
-		firstClassB.addLine( 1, "helloWorld","()V");
-		firstClassB.addLineJump(1, 0);
-		firstClassB.addLine( 2, "helloWorld","()V");
-		firstClassB.addLine( 3, "helloWorld","()V");
-		firstClassB.addLineSwitch(3, 0, 2, 4);
-		firstClassB.addLine( 6, "helloWorld","()V");
-		firstClassB.addLineJump(6, 0);
-		firstClassB.addLine( 7, "helloWorld","()V");
-		firstClassB.addLine( 8, "helloWorld","()V");
-		redProject.addClassData( firstClassB);
-		
-		greenProject.merge( redProject);
-		
-		ClassData cd = greenProject.getClassData("test.First");
-		
-		Iterator lines = cd.getLines().iterator();
-		
-		LineData line1 = (LineData) lines.next();
-		assertTrue( line1.hasBranch());
-		LineData line2 = (LineData) lines.next();
-		assertTrue( line2.hasBranch());
-		LineData line3 = (LineData) lines.next();
-		assertTrue( line3.hasBranch());
-		LineData line4 = (LineData) lines.next();
-		assertTrue( line4.hasBranch());
-		LineData line5 = (LineData) lines.next();
-		assertFalse( line5.hasBranch());
-		LineData line6 = (LineData) lines.next();
-		assertTrue( line6.hasBranch());
-		LineData line7 = (LineData) lines.next();
-		assertFalse( line7.hasBranch());
-		LineData line8 = (LineData) lines.next();
-		assertFalse( line8.hasBranch());
-		assertFalse( lines.hasNext());
-	}
-	
-	public void testMergeSourceFiles() {
-		greenProject.addClassData( secondClass);
-		greenProject.addClassData( fourthClass);
-		
-		redProject.addClassData( firstClass);
-		redProject.addClassData( fifthClass);
-		redProject.addClassData( seventhClass);
-		
-		greenProject.merge( redProject);
-		
-		Collection sources = greenProject.getSourceFiles();
-		assertEquals( 5, sources.size());
-		
-		Set sourceNames = new HashSet();
-		Iterator it = sources.iterator();
-		while( it.hasNext())
-			sourceNames.add( ((SourceFileData)it.next()).getName());
-		
-		assertTrue( sourceNames.contains("test/First.java"));
-		assertTrue( sourceNames.contains("test/Second.java"));
-		assertTrue( sourceNames.contains("test/me/Fourth.java"));
-		assertTrue( sourceNames.contains("beautiful/Fourth.java"));
-		assertTrue( sourceNames.contains("Seventh.java"));
-	}
-}
diff --git a/test/net/sourceforge/cobertura/reporting/ComplexityCalculator2Test.groovy b/test/net/sourceforge/cobertura/reporting/ComplexityCalculator2Test.groovy
deleted file mode 100644
index 75ca696..0000000
--- a/test/net/sourceforge/cobertura/reporting/ComplexityCalculator2Test.groovy
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2008 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package net.sourceforge.cobertura.reporting
-
-import junit.framework.TestCase
-import net.sourceforge.cobertura.test.util.TestUtil
-import net.sourceforge.cobertura.util.FileFinder
-import net.sourceforge.cobertura.coveragedata.SourceFileData
-import net.sourceforge.cobertura.reporting.ComplexityCalculator
-
-public class ComplexityCalculator2Test extends TestCase {
-	
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	void setUp() throws Exception {
-	}
-	
-	public void testSearchJarsForSourceInJar() {
-		TestUtil.withTempDir { tempDir ->
-		
-			def zipFile = TestUtil.createSourceArchive(tempDir)
-			
-			//create a ComplexityCalculator that will use the archive
-    		def fileFinder = new FileFinder();
-    		fileFinder.addSourceDirectory(zipFile.parentFile.absolutePath);
-    		def complexity = new ComplexityCalculator( fileFinder)
-    	
-        	double ccn1 = complexity.getCCNForSourceFile( new SourceFileData(TestUtil.SIMPLE_SOURCE_PATHNAME));
-        	assertTrue( ccn1==1.0);
-		}
-    }
-	
-	public void testAnnotatedSource() {
-		/*
-		 * Test for bug #2818738.
-		 */
-		TestUtil.withTempDir { tempDir ->
-			def filename = "TBSException.java"
-			def sourceFile = new File(tempDir, filename)
-			sourceFile.write('''
-public class TBSException extends Exception {
-   public TBSException (ErrorHandler handler, Exception wrap) {
-		super(wrap);
-        @SuppressWarnings("unchecked")
-        final Iterator<Exception> iter = handler.getExceptions().iterator();  // LINE 27
-		for (; iter.hasNext();) 
-        {
-			Exception exception = iter.next();
-			this.errors.add(exception.getMessage());
-		}
-	}
-}
-''')
-			//create a ComplexityCalculator that will use the archive
-			def fileFinder = new FileFinder();
-			fileFinder.addSourceDirectory(tempDir.absolutePath);
-			def complexity = new ComplexityCalculator( fileFinder)
-			
-			double ccn1 = complexity.getCCNForSourceFile( new SourceFileData(filename));
-			assertNotNull(ccn1)
-			assertEquals( 2.0, ccn1 as Double, 0.01);
-		}
-	}
-
-	/**
-	 * This test highlights an issue with Javancss.
-	 * 
-	 * http://jira.codehaus.org/browse/JAVANCSS-37
-	 * 
-	 */
-	public void testGenericsProblem() {
-		TestUtil.withTempDir { tempDir ->
-			def filename = "UserAudit.java"
-			def sourceFile = new File(tempDir, filename)
-			sourceFile.write('''
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class UserAudit extends UserAuditParent {
-	void postCopyOnDestination(String str) throws InstantiationException, IllegalAccessException {
-		List<AllowedMMProduct> listToReset = new ArrayList<AllowedMMProduct>();
-		
-		List<AllowedMMProductAudit> auditProducts;
-		auditProducts = this.<AllowedMMProduct,AllowedMMProductAudit>copyListFromParent(AllowedMMProductAudit.class, getMmAuthorisedProducts_());
-	}
-	
-	List<AllowedMMProduct> getMmAuthorisedProducts_() {
-		return null;
-	}
-}
-''')
-			//create a ComplexityCalculator that will use the archive
-			def fileFinder = new FileFinder();
-			fileFinder.addSourceDirectory(tempDir.absolutePath);
-			def complexity = new ComplexityCalculator( fileFinder)
-			
-			double ccn1 = complexity.getCCNForSourceFile( new SourceFileData(filename));
-			assertNotNull(ccn1)
-			assertEquals( "Javancss issue has been fixed: http://jira.codehaus.org/browse/JAVANCSS-37.   Now fix this test.", 0.0/*should be 2.0?*/, ccn1 as Double, 0.01);
-		}
-	}
-
-}
diff --git a/test/net/sourceforge/cobertura/reporting/ComplexityCalculatorTest.java b/test/net/sourceforge/cobertura/reporting/ComplexityCalculatorTest.java
deleted file mode 100644
index 83b3626..0000000
--- a/test/net/sourceforge/cobertura/reporting/ComplexityCalculatorTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- * 
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.reporting;
-
-import net.sourceforge.cobertura.coveragedata.ClassData;
-import net.sourceforge.cobertura.coveragedata.PackageData;
-import net.sourceforge.cobertura.coveragedata.ProjectData;
-import net.sourceforge.cobertura.coveragedata.SourceFileData;
-import net.sourceforge.cobertura.util.FileFinder;
-import net.sourceforge.cobertura.util.FileFixture;
-import junit.framework.TestCase;
-
-public class ComplexityCalculatorTest extends TestCase {
-    private FileFixture fileFixture;
-    private FileFinder fileFinder;
-    private ComplexityCalculator complexity;
-	
-    public void testGetCCNForSourceFile() {
-    	/*
-    	 * Sample1.java has a @Deprecated annotation to make sure the complexity works with annotations.
-    	 */
-    	double ccn1 = complexity.getCCNForSourceFile( new SourceFileData("com/example/Sample1.java"));
-    	assertTrue( ccn1!=0.0);
-    	double ccn2 = complexity.getCCNForSourceFile( new SourceFileData("com/example/Sample2.java"));
-    	assertTrue( ccn2!=0.0);
-    	assertTrue( ccn1!=ccn2);
-
-    	ccn1 = complexity.getCCNForSourceFile( new SourceFileData("com/example/Sample5.java"));
-    	assertTrue( ccn1!=0.0);
-    	ccn2 = complexity.getCCNForSourceFile( new SourceFileData("com/example/Sample6.java"));
-    	assertTrue( ccn2!=0.0);
-    	assertTrue( ccn1!=ccn2);
-
-    	double ccn0 = complexity.getCCNForSourceFile( new SourceFileData("com/example/Sample8.java"));
-    	assertTrue( ccn0==0.0);
-
-    	ccn0 = complexity.getCCNForSourceFile( new SourceFileData("Foo.java"));
-    	assertTrue( ccn0==0.0);
-    }
-
-    public void testGetCCNForClass() {
-    	double ccn1 = complexity.getCCNForClass( new ClassData("com.example.Sample3"));
-    	assertTrue( ccn1!=0.0);
-    	double ccn2 = complexity.getCCNForClass( new ClassData("com.example.Sample4"));
-    	assertTrue( ccn2!=0.0);
-    	assertTrue( ccn1!=ccn2);
-
-    	ccn1 = complexity.getCCNForClass( new ClassData("com.example.Sample5"));
-    	assertTrue( ccn1!=0.0);
-    	ccn2 = complexity.getCCNForClass( new ClassData("com.example.Sample6"));
-    	assertTrue( ccn2!=0.0);
-    	assertTrue( ccn1!=ccn2);
-
-    	double ccn0 = complexity.getCCNForClass( new ClassData("com.example.Sample8"));
-    	assertEquals( 0.0, ccn0, 0.0);
-
-    	ccn0 = complexity.getCCNForClass( new ClassData("Foo"));
-    	assertEquals( 0.0, ccn0, 0.0);
-    }
-
-    public void testGetCCNForPackage() {
-    	PackageData pd = new PackageData("com.example");
-    	pd.addClassData( new ClassData("com.example.Sample3"));
-    	double ccn1 = complexity.getCCNForPackage( pd);
-    	assertTrue( ccn1!=0.0);
-
-    	ComplexityCalculator complexity2 = new ComplexityCalculator( fileFinder);
-    	pd.addClassData( new ClassData("com.example.Sample4"));
-    	double ccn2 = complexity2.getCCNForPackage( pd);
-    	double ccn3 = complexity2.getCCNForPackage( pd);
-    	assertTrue( ccn2!=0.0);
-    	assertTrue( ccn1!=ccn2);
-    	assertEquals( ccn2, ccn3, 0e-9);
-
-    	PackageData empty = new PackageData( "com.example2");
-    	ComplexityCalculator complexity3 = new ComplexityCalculator( fileFinder);
-    	assertEquals( 0.0, complexity3.getCCNForPackage( empty), 0.0);
-    }
-
-    public void testGetCCNForProject() {
-    	ProjectData project = new ProjectData();
-    	project.addClassData( new ClassData("com.example.Sample5"));
-    	double ccn1 = complexity.getCCNForProject( project);
-    	assertTrue( ccn1!=0.0);
-
-    	ComplexityCalculator complexity2 = new ComplexityCalculator( fileFinder);
-    	project.addClassData( new ClassData("com.example.Sample4"));
-    	double ccn2 = complexity2.getCCNForProject( project);
-    	assertTrue( ccn2!=0.0);
-    	assertTrue( ccn1!=ccn2);
-    	
-    	ComplexityCalculator complexity3 = new ComplexityCalculator( fileFinder);
-    	project.addClassData( new ClassData("com.example.Sample8"));
-    	double ccn3 = complexity3.getCCNForProject( project);
-    	assertEquals( ccn2, ccn3, 0e-9);
-
-    	ComplexityCalculator complexity4 = new ComplexityCalculator( fileFinder);
-    	double ccn0 = complexity4.getCCNForProject( new ProjectData());
-    	assertEquals( 0.0, ccn0, 0.0);
-    }
-
-    public void testGetCCNForSourceFile_null() {
-    	try {
-    		complexity.getCCNForSourceFile(null);
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-    }
-    
-    public void testGetCCNForPackage_null() {
-    	try {
-    		complexity.getCCNForPackage(null);
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-    }
-
-   	public void testGetCCNForProject_null() {
-    	try {
-    		complexity.getCCNForProject(null);
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-   	}
-    
-    public void testConstructor_null() {
-    	try {
-    		new ComplexityCalculator(null);
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-    }
-
-   	
-    protected void setUp() throws Exception {
-        super.setUp();
-        fileFixture = new FileFixture();
-        fileFixture.setUp();
-
-        fileFinder = new FileFinder();
-        fileFinder.addSourceDirectory(fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0]).toString());
-        fileFinder.addSourceDirectory(fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[1]).toString());
-        fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(), "com/example\\Sample5.java");
-        fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(), "com/example/Sample6.java");
-        fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(), "com/example/Sample7.java");
-
-        // Do not add com/example/Sample8.java
-        // fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(), "com/example/Sample8.java");
-        
-        complexity = new ComplexityCalculator( fileFinder);
-    }
-
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        fileFixture.tearDown();
-    }
-}
diff --git a/test/net/sourceforge/cobertura/test/util/TestUtil.groovy b/test/net/sourceforge/cobertura/test/util/TestUtil.groovy
deleted file mode 100644
index ce990fc..0000000
--- a/test/net/sourceforge/cobertura/test/util/TestUtil.groovy
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2009 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package net.sourceforge.cobertura.test.util
-
-import junit.framework.Assert
-
-public class TestUtil {
-
-	public static final antBuilder = new AntBuilder()
-	
-	private static File coberturaClassDir
-
-	public static final String SOURCE_TEXT = '''
-		package a.mypackage;
-
-		public class SimpleSource {
-			public void aSimpleMethod() {
-			}
-		}
-		'''
-
-	public static final String SIMPLE_SOURCE_PATHNAME = 'a/mypackage/SimpleSource.java'
-
-	/**
-	 * Usage TestUtil.withTempDir { tempDir -> doSomethingWith(tempDir) }
-	 * 
-	 * Create a directory under the system's temporary directory, and automatically
-	 * delete it before returning from withTempDir.
-	 * 
-	 */
-	public static withTempDir(Closure worker) {
-        File tempDir = new File(System.getProperty("java.io.tmpdir"));
-        File tempSubdir = new File(tempDir, "cobertura_test" + System.currentTimeMillis());
-        Throwable savedThrowable = null
-		try {
-			tempSubdir.mkdirs()
-			//now call the closure passing it the subdir
-			worker(tempSubdir)
-		} catch (Throwable t) {
-			savedThrowable = t
-		} finally {
-			try {
-				antBuilder.delete(dir:tempSubdir, failonerror:false)
-			} catch (Throwable t) {
-				if (savedThrowable) {
-					//something went wrong with the delete, but the savedThrowable is more important
-					t.printStackTrace(System.err)
-					throw savedThrowable
-				} else {
-					throw t
-				}
-			}
-			if (savedThrowable) {
-				throw savedThrowable
-			}
-		}
-	}
-
-	public static createSourceArchive(dir)
-	{
-		/*
-		 * Create a simple source file in the temporary directory
-		 */
-		def sourceDir = new File(dir, "src")
-		def sourceFile = new File(sourceDir, SIMPLE_SOURCE_PATHNAME)
-		sourceFile.parentFile.mkdirs()
-		sourceFile.write(SOURCE_TEXT)
-
-		//create a source zip file with the simple source file
-		def zipDir = new File(dir, "zip")
-		zipDir.mkdirs()
-		def zipFile = new File(zipDir, "source.zip")			
-		antBuilder.zip(destfile:zipFile, basedir:sourceDir)
-		
-		//now delete the source file to make sure we use the zip file
-		Assert.assertTrue(sourceFile.delete())
-
-		return zipFile
-	}
-	
-	public static synchronized getCoberturaClassDir() {
-		if (coberturaClassDir == null)
-		{
-			coberturaClassDir = new File("build/test/cobertura_classes")
-			coberturaClassDir.mkdirs()
-			antBuilder.javac(srcdir:'src', destdir:coberturaClassDir, debug:true, target:"1.5") {
-				classpath {
-					fileset(dir:'lib') {
-						include(name:'**/*.jar')
-					}
-				}
-			}
-		}
-		return coberturaClassDir
-	}
-	
-	private static waitForLiveServer(webContainerHostname, webContainerPort, timeoutMin) {
-		InetSocketAddress address = new InetSocketAddress(webContainerHostname, webContainerPort);
-		
-		antBuilder.echo(message:"Waiting $timeoutMin min for web server...")
-		long beginTime = System.currentTimeMillis();
-		long endTime = System.currentTimeMillis() + (timeoutMin * 60 * 1000); 
-		boolean portOpened = false;
-		while ((!portOpened) && (System.currentTimeMillis() < endTime)) {
-			portOpened = trySocket(address);
-			
-			if (portOpened) {
-				antBuilder.echo("Web server has opened the port in " + (System.currentTimeMillis() - beginTime)/1000.0/60.0 + " min.");
-			} else {
-				try {
-					Thread.sleep(2000);  //2 sec
-				} catch (InterruptedException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		if (!portOpened) {
-			throw new RuntimeException("Timed out waiting for webapp server to initialize");
-		}
-	}
-	
-	/**
-	 * Checks to see if a socket is opened.
-	 */
-	public static boolean trySocket(InetSocketAddress address) {
-		boolean success = false;
-		
-		Socket socket = null
-		try
-		{
-			socket = new Socket()
-			socket.connect(address);
-			success = true;
-		}
-		catch (ConnectException e) {
-			//this is expected
-		}
-		catch (Throwable e) {
-			e.printStackTrace();
-		}
-		finally {
-			if (socket)
-			{
-				socket.close();
-			}
-		}
-		return success;
-	}
-
-	public static getXMLReportDOM(xmlReport)
-	{
-		def parser = new XmlParser()
-		parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false)
-		parser.parse(xmlReport)
-	}
-	
-	public static isMethodHit(dom, methodName)
-	{
-		def methods = dom.packages.'package'.classes.'class'.methods.method
-		def getMethod = methods.grep { it.'@name' == methodName }
-		def hitsPerLine = getMethod.lines.line.'@hits'[0]
-		return (hitsPerLine.any { it.toInteger() >= 1 })
-	}
-	
-	public static getHitCount(dom, className, methodName)
-	{
-		def classes = dom.packages.'package'.classes.'class'
-		def clazz = classes.grep { it.'@name' == className }[0]
-		if (clazz == null)
-		{
-			return 0
-		}
-		def methods = clazz.methods.method
-		def method = methods.grep { it.'@name' == methodName }[0]
-		if (method == null)
-		{
-			return 0
-		}
-		def firstLine = method.lines.line[0]
-		if (firstLine == null)
-		{
-			return 0
-		}
-		def hitCount = firstLine.'@hits'
-		return hitCount.toInteger()
-	}
-	
-	public static getLineCounts(dom, className, methodName)
-	{
-		def classes = dom.packages.'package'.classes.'class'
-		def clazz = classes.grep { it.'@name' == className }[0]
-		if (clazz == null)
-		{
-			return 0
-		}
-		def methods = clazz.methods.method
-		def method = methods.grep { it.'@name' == methodName }[0]
-		if (method == null)
-		{
-			return 0
-		}
-		def lines = method.lines.line.collect {[number:it.'@number', hits:it.'@hits'.toInteger()]}
-		return lines
-	}
-	
-	public static getCoberturaAntBuilder(cobertura)
-	{
-		def ret = new AntBuilder()
-		ret.taskdef(resource:"tasks.properties") {
-			classpath {
-				pathelement(location:cobertura)
-				fileset(dir:'lib') {
-					include(name:"**/*.jar")
-				}
-			}
-		}
-		ret.taskdef(name:'groovyc', classname:'org.codehaus.groovy.ant.Groovyc') {
-			classpath {
-				fileset(dir:'antLibrary/common/groovy') {
-					include(name:'*.groovy')
-				}
-			}
-		}
-		return ret
-	}
-}
diff --git a/test/net/sourceforge/cobertura/test/util/WebappServer.groovy b/test/net/sourceforge/cobertura/test/util/WebappServer.groovy
deleted file mode 100644
index 80fc640..0000000
--- a/test/net/sourceforge/cobertura/test/util/WebappServer.groovy
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2009 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.test.util
-
-import static org.junit.Assert.*
-
-
-public class WebappServer
-{
-	static final SIMPLE_SERVLET_CLASSNAME = "com.acme.servlet.SimpleServlet"
-	
-	static final SIMPLE_SERVLET_TEXT = '''
-		package com.acme.servlet;
-	
-		import javax.servlet.http.HttpServlet;
-		import javax.servlet.http.HttpServletRequest;
-		import javax.servlet.http.HttpServletResponse;
-
-		import java.io.PrintWriter;
-		import java.io.IOException;
-	
-		public class SimpleServlet extends HttpServlet
-		{
-			protected void doGet(HttpServletRequest req, HttpServletResponse response) throws IOException
-			{
-				response.setContentType("text/html;charset=UTF-8");
-				PrintWriter out = response.getWriter();
-				try
-				{
-					out.println("Hi");
-				}
-				finally
-				{
-					if (out != null)
-					{
-						out.close();
-					}
-				}
-			}
-		}
-		'''
-		
-	static final SIMPLE_SERVLET_WEB_XML_TEXT = '''<?xml version="1.0" encoding="UTF-8"?>
-<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-		<servlet>
-			<servlet-name>SimpleServlet</servlet-name>
-			<servlet-class>com.acme.servlet.SimpleServlet</servlet-class>
-	    </servlet>
-	    <servlet-mapping>
-	    	<servlet-name>SimpleServlet</servlet-name>
-	    	<url-pattern>/SimpleServlet</url-pattern>
-	    </servlet-mapping>
-</web-app>
-'''
-
-	private static final ant = TestUtil.antBuilder
-	private static final LOCALHOST = "127.0.0.1"
-	
-	def dir = "."
-	def msecNeededToStop = 10000
-	def coberturaAnt
-	def modifyMainCoberturaDataFile
-	boolean tomcat
-
-	/**
-	 * Copies a web server installation into dir and deploys a webapp to it.
-	 * 
-	 */
-	public deployApp(map)
-	{
-		modifyMainCoberturaDataFile = map.modifyMainCoberturaDataFile
-		
-		def extractedDir = new File(dir, "extracted")
-		def webInfDir = new File(extractedDir, "WEB-INF")
-		def classesDir = new File(webInfDir, "classes")
-		
-		def webInfFile = writeWebInfFile(webInfDir, map.webInfText)
-		
-		compileSourceFiles(map.srcDir, classesDir)
-		
-		copyJettyFiles(dir)
-		
-		def war = makeWarFile(map.appName, webInfFile, classesDir)
-		
-		ant.delete(dir:extractedDir)
-		
-		def coberturaJar = createCoberturaJar()
-
-		coberturaAnt = TestUtil.getCoberturaAntBuilder(TestUtil.getCoberturaClassDir())
-		
-		if (map.instrumentRegEx)
-		{
-			instrumentWar(war, map.instrumentRegEx)
-		}
-		
-		if (map.instrumentCobertura)
-		{
-			instrumentCoberturaJar(coberturaJar)
-		}
-		
-		if (map.deployCoberturaFlush)
-		{
-			deployCoberturaFlush(map.instrumentCobertura)
-		}
-	}
-	
-	private writeWebInfFile(webInfDir, text)
-	{
-		webInfDir.mkdirs()
-		def webInfFile = new File(webInfDir, "web.xml")
-		
-		webInfFile.write(text)
-		return webInfFile
-	}
-	
-	private compileSourceFiles(srcDir, classesDir)
-	{
-		ant.mkdir(dir:classesDir)
-		ant.javac(srcdir:srcDir, destdir:classesDir, debug:'true', target:'1.5') {
-			classpath {
-				fileset(dir:"jetty") {
-					include(name:"**/*.jar")
-				}
-			}
-		}
-	}
-	
-	private copyJettyFiles(todir)
-	{
-		ant.copy(todir:todir) {
-			fileset(dir:"jetty")
-		}
-	}
-	
-	private makeWarFile(appName, webInfFile, classesDir)
-	{
-		def webappsDir = new File(dir, "webapps")
-		def war = new File(webappsDir, "${appName}.war")
-		
-		ant.war(destfile:war, webxml:webInfFile) {
-			classes(dir:classesDir)
-		}
-		return war
-	}
-	
-	private deployCoberturaFlush(instrumentCobertura)
-	{
-		def webappsDir = new File(dir, "webapps")
-		def war = new File(webappsDir, "coberturaFlush.war")
-		
-		/*
-		 * Here we want to make the coberturaFlush war similar to the way
-		 * the production build does it.  So, use the same file.
-		 */
-		GroovyScriptEngine gse = new GroovyScriptEngine(".")
-		Binding binding = new Binding()
-		binding.setVariable("ant", ant)
-		gse.run("buildUtil.groovy", binding)
-		//now call the buildWar closure
-		binding.getVariable("buildWar")(war)
-		
-		
-		if (instrumentCobertura)
-		{
-			instrumentWar(war, "net.sourceforge.cobertura.*")
-		}
-	}
-	
-	private instrumentWar(war, instrumentRegEx)
-	{
-		coberturaAnt.'cobertura-instrument'(datafile:"${dir}/cobertura.ser") {
-			includeClasses(regex:instrumentRegEx)
-			excludeClasses(regex:'.*Test.*')
-			fileset(dir:war.getParent()) {
-				include(name:'*.war')
-			}
-		}
-	}
-	
-	private instrumentCoberturaJar(coberturaJar)
-	{
-		coberturaAnt.'cobertura-instrument'(datafile:"${dir}/cobertura.ser") {
-			includeClasses(regex:"net.sourceforge.cobertura.*")
-			excludeClasses(regex:'.*Test.*')
-			fileset(dir:coberturaJar.getParent()) {
-				include(name:coberturaJar.name)
-			}
-		}
-	}
-
-	/**
-	 * Starts the web server and calls the closure.   The web server will be stopped 
-	 * when the closure exits (successfully or not).
-	 * 
-	 */
-	public withRunningServer(closure)
-	{
-		def freePorts = findFreePorts()
-				
-		startWebServer(freePorts)
-		def data = null
-		try
-		{
-			data = [
-			            xmlReport:new File("${dir}/coverage.xml"),
-			            hostname:LOCALHOST,
-			            webappPort:freePorts.webapp,
-			    		coberturaAnt:coberturaAnt]
-			
-			data.datafile = getDatafileToUse()
-			
-			/*
-			 * add a closure that can be called to flush the cobertura data
-			 */
-			data.flushCobertura = {
-					def webappResponse = (new java.net.URL("http://${data.hostname}:${data.webappPort}/coberturaFlush/flushCobertura")).text
-					assertEquals("Response of coberturaFlush unexpected", "", webappResponse.trim())
-			}
-		
-			TestUtil.waitForLiveServer(data.hostname, data.webappPort, 1)  //1 min timeout
-			closure.call(data)
-		}
-		finally
-		{
-			stopWebServer(freePorts.stop)
-		}
-		
-		/*
-		 * Wait a bit for the server to stop completely
-		 */
-		Thread.sleep(msecNeededToStop)
-		coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-		def dom = TestUtil.getXMLReportDOM(data.xmlReport)
-		data.dom = dom
-		return data
-	}
-	
-	private getDatafileToUse()
-	{
-		def datafile = new File("${dir}/cobertura.ser")
-		
-		if (modifyMainCoberturaDataFile)
-		{
-			/*
-			 * modify the cobertura.ser file created by the instrumentation target
-			 * of the main build.xml file.   That way, the counts
-			 * will end up in the overall coverage report
-			 */
-			def tempfile = new File("build/cobertura.ser")
-			if (tempfile.exists())
-			{
-				datafile = tempfile
-			}
-			else
-			{
-				/*
-				 * It looks like the main build.xml's instrument target has not been run.
-				 * So, a coverage report is not being generated.
-				 */
-			}
-		}
-		return datafile
-	}
-	
-	/**
-	 * Find two port numbers that can be used to start a webapp server (one port for
-	 * http connections; one port for a stop command).
-	 */
-	private findFreePorts()
-	{
-		def freePorts = [webapp:null, stop:null]
-		
-		def webappSocket = null
-		def stopSocket = null
-		
-		try
-		{
-			webappSocket = new ServerSocket(0, 1, null)
-			stopSocket = new ServerSocket(0, 1, null)
-			
-			freePorts.webapp = webappSocket.getLocalPort()
-		
-			freePorts.stop = stopSocket.getLocalPort()
-		}
-		finally 
-		{
-			closeSocket(webappSocket)
-			closeSocket(stopSocket)
-		}
-		return freePorts
-	}
-	
-	private closeSocket(socket)
-	{
-		try
-		{
-			if (socket) {
-				socket.close()
-			}
-		}
-		catch (Throwable t)
-		{
-			t.printStackTrace(System.err)
-		}
-	}
-	
-	private startWebServer(freePorts)
-	{
-		ant.echo(message:"Starting Jetty webapp server on ${freePorts.webapp}")
-		ant.java(jar:"${dir}/start.jar", dir:dir, fork:true, spawn:true) {
-			sysproperty(key:'jetty.port', value:freePorts.webapp)
-			sysproperty(key:'STOP.PORT', value:freePorts.stop)
-			sysproperty(key:'STOP.KEY', value:'cobertura')
-			
-			// fool Cobertura into thinking it is running in Tomcat
-			if (tomcat) {
-				sysproperty(key:'catalina.home', value:dir.absolutePath)
-			}
-			if (modifyMainCoberturaDataFile)
-			{
-				sysproperty(key:'net.sourceforge.cobertura.datafile', value:getDatafileToUse().getAbsolutePath())
-			}
-		}
-	}
-	
-	private stopWebServer(stopPort)
-	{
-		ant.java(jar:"${dir}/start.jar", dir:dir, fork:true) {
-			arg(value:'--stop')
-			sysproperty(key:'STOP.PORT', value:stopPort)
-			sysproperty(key:'STOP.KEY', value:'cobertura')
-		}
-	}
-	
-	private createCoberturaJar()
-	{
-		def coberturaJar = new File(dir, "lib/cobertura.jar")
-		def coberturaClassDir = TestUtil.getCoberturaClassDir()
-		ant.zip(destfile:coberturaJar) {
-			fileset(dir:coberturaClassDir)
-		}
-		return coberturaJar
-	}
-	
-	public static writeSimpleServletSource(srcDir)
-	{
-		def servletSourceFile = new File(srcDir, "com/acme/servlet/SimpleServlet.java")
-		servletSourceFile.parentFile.mkdirs()
-		
-		servletSourceFile.write(SIMPLE_SERVLET_TEXT)
-	}
-}
diff --git a/test/net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.groovy b/test/net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.groovy
deleted file mode 100644
index 1739f4a..0000000
--- a/test/net/sourceforge/cobertura/thread/test/MultipleClassloaderFunctionalTest.groovy
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2009 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.thread.test
-
-import net.sourceforge.cobertura.test.util.TestUtil
-
-import org.junit.Before
-import org.junit.Test
-
-import static org.junit.Assert.*
-
-public class MultipleClassloaderFunctionalTest {
-	
-	/*
-	 * This tests the case where there are multiple classloaders that each
-	 * load the Cobertura classes.   Cobertura uses static fields to
-	 * hold the data.   When there are multiple classloaders, each classloader
-	 * will keep track of the line counts for the classes that it loads.  
-	 * 
-	 * The static initializers for the Cobertura classes are also called for
-	 * each classloader.   So, there is one shutdown hook for each classloader.
-	 * So, when the JVM exits, each shutdown hook will try to write the
-	 * data it has kept to the datafile.   They will do this at the same
-	 * time.   Before Java 6, this seemed to work fine, but with Java 6, there
-	 * seems to have been a change with how file locks are implemented.   So,
-	 * care has to be taken to make sure only one thread locks a file at a time.
-	 * 
-	 */
-
-	def ant = TestUtil.getCoberturaAntBuilder(TestUtil.getCoberturaClassDir())
-
-	private static CALLED_CODE = """
-package mypackage;
-
-public class Called {
-	public static void callThis()
-	{
-	}
-}
-"""
-
-	@Before
-	void setUp() {
-	}
-	
-	@Test
-	void multipleClassloadersTest() {
-		ant.echo(message:"Running multiple classloader test.")
-		runTest()
-	}
-	
-	/*
-	 * This code creates a Java class that has a main method that will create two
-	 * classloaders.   Each classloader will then load the mypackage.Called class
-	 * defined above.  Then, the mypackage.Called.callThis() method is called once.
-	 */
-	def getMainCode(instrumentDir) {
-		return """
-package mypackage;
-
-import java.net.URLClassLoader;
-import java.net.URL;
-import java.io.File;
-import java.lang.reflect.Method;
-
-public class Main {
-	public static void main(String[] args) throws Throwable
-	{
-		createClassloaderAndCallMethod();
-		createClassloaderAndCallMethod();
-	}
-
-	/*
-	 * Create a classloader that loads the instrumented code and the cobertura classes.
-	 * Then, call the mypackage.Called.callThis() static method.
-	 */
-	public static void createClassloaderAndCallMethod() throws Throwable
-	{
-		File instrumentDir = new File("${instrumentDir.absolutePath.replace('\\', '\\\\')}");
-		File coberturaClassDir = new File("${TestUtil.getCoberturaClassDir().absolutePath.replace('\\', '\\\\')}");
-
-		/*
-		 * Create a classloader with a null parent classloader to ensure that this
-		 * classloader loads the Cobertura classes itself.
-		 */
-        URLClassLoader loader = new URLClassLoader(
-        		new URL[] {instrumentDir.toURL(), coberturaClassDir.toURL()}, null);
-
-		// use reflection to call mypackage.Called.callThis() once.
-        Class calledClass = loader.loadClass("mypackage.Called");
-        Method method = calledClass.getMethod("callThis", null);
-
-        method.invoke(null, null);
-	}
-}
-"""
-	}
-
-	private void runTest()
-	{
-		/*
-		 * Use a temporary directory and create a Main.java source file
-		 * that creates multiple classloaders.   Also, create a Called.java
-		 * file that defines the mypackage.Called.callThis() method that
-		 * will be called by mypackage.Main.main().
-		 */
-		TestUtil.withTempDir { tempDir ->
-			def srcDir = new File(tempDir, "src")
-			def instrumentDir = new File(tempDir, "instrument")
-			
-			def mainSourceFile = new File(srcDir, "mypackage/Main.java")
-			def datafile = new File(srcDir, "cobertura.ser")
-			mainSourceFile.parentFile.mkdirs()
-			
-			mainSourceFile.write(getMainCode(instrumentDir))
-			
-			def calledSourceFile = new File(srcDir, "mypackage/Called.java")
-			calledSourceFile.write(CALLED_CODE)
-			
-			compileSource(srcDir)
-			
-			instrumentClasses(srcDir, datafile, instrumentDir)
-			
-			/*
-			 * Kick off the Main class.   I'll use the non-instrumented classes, but
-			 * I think you could use the instrumented ones as well.
-			 */
-			ant.java(classname:'mypackage.Main', dir:srcDir, fork:true, failonerror:true) {
-				classpath {
-					dirset(dir:srcDir)
-				}
-			}
-
-			/*
-			 * Now create a cobertura xml file and make sure the correct counts are in it.
-			 */
-			ant.'cobertura-report'(datafile:datafile, format:'xml', destdir:srcDir)
-			def dom = TestUtil.getXMLReportDOM("${srcDir}/coverage.xml")
-				
-			def lines = TestUtil.getLineCounts(dom, 'mypackage.Called', 'callThis')
-			
-			// the callThis() method is empty, so the only line is the ending brace.
-			assertEquals(1, lines.size())
-			lines.each {
-				// The callThis() method is called once for each classloader.
-				// There are 2 classloaders.
-				assertEquals("hit count incorrect", 2, it.hits)
-			}	
-		}
-	}
-	
-	def compileSource(srcDir)
-	{
-		ant.groovyc(srcdir:srcDir, destDir:srcDir) {
-			javac(debug:'true')
-		}
-	}
-	
-	def instrumentClasses(srcDir, datafile, todir)
-	{
-		ant.'cobertura-instrument'(datafile:datafile, todir:todir) {
-			includeClasses(regex:'mypackage.*')
-			fileset(dir:srcDir) {
-				include(name:'**/*.class')
-			}
-		}
-	}
-}
diff --git a/test/net/sourceforge/cobertura/thread/test/ThreadedFunctionalTest.groovy b/test/net/sourceforge/cobertura/thread/test/ThreadedFunctionalTest.groovy
deleted file mode 100644
index 4ef633f..0000000
--- a/test/net/sourceforge/cobertura/thread/test/ThreadedFunctionalTest.groovy
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2009 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.thread.test
-
-import net.sourceforge.cobertura.test.util.TestUtil
-
-import org.junit.Before
-import org.junit.Test
-
-import static org.junit.Assert.*
-
-public class ThreadedFunctionalTest {
-	
-	/*
-	 * This tests the thread safety of Cobertura.
-	 * 
-	 * Multiple threads are kicked off that will execute the same switch or
-	 * if statement.   The switch statement would like like this:
-	 * 
-	 * switch(counter)
-	 * {
-	 *    case 0: counter++; break;
-	 *    case 1: counter++; break;
-	 *    etc.
-	 *    default: counter = 0;
-	 * }
-	 * The if statement looks like this:
-	 * if (counter==0||counter==1||counter==2 ... )
-	 * {
-	 *    counter++;
-	 * }
-	 * 
-	 * Notice that the counter is incremented so the cases or conditionals are
-	 * hit in order with each call.
-	 * 
-	 * Multiple threads will process the switch or if statement at the same time.
-	 * Since the case and conditional information is handled with arrays that grow 
-	 * dynamically larger as each case or conditional is hit, you will get index 
-	 * out of bounds exceptions if Cobertura is not thread safe.   One thread
-	 * will increase the array while another is trying to do the same.  Only one
-	 * thread's change is saved, and the other thread is likely to throw an
-	 * out of bounds exception.
-	 */
-
-	def ant = TestUtil.getCoberturaAntBuilder(TestUtil.getCoberturaClassDir())
-
-	static numberOfCalls = 300 //this number can't be too high or you will get a stack overflow (due to the inject below)
-	static numberOfThreads = 2
-	static numberOfRetries = 10
-	
-	def branchOrSwitchCode
-	
-	/*
-	 * A big switch statement with number of cases equal to numberOfCalls:
-	 * 
-	 * switch(counter)
-	 * {
-	 *    case 0: counter++; break;
-	 *    case 1: counter++; break;
-	 *    etc.
-	 *    default: counter = 0;
-	 * }
-	 */
-	static SWITCH_CODE = """
-			switch(counter)
-			{
-				${(0..numberOfCalls).inject('') { cases, num -> "${cases}\ncase ${num}: counter++; break;"}}
-				default: counter = 0;
-			}
-"""
-
-	/*
-	 * A big if statement with number of conditionals equal to numberOfCalls:
-	 * 
-	 * if (counter==0||counter==1||counter==2 ... )
-	 * {
-	 *    counter++;
-	 * }
-	 */
-	static IF_STATEMENT_CODE = """
-			if (${(1..numberOfCalls).inject('counter==0') { conditionals, num -> "${conditionals}||counter==${num}"}})
-			{
-				counter++;
-			}
-"""
-
-	def getThreadedCode(branchOrSwitchCode)
-	{
-		/*
-		 * This code will kick off a number of threads equal to numberOfThreads.
-		 * Each thread will do a number of calls equal to numberOfCalls.
-		 * Each call will be a call to the method acall().   The body of this
-		 * method is passed in as branchOrSwithcCode and is either a switch
-		 * statement with a large number of cases or an if statement with
-		 * a large number of conditionals.
-		 */
-		return """
-package mypackage;
-
-import java.util.ArrayList;
-
-class MyThreads extends Thread
-{
-		int counter = 0;
-
-		void acall()
-		{
-			${branchOrSwitchCode}
-		}
-
-		public void run()
-		{
-			try
-			{
-				for (int i=0; i<${numberOfCalls}; i++)
-				{
-					yield();
-					acall();
-				}
-			}
-			catch (Throwable t)
-			{
-				t.printStackTrace();
-				System.exit(1);
-			}
-		}
-
-		public static void main(String[] args)
-		{
-			ArrayList threads = new ArrayList();
-			for (int i=0; i<${numberOfThreads}; i++)
-			{
-				threads.add(new MyThreads());
-			}
-			for (int i=0; i<${numberOfThreads}; i++)
-			{
-				((Thread) threads.get(i)).start();
-			}
-		}
-}
-"""
-	}
-
-	@Before
-	void setUp() {
-	}
-	
-	@Test
-	void simpleThreadTest() {
-		ant.echo(message:"Running threaded test with switch statement.")
-		runTest(SWITCH_CODE)
-	}
-		
-	@Test
-	void simpleThreadTestWithIfStatement() {
-		ant.echo(message:"Running threaded test with if statement.")
-		runTest(IF_STATEMENT_CODE)
-	}
-
-	private void runTest(code)
-	{
-		/*
-		 * Use a temporary directory and create a MyThreads.java source file
-		 * that creates multiple threads which do repetitive calls into
-		 * a method.   The method contains either a switch with a large number
-		 * of cases or an if statement with a large number of conditionals depending
-		 * on the code passed into this method.
-		 */
-		TestUtil.withTempDir { tempDir ->
-			def srcDir = new File(tempDir, "src")
-			
-			def sourceFile = new File(srcDir, "mypackage/MyThreads.java")
-			def datafile = new File(srcDir, "cobertura.ser")
-			sourceFile.parentFile.mkdirs()
-			
-			sourceFile.write(getThreadedCode(code))
-			
-			compileSource(srcDir)
-			
-			instrumentClasses(srcDir, datafile)
-			
-			/*
-			 * This test does not seem to fail all the time, so we will need to try several times.
-			 */
-			numberOfRetries.times { index ->
-				ant.echo(message:"Try $index")
-				ant.java(classname:'mypackage.MyThreads', dir:srcDir, fork:true, failonerror:true) {
-					classpath {
-						dirset(dir:srcDir)
-						fileset(dir:'antLibrary/common/groovy') {
-							include(name:'*.jar')
-						}
-						dirset(dir:TestUtil.getCoberturaClassDir())
-					}
-				}
-			}
-					
-			ant.'cobertura-report'(datafile:datafile, format:'xml', destdir:srcDir)
-			def dom = TestUtil.getXMLReportDOM("${srcDir}/coverage.xml")
-				
-			def hitCount = TestUtil.getHitCount(dom, 'mypackage.MyThreads', 'acall')
-			
-			assertEquals("hit count incorrect", numberOfRetries * numberOfThreads * numberOfCalls, hitCount)
-		}
-	}
-	
-	def compileSource(srcDir)
-	{
-		ant.groovyc(srcdir:srcDir, destDir:srcDir) {
-			javac(debug:'true')
-		}
-	}
-	
-	def instrumentClasses(srcDir, datafile)
-	{
-		ant.'cobertura-instrument'(datafile:datafile) {
-			includeClasses(regex:'mypackage.*')
-			fileset(dir:srcDir) {
-				include(name:'**/*.class')
-			}
-		}
-	}
-}
diff --git a/test/net/sourceforge/cobertura/util/CommandLineBuilderTest.java b/test/net/sourceforge/cobertura/util/CommandLineBuilderTest.java
deleted file mode 100644
index c504e24..0000000
--- a/test/net/sourceforge/cobertura/util/CommandLineBuilderTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 Grzegorz Lukasik
- *
- * Note: This file is dual licensed under the GPL and the Apache
- * Source License (so that it can be used from both the main
- * Cobertura classes and the ant tasks).
- *
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-package net.sourceforge.cobertura.util;
-
-import java.io.File;
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-/**
- * @author Grzegorz Lukasik
- */
-public class CommandLineBuilderTest extends TestCase {
-
-	private String[] testArguments( String[] args) throws Exception {
-		CommandLineBuilder builder = new CommandLineBuilder();
-		for( int i=0; i<args.length; i++)
-			builder.addArg( args[i]);
-		builder.saveArgs();
-		
-		File cmdFile = new File(builder.getCommandLineFile());
-		assertTrue( cmdFile.isAbsolute());
-		assertTrue( cmdFile.isFile());
-		
-		String[] result = 
-		CommandLineBuilder.preprocessCommandLineArguments(
-				new String[] { "--commandsfile", builder.getCommandLineFile()});
-		builder.dispose();
-		
-		return result;
-	}
-	
-	public void testExample() throws Exception {
-		CommandLineBuilder builder = new CommandLineBuilder();
-		builder.addArg("--someoption");
-		builder.addArg("optionValue");
-		builder.saveArgs();
-		
-		String[] args = 
-		CommandLineBuilder.preprocessCommandLineArguments(
-				new String[] { "--commandsfile", builder.getCommandLineFile()});
-
-		assertEquals( "--someoption", args[0]);
-		assertEquals( "optionValue", args[1]);
-		
-		builder.dispose();
-	}
-
-	public void testExample_2() throws Exception {
-		CommandLineBuilder builder = new CommandLineBuilder();
-		builder.addArg("--someoption", "optionValue");
-		builder.saveArgs();
-		
-		String[] args = 
-		CommandLineBuilder.preprocessCommandLineArguments(
-				new String[] { "--commandsfile", builder.getCommandLineFile()});
-
-		assertEquals( "--someoption", args[0]);
-		assertEquals( "optionValue", args[1]);
-		
-		builder.dispose();
-	}
-	
-	private void assertEquals(String[] first, String[] second)
-	{
-		assertEquals(first.length, second.length);
-		for (int i = 0; i < first.length; i++)
-		{
-			assertEquals(first[i], second[i]);
-		}
-	}
-
-	public void testManyOptions() throws Exception {
-		String[] options = new String[100000];
-		for( int i=0; i<options.length; i++) {
-			options[i] = "myOption" + i;
-		}
-
-		String[] args = testArguments( options);
-		assertEquals( options, args);
-	}
-
-	public void testVariousOptions() throws Exception {
-		String[] options = { "hello", " one", "two ", "  three , ", "\"'xx", " ", "file .java", "f.java",
-				"#@()39340*(@0$#&%^@#&4098353856_*(_ at 735/896_udsknbfdvzxvkasd DSFWBXfqw']][.,=---3\\]];",
-				"null", "!@#$%^&*()_+-={}|[]\\:\";'<>?,./'"
-		};
-		String[] args = testArguments( options);
-		assertEquals( options, args);
-	}
-
-	public void testEmptyOptions() throws Exception {
-		String[] args = testArguments( new String[0]);
-		assertEquals( new String[0], args);
-	}
-
-	public void testInvalidArguments() throws Exception {
-		CommandLineBuilder builder = new CommandLineBuilder();
-		try {
-			builder.addArg(null);
-			fail( "NullPointerException expected");
-		} catch( NullPointerException ex) {}
-		try {
-			builder.addArg( "someArgument", null);
-			fail( "NullPointerException expected");
-		} catch( NullPointerException ex) {}
-		try {
-			builder.addArg( null, "someValue");
-			fail( "NullPointerException expected");
-		} catch( NullPointerException ex) {}
-		try {
-			CommandLineBuilder.preprocessCommandLineArguments(null);
-			fail( "NullPointerException expected");
-		} catch( NullPointerException ex) {}
-
-		try {
-			CommandLineBuilder.preprocessCommandLineArguments(new String[] { "Hello", null });
-			fail( "NullPointerException expected");
-		} catch( NullPointerException ex) {}
-
-		try {
-			CommandLineBuilder.preprocessCommandLineArguments(new String[] { "--commandsfile", "hello", null });
-			fail( "NullPointerException expected");
-		} catch( NullPointerException ex) {}
-	}
-
-	public void testCommandsFileOption() throws Exception {
-		String[] args = { "Hello", "world" };
-		String[] result = CommandLineBuilder.preprocessCommandLineArguments( args);
-		assertSame( args, result);
-		
-		try {
-			args = new String[]{ "Hello", "--commandsfile" };
-			CommandLineBuilder.preprocessCommandLineArguments( args);
-			fail( "IllegalArgumentException expected");
-		} catch( IllegalArgumentException ex) {}
-
-		try {
-			args = new String[]{ "Hello", "--commandsfile", "hello.cmd" };
-			CommandLineBuilder.preprocessCommandLineArguments( args);
-			fail( "IO Exception expected");
-		} catch( IOException ex) {}
-	}
-	
-}
diff --git a/test/net/sourceforge/cobertura/util/FileFinderTest.java b/test/net/sourceforge/cobertura/util/FileFinderTest.java
deleted file mode 100644
index 7b8a5b8..0000000
--- a/test/net/sourceforge/cobertura/util/FileFinderTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 James Seigel
- * Copyright (C) 2005 Grzegorz Lukasik
- * 
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.File;
-import java.io.IOException;
-
-import junit.framework.*;
-
-public class FileFinderTest extends TestCase {
-    private FileFinder fileFinder;
-    private FileFixture fileFixture;
-
-    public void testGetSourceDirectoryList() {
-        assertEquals(4, fileFinder.getSourceDirectoryList().size());
-        assertTrue(new FileFinder().getSourceDirectoryList().isEmpty());
-        
-        FileFinder ff = new FileFinder();
-        ff.addSourceDirectory( FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0]);
-        assertEquals( 1, ff.getSourceDirectoryList().size());
-        ff.addSourceDirectory( FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]);
-        assertEquals( 2, ff.getSourceDirectoryList().size());
-        
-        ff = new FileFinder();
-        ff.addSourceFile( FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0], "com/example/Sample1.java");
-        ff.addSourceFile( FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0], "com/example/Sample2.java");
-        assertEquals( 1, ff.getSourceDirectoryList().size());
-        ff.addSourceFile( FileFixture.SOURCE_DIRECTORY_IDENTIFIER[1], "com/example/Sample3.java");
-        assertEquals( 2, ff.getSourceDirectoryList().size());
-        ff.addSourceDirectory( FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]);
-        assertEquals( 3, ff.getSourceDirectoryList().size());
-    }
-
-    private void checkFile( String fileName, String baseName, int sourceNum) throws IOException {
-    	File file = fileFinder.getFileForSource( fileName);
-    	assertTrue( file.getAbsolutePath(), file.getAbsolutePath().indexOf(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[sourceNum])!=-1);
-    	assertTrue( baseName.equals( file.getName()));
-    	assertTrue( file.exists());
-    	assertTrue( file.isFile());
-    }
-    
-    public void testFindFile() throws IOException {
-    	checkFile("com/example/Sample1.java", "Sample1.java", 0);
-    	checkFile("com\\example\\Sample2.java", "Sample2.java", 0);
-    	checkFile("com/example\\Sample3.java", "Sample3.java", 1);
-    	checkFile("com/example/Sample4.java", "Sample4.java", 1);
-    	checkFile("com/example/Sample5.java", "Sample5.java", 2);
-    	checkFile("com/example/Sample6.java", "Sample6.java", 2);
-    	checkFile("com\\example/Sample7.java", "Sample7.java", 3);
-    }
-
-    public void testFindFile_NotFound() {
-    	try {
-    		fileFinder.getFileForSource("com/example/Sample19.java");
-    		fail( "IOException expected");
-    	} catch( IOException ex) {}
-    	try {
-    		fileFinder.getFileForSource("com/example/Sample1.jav");
-    		fail( "IOException expected");
-    	} catch( IOException ex) {}
-    	try {
-    		fileFinder.getFileForSource("com/example/Sample7.java2");
-    		fail( "IOException expected");
-    	} catch( IOException ex) {}
-    	try {
-    		fileFinder.getFileForSource("Sample3.java");
-    		fail( "IOException expected");
-    	} catch( IOException ex) {}
-    	try {
-    		// This file exist, but is not added to fileFinder
-    		fileFinder.getFileForSource("com/example/Sample8.java");
-    		fail( "IOException expected");
-    	} catch( IOException ex) {}
-    }
-
-    public void testFindFile_null() throws IOException {
-    	try {
-    		fileFinder.getFileForSource(null);
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-    }
-
-    public void testAddSourceDirectory_null() {
-    	try {
-    		fileFinder.addSourceDirectory(null);
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-    }
-    
-    public void testAddSourceFile_null() {
-    	try {
-    		fileFinder.addSourceFile(null,"com/example/Sample1.java");
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-    	try {
-    		fileFinder.addSourceFile( FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0], null);
-    		fail( "NullPointerException expected");
-    	} catch( NullPointerException ex) {}
-    }
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        fileFixture = new FileFixture();
-        fileFixture.setUp();
-
-        fileFinder = new FileFinder();
-        fileFinder.addSourceDirectory(fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[0]).toString());
-        fileFinder.addSourceDirectory(fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[1]).toString());
-        fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(), "com/example\\Sample5.java");
-        fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[2]).toString(), "com/example/Sample6.java");
-        fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(), "com/example/Sample7.java");
-
-        // Do not add com/example/Sample8.java
-        // fileFinder.addSourceFile( fileFixture.sourceDirectory(FileFixture.SOURCE_DIRECTORY_IDENTIFIER[3]).toString(), "com/example/Sample8.java");
-    }
-
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        fileFixture.tearDown();
-    }
-
-}
diff --git a/test/net/sourceforge/cobertura/util/FileFixture.java b/test/net/sourceforge/cobertura/util/FileFixture.java
deleted file mode 100644
index affe863..0000000
--- a/test/net/sourceforge/cobertura/util/FileFixture.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Cobertura - http://cobertura.sourceforge.net/
- *
- * Copyright (C) 2005 James Seigel
- * Copyright (C) 2005 Grzegorz Lukasik
- * Copyright (C) 2008 John Lewis
- * 
- * Cobertura 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 2 of the License,
- * or (at your option) any later version.
- *
- * Cobertura 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 Cobertura; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-package net.sourceforge.cobertura.util;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.HashMap;
-
-// Creates structre:
-//  src0/
-//    com/
-//      example/
-//        Sample1.java (contains a @Deprecated annotation to make sure the complexity works with annotations)
-//        Sample2.java
-//  src1/
-//    com/
-//      example/
-//        Sample3.java
-//        Sample4.java
-//  src2/
-//    com/
-//      example/
-//        Sample5.java
-//        Sample6.java
-//  src3/
-//    com/
-//      example/
-//        Sample7.java
-//        Sample8.java
-public class FileFixture {
-    public static final String[] SOURCE_DIRECTORY_IDENTIFIER = { "src0", "src1", "src2", "src3" };
-    public HashMap sourceDirectories;
-
-    public void setUp() throws IOException {
-        File tempFile = File.createTempFile("temp", ".tmp");
-        tempFile.deleteOnExit();
-        sourceDirectories = new HashMap();
-
-        for( int i=0; i<SOURCE_DIRECTORY_IDENTIFIER.length; i++) {
-        	File directory = new File(tempFile.getParent(), SOURCE_DIRECTORY_IDENTIFIER[i]);
-        	directory.mkdir();
-        	filesUnderSourceDir(directory, 1+i*2);
-        	sourceDirectories.put(SOURCE_DIRECTORY_IDENTIFIER[i], directory);
-        }
-    }
-
-    private void filesUnderSourceDir(File srcDirectory, int number) throws IOException, FileNotFoundException {
-        File sub = new File(srcDirectory, "com");
-        sub.mkdir();
-        File temp = new File(sub, "example");
-        temp.mkdir();
-        File sample1 = new File(temp, "Sample" + number + ".java");
-        sample1.createNewFile();
-        FileWriter writer1 = new FileWriter(sample1);
-        writer1.write( "package com.example;\n");
-        writer1.write( "public class Sample" + number + " {\n");
-        /*
-         * Add an annotation to make sure the complexity works with them
-         */
-        if (number == 1) {
-        	writer1.write( "@Deprecated\n");
-        }
-        writer1.write( "    public void someMethod(int v) {\n");
-        writer1.write( "        if(v<0) System.out.println();\n");
-        writer1.write( "        else System.out.println('x');\n");
-        writer1.write( "    }\n");
-        writer1.write( "}\n");
-        writer1.close();
-        
-        File sample2 = new File(temp, "Sample" + (number + 1) + ".java");
-        sample2.createNewFile();
-        FileWriter writer2 = new FileWriter(sample2);
-        writer2.write( "package com.example;\n");
-        writer2.write( "class Sample" + (number + 1) + " {\n");
-        writer2.write( "    private String otherMethod() {\n");
-        writer2.write( "        return \"OtherValue\";\n");
-        writer2.write( "    }\n");
-        writer2.write( "}\n");
-        writer2.close();
-    }
-
-    protected void deleteTree(File fileRoot) {
-        if (fileRoot.isFile()) {
-            fileRoot.delete();
-            return;
-        }
-
-        File[] files = fileRoot.listFiles();
-        for (int i = 0; i < files.length; i++) {
-            deleteTree(files[i]);
-        }
-        fileRoot.delete();
-    }
-
-    public void tearDown() {
-        for( int i=0; i<SOURCE_DIRECTORY_IDENTIFIER.length; i++) {
-        	deleteTree(sourceDirectory(SOURCE_DIRECTORY_IDENTIFIER[i]));
-        }
-    }
-
-    public File sourceDirectory(String directoryIdentifier) {
-        return (File) sourceDirectories.get(directoryIdentifier);
-    }
-}
diff --git a/test/net/sourceforge/cobertura/webapp/test/WebAppFunctionalTest.groovy b/test/net/sourceforge/cobertura/webapp/test/WebAppFunctionalTest.groovy
deleted file mode 100644
index 22b7cb5..0000000
--- a/test/net/sourceforge/cobertura/webapp/test/WebAppFunctionalTest.groovy
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (C) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- * Copyright (C) 2009 John Lewis
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Ant" and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache at apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package net.sourceforge.cobertura.webapp.test
-
-import net.sourceforge.cobertura.test.util.TestUtil
-import net.sourceforge.cobertura.test.util.WebappServer
-
-import org.junit.Before
-import org.junit.Test
-
-import static org.junit.Assert.*
-
-public class WebAppFunctionalTest {
-	
-	/*
-	 * For the next two constants, it would be preferable to use saveGlobalProjectData
-	 * in class net.sourceforge.cobertura.coveragedata.ProjectData, but ProjectData is
-	 * not instrumented since it extends HasBeenInstrumented.   So, the best we can
-	 * do is make sure the doGet method in FlushCoberturaServlet is called.
-	 */
-	private static final SAVE_DATA_CLASSNAME = "net.sourceforge.cobertura.webapp.FlushCoberturaServlet"
-	private static final SAVE_DATA_METHOD_NAME = "doGet"
-	private static final boolean TOMCAT = true
-		
-	def ant = TestUtil.antBuilder
-	
-	
-	@Before
-	void setUp() {
-	}
-	
-	@Test
-	void basicStartAndStopOfWebApp() {
-		basicStartAndStopOfWebApp(!TOMCAT)
-	}
-
-	@Test
-	void basicStartAndStopOfWebAppInTomcat() {
-		basicStartAndStopOfWebApp(TOMCAT)
-	}	
-
-	void basicStartAndStopOfWebApp(tomcat) {
-		TestUtil.withTempDir { tempDir ->
-			def webappServerDir = new File(tempDir, "webserver")
-			def srcDir = new File(tempDir, "src")
-			
-			WebappServer.writeSimpleServletSource(srcDir)
-			
-			def appName = "simple"
-
-			def webappServer = new WebappServer(dir:webappServerDir, tomcat:tomcat)
-
-			webappServer.deployApp(
-					webInfText:WebappServer.SIMPLE_SERVLET_WEB_XML_TEXT,
-					srcDir:srcDir,
-					appName:appName,
-					instrumentRegEx:'com.acme.*')
-					
-			def data = webappServer.withRunningServer { data ->
-			
-				//do a HTTP get so the doGet method will be hit
-				def webappResponse = (new java.net.URL("http://${data.hostname}:${data.webappPort}/${appName}/SimpleServlet")).text
-				assertEquals("Webapp response was incorrect", "Hi", webappResponse.trim())
-
-				data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-				def dom = TestUtil.getXMLReportDOM(data.xmlReport)
-				
-				//make sure the report shows the doGet method has not been hit yet - the data is not flushed until the server stops
-				assertFalse(TestUtil.isMethodHit(dom, "doGet"))
-			}
-			
-			//now that the server has stopped, make sure the report shows it has been hit
-			assertTrue("doGet has hits=0 in cobertura report", TestUtil.isMethodHit(data.dom, "doGet"))
-		}
-	}
-
-	@Test
-	void flushCoberturaData() {
-		TestUtil.withTempDir { tempDir ->
-			def webappServerDir = new File(tempDir, "webserver")
-			def srcDir = new File(tempDir, "src")
-			
-			WebappServer.writeSimpleServletSource(srcDir)
-			
-			def appName = "simple"
-
-			def webappServer = new WebappServer(dir:webappServerDir)
-
-			webappServer.deployApp(
-					webInfText:WebappServer.SIMPLE_SERVLET_WEB_XML_TEXT,
-					srcDir:srcDir,
-					appName:appName,
-					instrumentCobertura:true,
-					deployCoberturaFlush:true,
-					modifyMainCoberturaDataFile:true)
-				
-		
-			def data = webappServer.withRunningServer { data ->
-			
-				/*
-				 * do a HTTP get of the simple webapp - this is just to get somewhat close to a 
-				 * real world scenario
-				 */
-				def webappResponse = (new java.net.URL("http://${data.hostname}:${data.webappPort}/${appName}/SimpleServlet")).text
-				assertEquals("Webapp response was incorrect", "Hi", webappResponse.trim())
-
-				//Do a coverage report of the main cobertura.ser file at the root of the project
-				data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-				def dom = TestUtil.getXMLReportDOM(data.xmlReport)
-				
-				def hitCountBefore = TestUtil.getHitCount(dom, SAVE_DATA_CLASSNAME, SAVE_DATA_METHOD_NAME)
-				
-				//flush the cobertura data by doing an HTTP get
-				data.flushCobertura()
-				
-				//run the report again
-				data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-				dom = TestUtil.getXMLReportDOM(data.xmlReport)
-
-				def hitCountAfter = TestUtil.getHitCount(dom, SAVE_DATA_CLASSNAME, SAVE_DATA_METHOD_NAME)
-				
-				assertEquals("hit count should have increased by one", hitCountBefore + 1, hitCountAfter)
-			}
-		}
-	}
-	
-	@Test
-	void flushCoberturaData2() {
-		TestUtil.withTempDir { tempDir ->
-			def webappServerDir = new File(tempDir, "webserver")
-			def srcDir = new File(tempDir, "src")
-			
-			WebappServer.writeSimpleServletSource(srcDir)
-			
-			def appName = "simple"
-
-			def webappServer = new WebappServer(dir:webappServerDir)
-
-			webappServer.deployApp(
-					webInfText:WebappServer.SIMPLE_SERVLET_WEB_XML_TEXT,
-					srcDir:srcDir,
-					appName:appName,
-					deployCoberturaFlush:true,
-					instrumentRegEx:'com.acme.*')
-				
-	
-			def data = webappServer.withRunningServer { data ->
-			
-				/*
-				 * do a HTTP get of the simple webapp
-				 */
-				def webappResponse = (new java.net.URL("http://${data.hostname}:${data.webappPort}/${appName}/SimpleServlet")).text
-				assertEquals("Webapp response was incorrect", "Hi", webappResponse.trim())
-
-				//Do a coverage report of the main cobertura.ser file at the root of the project
-				data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-				def dom = TestUtil.getXMLReportDOM(data.xmlReport)
-				
-				def hitCountBefore = TestUtil.getHitCount(dom, WebappServer.SIMPLE_SERVLET_CLASSNAME, "doGet")
-				assertEquals(0, hitCountBefore)
-				
-				//flush the cobertura data by doing an HTTP get
-				data.flushCobertura()
-				
-				//run the report again
-				data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-				dom = TestUtil.getXMLReportDOM(data.xmlReport)
-
-				def hitCountAfter = TestUtil.getHitCount(dom, WebappServer.SIMPLE_SERVLET_CLASSNAME, "doGet")
-				
-				assertEquals(1, hitCountAfter)
-			}
-			
-			//run the report again
-			data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-			def dom = TestUtil.getXMLReportDOM(data.xmlReport)
-
-			def finalCount = TestUtil.getHitCount(dom, WebappServer.SIMPLE_SERVLET_CLASSNAME, "doGet")
-			
-			assertEquals(1, finalCount)
-			
-		}
-	}
-
-	@Test
-	void flushCoberturaDataOnly() {
-		/*
-		 * Test case where a flush is done before any instrumented code is executed.
-		 */
-		TestUtil.withTempDir { tempDir ->
-			def webappServerDir = new File(tempDir, "webserver")
-			def srcDir = new File(tempDir, "src")
-			
-			WebappServer.writeSimpleServletSource(srcDir)
-			
-			def appName = "simple"
-
-			def webappServer = new WebappServer(dir:webappServerDir)
-
-			webappServer.deployApp(
-					webInfText:WebappServer.SIMPLE_SERVLET_WEB_XML_TEXT,
-					srcDir:srcDir,
-					appName:appName,
-					deployCoberturaFlush:true,
-					instrumentRegEx:'com.acme.*')
-				
-	
-			def data = webappServer.withRunningServer { data ->
-			
-				//Do a coverage report of the main cobertura.ser file at the root of the project
-				data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-				def dom = TestUtil.getXMLReportDOM(data.xmlReport)
-				
-				def hitCountBefore = TestUtil.getHitCount(dom, WebappServer.SIMPLE_SERVLET_CLASSNAME, "doGet")
-				assertEquals(0, hitCountBefore)
-				
-				//flush the cobertura data by doing an HTTP get
-				data.flushCobertura()
-				
-				//run the report again
-				data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-				dom = TestUtil.getXMLReportDOM(data.xmlReport)
-
-				def hitCountAfter = TestUtil.getHitCount(dom, WebappServer.SIMPLE_SERVLET_CLASSNAME, "doGet")
-				
-				assertEquals(0, hitCountAfter)
-			}
-			
-			//run the report again
-			data.coberturaAnt.'cobertura-report'(datafile:data.datafile, format:'xml', destdir:data.xmlReport.getParent())
-			def dom = TestUtil.getXMLReportDOM(data.xmlReport)
-
-			def finalCount = TestUtil.getHitCount(dom, WebappServer.SIMPLE_SERVLET_CLASSNAME, "doGet")
-			
-			assertEquals(0, finalCount)
-			
-		}
-	}
-}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/cobertura.git



More information about the pkg-java-commits mailing list