]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4481 Create a new Cobertura Report parser API
authorJulien HENRY <julien.henry@sonarsource.com>
Thu, 11 Jul 2013 10:22:50 +0000 (12:22 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Thu, 11 Jul 2013 12:17:11 +0000 (14:17 +0200)
sonar-deprecated/src/main/java/org/sonar/plugins/cobertura/api/AbstractCoberturaParser.java
sonar-deprecated/src/main/java/org/sonar/plugins/cobertura/api/CoberturaUtils.java
sonar-deprecated/src/main/java/org/sonar/plugins/cobertura/base/CoberturaConstants.java [deleted file]
sonar-deprecated/src/test/java/org/sonar/plugins/cobertura/api/CoberturaUtilsTest.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/CoberturaReportParserUtils.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/utils/CoberturaReportParserUtilsTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/commons-chain-coverage.xml [new file with mode: 0644]
sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldInsertCoverageAtFileLevel/coverage.xml [new file with mode: 0644]
sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldNotCountTwiceAnonymousClasses.xml [new file with mode: 0644]

index a9394a29889058c590dcc7d273087260d47bd2fa..1f6ab554da24acb6d0bcc8d3de4c525df7da50fc 100644 (file)
  */
 package org.sonar.plugins.cobertura.api;
 
-import com.google.common.collect.Maps;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.staxmate.in.SMHierarchicCursor;
-import org.codehaus.staxmate.in.SMInputCursor;
 import org.sonar.api.batch.SensorContext;
-import org.sonar.api.measures.CoverageMeasuresBuilder;
-import org.sonar.api.measures.Measure;
 import org.sonar.api.resources.Resource;
-import org.sonar.api.utils.StaxParser;
-import org.sonar.api.utils.XmlParserException;
-
-import javax.xml.stream.XMLStreamException;
+import org.sonar.api.utils.CoberturaReportParserUtils;
+import org.sonar.api.utils.CoberturaReportParserUtils.FileResolver;
 
 import java.io.File;
-import java.text.ParseException;
-import java.util.Map;
-
-import static java.util.Locale.ENGLISH;
-import static org.sonar.api.utils.ParsingUtils.parseNumber;
 
 /**
  * @since 2.4
@@ -49,75 +35,12 @@ import static org.sonar.api.utils.ParsingUtils.parseNumber;
 public abstract class AbstractCoberturaParser {
 
   public void parseReport(File xmlFile, final SensorContext context) {
-    try {
-      StaxParser parser = new StaxParser(new StaxParser.XmlStreamHandler() {
-
-        public void stream(SMHierarchicCursor rootCursor) throws XMLStreamException {
-          try {
-            rootCursor.advance();
-            collectPackageMeasures(rootCursor.descendantElementCursor("package"), context);
-          } catch (ParseException e) {
-            throw new XMLStreamException(e);
-          }
-        }
-      });
-      parser.parse(xmlFile);
-    } catch (XMLStreamException e) {
-      throw new XmlParserException(e);
-    }
-  }
-
-  private void collectPackageMeasures(SMInputCursor pack, SensorContext context) throws ParseException, XMLStreamException {
-    while (pack.getNext() != null) {
-      Map<String, CoverageMeasuresBuilder> builderByFilename = Maps.newHashMap();
-      collectFileMeasures(pack.descendantElementCursor("class"), builderByFilename);
-      for (Map.Entry<String, CoverageMeasuresBuilder> entry : builderByFilename.entrySet()) {
-        String filename = sanitizeFilename(entry.getKey());
-        Resource file = getResource(filename);
-        if (fileExists(context, file)) {
-          for (Measure measure : entry.getValue().createMeasures()) {
-            context.saveMeasure(file, measure);
-          }
-        }
-      }
-    }
-  }
-
-  private boolean fileExists(SensorContext context, Resource file) {
-    return context.getResource(file) != null;
-  }
-
-  private void collectFileMeasures(SMInputCursor clazz, Map<String, CoverageMeasuresBuilder> builderByFilename) throws ParseException, XMLStreamException {
-    while (clazz.getNext() != null) {
-      String fileName = clazz.getAttrValue("filename");
-      CoverageMeasuresBuilder builder = builderByFilename.get(fileName);
-      if (builder == null) {
-        builder = CoverageMeasuresBuilder.create();
-        builderByFilename.put(fileName, builder);
-      }
-      collectFileData(clazz, builder);
-    }
-  }
-
-  private void collectFileData(SMInputCursor clazz, CoverageMeasuresBuilder builder) throws ParseException, XMLStreamException {
-    SMInputCursor line = clazz.childElementCursor("lines").advance().childElementCursor("line");
-    while (line.getNext() != null) {
-      int lineId = Integer.parseInt(line.getAttrValue("number"));
-      builder.setHits(lineId, (int) parseNumber(line.getAttrValue("hits"), ENGLISH));
-
-      String isBranch = line.getAttrValue("branch");
-      String text = line.getAttrValue("condition-coverage");
-      if (StringUtils.equals(isBranch, "true") && StringUtils.isNotBlank(text)) {
-        String[] conditions = StringUtils.split(StringUtils.substringBetween(text, "(", ")"), "/");
-        builder.setConditions(lineId, Integer.parseInt(conditions[1]), Integer.parseInt(conditions[0]));
+    CoberturaReportParserUtils.parseReport(xmlFile, context, new FileResolver() {
+      @Override
+      public Resource<?> resolve(String filename) {
+        return getResource(filename);
       }
-    }
-  }
-
-  private String sanitizeFilename(String s) {
-    String fileName = FilenameUtils.removeExtension(s);
-    fileName = fileName.replace('/', '.').replace('\\', '.');
-    return fileName;
+    });
   }
 
   protected abstract Resource getResource(String fileName);
index 3488d166ec01134b2106adbac92034c2c3575b47..36b88a0672c44e7aa285d3a842fd7aa861d2e790 100644 (file)
@@ -23,24 +23,25 @@ import org.sonar.api.batch.maven.MavenPlugin;
 import org.sonar.api.batch.maven.MavenUtils;
 import org.sonar.api.resources.Project;
 import org.sonar.api.utils.Logs;
-import org.sonar.plugins.cobertura.base.CoberturaConstants;
 
 import java.io.File;
 
 /**
  * @since 2.4
  * @deprecated since 3.7 Used to keep backward compatibility since extraction
- * of Cobertura plugin.
+ * of Cobertura plugin. Should be duplicated in each project.
  */
 @Deprecated
 public final class CoberturaUtils {
 
   public static final String COBERTURA_GROUP_ID = MavenUtils.GROUP_ID_CODEHAUS_MOJO;
   public static final String COBERTURA_ARTIFACT_ID = "cobertura-maven-plugin";
+  public static final String COBERTURA_REPORT_PATH_PROPERTY = "sonar.cobertura.reportPath";
 
   /**
    * @deprecated in 2.8, because assumes that Sonar executed from Maven. Not used any more in sonar-cobertura-plugin.
    *             See http://jira.codehaus.org/browse/SONAR-2321
+   *             Used in groovy and flex plugins.
    */
   @Deprecated
   public static File getReport(Project project) {
@@ -60,7 +61,7 @@ public final class CoberturaUtils {
   }
 
   private static File getReportFromProperty(Project project) {
-    String path = (String) project.getProperty(CoberturaConstants.COBERTURA_REPORT_PATH_PROPERTY);
+    String path = (String) project.getProperty(COBERTURA_REPORT_PATH_PROPERTY);
     if (path != null) {
       return project.getFileSystem().resolvePath(path);
     }
diff --git a/sonar-deprecated/src/main/java/org/sonar/plugins/cobertura/base/CoberturaConstants.java b/sonar-deprecated/src/main/java/org/sonar/plugins/cobertura/base/CoberturaConstants.java
deleted file mode 100644 (file)
index 6cd73ac..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.plugins.cobertura.base;
-
-/**
- * @deprecated since 3.7 Used to keep backward compatibility since extraction
- * of Cobertura plugin.
- */
-@Deprecated
-public final class CoberturaConstants {
-
-  public static final String COBERTURA_REPORT_PATH_PROPERTY = "sonar.cobertura.reportPath";
-  public static final String COBERTURA_MAXMEM_PROPERTY = "sonar.cobertura.maxmem";
-  public static final String COBERTURA_MAXMEM_DEFAULT_VALUE = "64m";
-
-  private CoberturaConstants() {
-  }
-}
index 4e17519812a1ce01a92e9ce16b752e71714c93f8..afb1ae13f4bdb728c258828ab6a06b860c0d6003 100644 (file)
@@ -24,7 +24,6 @@ import org.junit.Test;
 import org.sonar.api.resources.Project;
 import org.sonar.api.resources.ProjectFileSystem;
 import org.sonar.api.test.MavenTestUtils;
-import org.sonar.plugins.cobertura.base.CoberturaConstants;
 
 import java.io.File;
 import java.net.URISyntaxException;
@@ -42,7 +41,7 @@ public class CoberturaUtilsTest {
 
     Project project = mock(Project.class);
     when(project.getFileSystem()).thenReturn(fileSystem);
-    when(project.getProperty(CoberturaConstants.COBERTURA_REPORT_PATH_PROPERTY)).thenReturn("foo");
+    when(project.getProperty(CoberturaUtils.COBERTURA_REPORT_PATH_PROPERTY)).thenReturn("foo");
 
     File report = CoberturaUtils.getReport(project);
     verify(fileSystem).resolvePath("foo");
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/CoberturaReportParserUtils.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/CoberturaReportParserUtils.java
new file mode 100644 (file)
index 0000000..4f4205d
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.api.utils;
+
+import com.google.common.collect.Maps;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang.StringUtils;
+import org.codehaus.staxmate.in.SMHierarchicCursor;
+import org.codehaus.staxmate.in.SMInputCursor;
+import org.sonar.api.batch.SensorContext;
+import org.sonar.api.measures.CoverageMeasuresBuilder;
+import org.sonar.api.measures.Measure;
+import org.sonar.api.resources.Resource;
+
+import javax.xml.stream.XMLStreamException;
+
+import java.io.File;
+import java.text.ParseException;
+import java.util.Map;
+
+import static java.util.Locale.ENGLISH;
+import static org.sonar.api.utils.ParsingUtils.parseNumber;
+
+/**
+ * @since 3.7
+ */
+public class CoberturaReportParserUtils {
+
+  private CoberturaReportParserUtils() {
+  }
+
+  public static interface FileResolver {
+
+    /**
+     * Return a SonarQube file resource from a filename present in Cobertura report
+     */
+    Resource<?> resolve(String filename);
+  }
+
+  /**
+   * Parse a Cobertura xml report and create measures accordingly
+   */
+  public static void parseReport(File xmlFile, final SensorContext context, final FileResolver fileResolver) {
+    try {
+      StaxParser parser = new StaxParser(new StaxParser.XmlStreamHandler() {
+
+        public void stream(SMHierarchicCursor rootCursor) throws XMLStreamException {
+          try {
+            rootCursor.advance();
+            collectPackageMeasures(rootCursor.descendantElementCursor("package"), context, fileResolver);
+          } catch (ParseException e) {
+            throw new XMLStreamException(e);
+          }
+        }
+      });
+      parser.parse(xmlFile);
+    } catch (XMLStreamException e) {
+      throw new XmlParserException(e);
+    }
+  }
+
+  private static void collectPackageMeasures(SMInputCursor pack, SensorContext context, final FileResolver fileResolver) throws ParseException, XMLStreamException {
+    while (pack.getNext() != null) {
+      Map<String, CoverageMeasuresBuilder> builderByFilename = Maps.newHashMap();
+      collectFileMeasures(pack.descendantElementCursor("class"), builderByFilename);
+      for (Map.Entry<String, CoverageMeasuresBuilder> entry : builderByFilename.entrySet()) {
+        String filename = sanitizeFilename(entry.getKey());
+        Resource<?> file = fileResolver.resolve(filename);
+        if (fileExists(context, file)) {
+          for (Measure measure : entry.getValue().createMeasures()) {
+            context.saveMeasure(file, measure);
+          }
+        }
+      }
+    }
+  }
+
+  private static boolean fileExists(SensorContext context, Resource<?> file) {
+    return context.getResource(file) != null;
+  }
+
+  private static void collectFileMeasures(SMInputCursor clazz, Map<String, CoverageMeasuresBuilder> builderByFilename) throws ParseException, XMLStreamException {
+    while (clazz.getNext() != null) {
+      String fileName = clazz.getAttrValue("filename");
+      CoverageMeasuresBuilder builder = builderByFilename.get(fileName);
+      if (builder == null) {
+        builder = CoverageMeasuresBuilder.create();
+        builderByFilename.put(fileName, builder);
+      }
+      collectFileData(clazz, builder);
+    }
+  }
+
+  private static void collectFileData(SMInputCursor clazz, CoverageMeasuresBuilder builder) throws ParseException, XMLStreamException {
+    SMInputCursor line = clazz.childElementCursor("lines").advance().childElementCursor("line");
+    while (line.getNext() != null) {
+      int lineId = Integer.parseInt(line.getAttrValue("number"));
+      builder.setHits(lineId, (int) parseNumber(line.getAttrValue("hits"), ENGLISH));
+
+      String isBranch = line.getAttrValue("branch");
+      String text = line.getAttrValue("condition-coverage");
+      if (StringUtils.equals(isBranch, "true") && StringUtils.isNotBlank(text)) {
+        String[] conditions = StringUtils.split(StringUtils.substringBetween(text, "(", ")"), "/");
+        builder.setConditions(lineId, Integer.parseInt(conditions[1]), Integer.parseInt(conditions[0]));
+      }
+    }
+  }
+
+  private static String sanitizeFilename(String s) {
+    String fileName = FilenameUtils.removeExtension(s);
+    fileName = fileName.replace('/', '.').replace('\\', '.');
+    return fileName;
+  }
+
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/CoberturaReportParserUtilsTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/CoberturaReportParserUtilsTest.java
new file mode 100644 (file)
index 0000000..ecab238
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.api.utils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.api.batch.SensorContext;
+import org.sonar.api.measures.CoreMetrics;
+import org.sonar.api.measures.Measure;
+import org.sonar.api.resources.JavaFile;
+import org.sonar.api.resources.JavaPackage;
+import org.sonar.api.resources.Qualifiers;
+import org.sonar.api.resources.Resource;
+import org.sonar.api.resources.Scopes;
+import org.sonar.api.test.IsMeasure;
+import org.sonar.api.test.IsResource;
+import org.sonar.api.utils.CoberturaReportParserUtils.FileResolver;
+
+import java.io.File;
+import java.net.URISyntaxException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyDouble;
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class CoberturaReportParserUtilsTest {
+
+  private SensorContext context;
+
+  @Before
+  public void setUp() {
+    context = mock(SensorContext.class);
+  }
+
+  private static FileResolver JAVA_FILE_RESOLVER = new FileResolver() {
+
+    @Override
+    public Resource<?> resolve(String filename) {
+      return new JavaFile(filename);
+    }
+  };
+
+  @Test
+  public void doNotCollectProjectCoverage() throws URISyntaxException {
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    verify(context, never()).saveMeasure(eq(CoreMetrics.COVERAGE), anyDouble());
+  }
+
+  @Test
+  public void doNotCollectProjectLineCoverage() throws URISyntaxException {
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    verify(context, never()).saveMeasure(eq(CoreMetrics.LINE_COVERAGE), anyDouble());
+    verify(context, never()).saveMeasure(argThat(new IsMeasure(CoreMetrics.COVERAGE_LINE_HITS_DATA)));
+  }
+
+  @Test
+  public void doNotCollectProjectBranchCoverage() throws URISyntaxException {
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    verify(context, never()).saveMeasure(eq(CoreMetrics.BRANCH_COVERAGE), anyDouble());
+  }
+
+  @Test
+  public void collectPackageLineCoverage() throws URISyntaxException {
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    verify(context, never()).saveMeasure((Resource) argThat(is(JavaPackage.class)), eq(CoreMetrics.LINE_COVERAGE), anyDouble());
+    verify(context, never()).saveMeasure((Resource) argThat(is(JavaPackage.class)), eq(CoreMetrics.UNCOVERED_LINES), anyDouble());
+  }
+
+  @Test
+  public void collectPackageBranchCoverage() throws URISyntaxException {
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    verify(context, never()).saveMeasure((Resource) argThat(is(JavaPackage.class)), eq(CoreMetrics.BRANCH_COVERAGE), anyDouble());
+    verify(context, never()).saveMeasure((Resource) argThat(is(JavaPackage.class)), eq(CoreMetrics.UNCOVERED_CONDITIONS), anyDouble());
+  }
+
+  @Test
+  public void packageCoverageIsCalculatedLaterByDecorator() throws URISyntaxException {
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    verify(context, never()).saveMeasure((Resource) argThat(is(JavaPackage.class)), eq(CoreMetrics.COVERAGE), anyDouble());
+  }
+
+  @Test
+  public void collectFileLineCoverage() throws URISyntaxException {
+    when(context.getResource(any(Resource.class))).thenReturn(new JavaFile("org.sonar.MyClass"));
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    final JavaFile file = new JavaFile("org.apache.commons.chain.config.ConfigParser");
+    verify(context).saveMeasure(eq(file), argThat(new IsMeasure(CoreMetrics.LINES_TO_COVER, 30.0)));
+    verify(context).saveMeasure(eq(file), argThat(new IsMeasure(CoreMetrics.UNCOVERED_LINES, 5.0)));
+  }
+
+  @Test
+  public void collectFileBranchCoverage() throws URISyntaxException {
+    when(context.getResource(any(Resource.class))).thenReturn(new JavaFile("org.sonar.MyClass"));
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    final JavaFile file = new JavaFile("org.apache.commons.chain.config.ConfigParser");
+    verify(context).saveMeasure(eq(file), argThat(new IsMeasure(CoreMetrics.CONDITIONS_TO_COVER, 6.0)));
+    verify(context).saveMeasure(eq(file), argThat(new IsMeasure(CoreMetrics.UNCOVERED_CONDITIONS, 2.0)));
+  }
+
+  @Test
+  public void testDoNotSaveMeasureOnResourceWhichDoesntExistInTheContext() throws URISyntaxException {
+    when(context.getResource(any(Resource.class))).thenReturn(null);
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+    verify(context, never()).saveMeasure(any(Resource.class), any(Measure.class));
+  }
+
+  @Test
+  public void javaInterfaceHasNoCoverage() throws URISyntaxException {
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+
+    final JavaFile interfaze = new JavaFile("org.apache.commons.chain.Chain");
+    verify(context, never()).saveMeasure(eq(interfaze), argThat(new IsMeasure(CoreMetrics.COVERAGE)));
+
+    verify(context, never()).saveMeasure(eq(interfaze), argThat(new IsMeasure(CoreMetrics.LINE_COVERAGE)));
+    verify(context, never()).saveMeasure(eq(interfaze), argThat(new IsMeasure(CoreMetrics.LINES_TO_COVER)));
+    verify(context, never()).saveMeasure(eq(interfaze), argThat(new IsMeasure(CoreMetrics.UNCOVERED_LINES)));
+
+    verify(context, never()).saveMeasure(eq(interfaze), argThat(new IsMeasure(CoreMetrics.BRANCH_COVERAGE)));
+    verify(context, never()).saveMeasure(eq(interfaze), argThat(new IsMeasure(CoreMetrics.CONDITIONS_TO_COVER)));
+    verify(context, never()).saveMeasure(eq(interfaze), argThat(new IsMeasure(CoreMetrics.UNCOVERED_CONDITIONS)));
+  }
+
+  @Test
+  public void shouldInsertCoverageAtFileLevel() throws URISyntaxException {
+    File coverage = new File(getClass().getResource(
+        "/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldInsertCoverageAtFileLevel/coverage.xml").toURI());
+    when(context.getResource(any(Resource.class))).thenReturn(new JavaFile("org.sonar.MyClass"));
+    CoberturaReportParserUtils.parseReport(coverage, context, JAVA_FILE_RESOLVER);
+
+    verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass")),
+        argThat(new IsMeasure(CoreMetrics.LINES_TO_COVER, 35.0)));
+    verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass")),
+        argThat(new IsMeasure(CoreMetrics.UNCOVERED_LINES, 22.0)));
+
+    verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass")),
+        argThat(new IsMeasure(CoreMetrics.CONDITIONS_TO_COVER, 4.0)));
+    verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass")),
+        argThat(new IsMeasure(CoreMetrics.UNCOVERED_CONDITIONS, 3.0)));
+
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass$InnerClassInside")),
+        argThat(new IsMeasure(CoreMetrics.LINES_TO_COVER)));
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass$InnerClassInside")),
+        argThat(new IsMeasure(CoreMetrics.CONDITIONS_TO_COVER)));
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass$InnerClassInside")),
+        argThat(new IsMeasure(CoreMetrics.UNCOVERED_CONDITIONS)));
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.InnerClass$InnerClassInside")),
+        argThat(new IsMeasure(CoreMetrics.UNCOVERED_LINES)));
+
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.PrivateClass")),
+        argThat(new IsMeasure(CoreMetrics.LINES_TO_COVER)));
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.PrivateClass")),
+        argThat(new IsMeasure(CoreMetrics.CONDITIONS_TO_COVER)));
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.PrivateClass")),
+        argThat(new IsMeasure(CoreMetrics.UNCOVERED_CONDITIONS)));
+    verify(context, never()).saveMeasure(
+        argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.PrivateClass")),
+        argThat(new IsMeasure(CoreMetrics.UNCOVERED_LINES)));
+
+    verify(context)
+        .saveMeasure(
+            eq(new JavaFile("org.sonar.samples.InnerClass")),
+            argThat(new IsMeasure(
+                CoreMetrics.COVERAGE_LINE_HITS_DATA,
+                "22=2;25=0;26=0;29=0;30=0;31=0;34=1;35=1;36=1;37=0;39=1;41=1;44=2;46=1;47=1;50=0;51=0;52=0;53=0;55=0;57=0;60=0;61=0;64=1;71=1;73=1;76=0;77=0;80=0;81=0;85=0;87=0;91=0;93=0;96=1")));
+  }
+
+  @Test
+  public void collectFileLineHitsData() throws URISyntaxException {
+    when(context.getResource(any(Resource.class))).thenReturn(new JavaFile("org.sonar.MyClass"));
+    CoberturaReportParserUtils.parseReport(getCoverageReport(), context, JAVA_FILE_RESOLVER);
+    verify(context).saveMeasure(
+        eq(new JavaFile("org.apache.commons.chain.impl.CatalogBase")),
+        argThat(new IsMeasure(CoreMetrics.COVERAGE_LINE_HITS_DATA,
+            "48=117;56=234;66=0;67=0;68=0;84=999;86=999;98=318;111=18;121=0;122=0;125=0;126=0;127=0;128=0;131=0;133=0")));
+  }
+
+  @Test
+  public void shouldNotCountTwiceAnonymousClasses() throws URISyntaxException {
+    File coverage = new File(getClass().getResource("/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldNotCountTwiceAnonymousClasses.xml").toURI());
+    when(context.getResource(any(Resource.class))).thenReturn(new JavaFile("org.sonar.samples.MyClass"));
+    CoberturaReportParserUtils.parseReport(coverage, context, JAVA_FILE_RESOLVER);
+
+    verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.CLASS, "org.sonar.samples.MyFile")),
+        argThat(new IsMeasure(CoreMetrics.LINES_TO_COVER, 5.0))); // do not count line 26 twice
+  }
+
+  private File getCoverageReport() throws URISyntaxException {
+    return new File(getClass().getResource("/org/sonar/api/utils/CoberturaReportParserUtilsTest/commons-chain-coverage.xml").toURI());
+  }
+}
diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/commons-chain-coverage.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/commons-chain-coverage.xml
new file mode 100644 (file)
index 0000000..adb4f7b
--- /dev/null
@@ -0,0 +1,10201 @@
+<?xml version="1.0"?>
+<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
+
+<coverage line-rate="0.6748129675810474" branch-rate="0.5783664459161147" lines-covered="1353" lines-valid="2005"
+          branches-covered="524" branches-valid="906" complexity="2.2051282051282053" version="1.9.2"
+          timestamp="1253257458277">
+  <sources>
+    <source>/Users/simon/projects/commons-chain/src/java</source>
+    <source>--source</source>
+  </sources>
+  <packages>
+    <package name="org.apache.commons.chain" line-rate="0.9024390243902439" branch-rate="0.6818181818181818"
+             complexity="1.6875">
+      <classes>
+        <class name="org.apache.commons.chain.Catalog" filename="org/apache/commons/chain/Catalog.java" line-rate="1.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+          </methods>
+          <lines>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.CatalogFactory" filename="org/apache/commons/chain/CatalogFactory.java"
+               line-rate="0.9024390243902439" branch-rate="0.6818181818181818" complexity="2.2222222222222223">
+          <methods>
+            <method name="&lt;clinit&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="172" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="41" hits="36" branch="false"/>
+              </lines>
+            </method>
+            <method name="class$" signature="(Ljava/lang/String;)Ljava/lang/Class;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="147" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="212" hits="39" branch="false"/>
+                <line number="213" hits="39" branch="false"/>
+                <line number="214" hits="39" branch="false"/>
+                <line number="216" hits="39" branch="false"/>
+              </lines>
+            </method>
+            <method name="getClassLoader" signature="()Ljava/lang/ClassLoader;" line-rate="0.75" branch-rate="0.25">
+              <lines>
+                <line number="229" hits="234" branch="false"/>
+                <line number="230" hits="234" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="231" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="233" hits="234" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommand" signature="(Ljava/lang/String;)Lorg/apache/commons/chain/Command;"
+                    line-rate="0.8571428571428571" branch-rate="0.7142857142857143">
+              <lines>
+                <line number="127" hits="21" branch="false"/>
+                <line number="128" hits="21" branch="false"/>
+                <line number="129" hits="21" branch="false"/>
+                <line number="131" hits="21" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="132" hits="21" branch="false"/>
+                <line number="133" hits="21" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="134" hits="15" branch="false"/>
+                <line number="135" hits="15" branch="false"/>
+                <line number="136" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="137" hits="3" branch="false"/>
+                <line number="144" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="145" hits="12" branch="false"/>
+                <line number="146" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="148" hits="6" branch="false"/>
+                <line number="149" hits="6" branch="false"/>
+                <line number="152" hits="6" branch="false"/>
+                <line number="153" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="155" hits="0" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+                <line number="160" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="getInstance" signature="()Lorg/apache/commons/chain/CatalogFactory;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="190" hits="195" branch="false"/>
+                <line number="191" hits="195" branch="false"/>
+                <line number="192" hits="195" branch="false"/>
+                <line number="193" hits="195" branch="false"/>
+                <line number="194" hits="195" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="195" hits="36" branch="false"/>
+                <line number="196" hits="36" branch="false"/>
+                <line number="198" hits="195" branch="false"/>
+                <line number="199" hits="195" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="41" hits="36" branch="false"/>
+            <line number="127" hits="21" branch="false"/>
+            <line number="128" hits="21" branch="false"/>
+            <line number="129" hits="21" branch="false"/>
+            <line number="131" hits="21" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="132" hits="21" branch="false"/>
+            <line number="133" hits="21" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="134" hits="15" branch="false"/>
+            <line number="135" hits="15" branch="false"/>
+            <line number="136" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="137" hits="3" branch="false"/>
+            <line number="144" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="145" hits="12" branch="false"/>
+            <line number="146" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="147" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="148" hits="6" branch="false"/>
+            <line number="149" hits="6" branch="false"/>
+            <line number="152" hits="6" branch="false"/>
+            <line number="153" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="155" hits="0" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+            <line number="160" hits="12" branch="false"/>
+            <line number="172" hits="3" branch="false"/>
+            <line number="190" hits="195" branch="false"/>
+            <line number="191" hits="195" branch="false"/>
+            <line number="192" hits="195" branch="false"/>
+            <line number="193" hits="195" branch="false"/>
+            <line number="194" hits="195" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="195" hits="36" branch="false"/>
+            <line number="196" hits="36" branch="false"/>
+            <line number="198" hits="195" branch="false"/>
+            <line number="199" hits="195" branch="false"/>
+            <line number="212" hits="39" branch="false"/>
+            <line number="213" hits="39" branch="false"/>
+            <line number="214" hits="39" branch="false"/>
+            <line number="216" hits="39" branch="false"/>
+            <line number="229" hits="234" branch="false"/>
+            <line number="230" hits="234" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="231" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="233" hits="234" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.Chain" filename="org/apache/commons/chain/Chain.java" line-rate="1.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+          </methods>
+          <lines>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.Command" filename="org/apache/commons/chain/Command.java" line-rate="1.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+          </methods>
+          <lines>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.Context" filename="org/apache/commons/chain/Context.java" line-rate="1.0"
+               branch-rate="1.0" complexity="0.0">
+          <methods>
+          </methods>
+          <lines>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.Filter" filename="org/apache/commons/chain/Filter.java" line-rate="1.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+          </methods>
+          <lines>
+          </lines>
+        </class>
+      </classes>
+    </package>
+    <package name="org.apache.commons.chain.config" line-rate="0.8048780487804879" branch-rate="0.7083333333333334"
+             complexity="1.4333333333333333">
+      <classes>
+        <class name="org.apache.commons.chain.config.ConfigCatalogRule"
+               filename="org/apache/commons/chain/config/ConfigCatalogRule.java" line-rate="1.0" branch-rate="1.0"
+               complexity="2.5">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljava/lang/String;Ljava/lang/String;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="53" hits="60" branch="false"/>
+                <line number="54" hits="60" branch="false"/>
+                <line number="55" hits="60" branch="false"/>
+                <line number="56" hits="60" branch="false"/>
+                <line number="66" hits="60" branch="false"/>
+                <line number="73" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="begin" signature="(Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="96" hits="54" branch="false"/>
+                <line number="97" hits="54" branch="false"/>
+                <line number="98" hits="54" branch="false"/>
+                <line number="99" hits="54" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="100" hits="27" branch="false"/>
+                <line number="102" hits="27" branch="false"/>
+                <line number="106" hits="54" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="107" hits="6" branch="false"/>
+                <line number="108" hits="6" branch="false"/>
+                <line number="109" hits="6" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="110" hits="3" branch="false"/>
+                <line number="112" hits="3" branch="false"/>
+                <line number="117" hits="54" branch="false"/>
+                <line number="119" hits="54" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="53" hits="60" branch="false"/>
+            <line number="54" hits="60" branch="false"/>
+            <line number="55" hits="60" branch="false"/>
+            <line number="56" hits="60" branch="false"/>
+            <line number="66" hits="60" branch="false"/>
+            <line number="73" hits="60" branch="false"/>
+            <line number="96" hits="54" branch="false"/>
+            <line number="97" hits="54" branch="false"/>
+            <line number="98" hits="54" branch="false"/>
+            <line number="99" hits="54" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="100" hits="27" branch="false"/>
+            <line number="102" hits="27" branch="false"/>
+            <line number="106" hits="54" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="107" hits="6" branch="false"/>
+            <line number="108" hits="6" branch="false"/>
+            <line number="109" hits="6" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="110" hits="3" branch="false"/>
+            <line number="112" hits="3" branch="false"/>
+            <line number="117" hits="54" branch="false"/>
+            <line number="119" hits="54" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.config.ConfigDefineRule"
+               filename="org/apache/commons/chain/config/ConfigDefineRule.java" line-rate="1.0" branch-rate="1.0"
+               complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljava/lang/String;Ljava/lang/String;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="52" hits="60" branch="false"/>
+                <line number="53" hits="60" branch="false"/>
+                <line number="54" hits="60" branch="false"/>
+                <line number="55" hits="60" branch="false"/>
+                <line number="66" hits="60" branch="false"/>
+                <line number="73" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="begin" signature="(Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="93" hits="243" branch="false"/>
+                <line number="94" hits="243" branch="false"/>
+                <line number="97" hits="243" branch="false"/>
+                <line number="98" hits="243" branch="false"/>
+                <line number="99" hits="243" branch="false"/>
+                <line number="102" hits="243" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="52" hits="60" branch="false"/>
+            <line number="53" hits="60" branch="false"/>
+            <line number="54" hits="60" branch="false"/>
+            <line number="55" hits="60" branch="false"/>
+            <line number="66" hits="60" branch="false"/>
+            <line number="73" hits="60" branch="false"/>
+            <line number="93" hits="243" branch="false"/>
+            <line number="94" hits="243" branch="false"/>
+            <line number="97" hits="243" branch="false"/>
+            <line number="98" hits="243" branch="false"/>
+            <line number="99" hits="243" branch="false"/>
+            <line number="102" hits="243" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.config.ConfigParser"
+               filename="org/apache/commons/chain/config/ConfigParser.java" line-rate="0.8333333333333334"
+               branch-rate="0.6666666666666666" complexity="1.2857142857142858">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="38" hits="63" branch="false"/>
+                <line number="47" hits="63" branch="false"/>
+                <line number="54" hits="63" branch="false"/>
+                <line number="60" hits="63" branch="false"/>
+              </lines>
+            </method>
+            <method name="getDigester" signature="()Lorg/apache/commons/digester/Digester;" line-rate="1.0"
+                    branch-rate="0.5">
+              <lines>
+                <line number="73" hits="60" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="74" hits="60" branch="false"/>
+                <line number="75" hits="60" branch="false"/>
+                <line number="76" hits="60" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="60" branch="false"/>
+                <line number="78" hits="60" branch="false"/>
+                <line number="79" hits="60" branch="false"/>
+                <line number="81" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="getRuleSet" signature="()Lorg/apache/commons/digester/RuleSet;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="93" hits="66" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="94" hits="60" branch="false"/>
+                <line number="96" hits="66" branch="false"/>
+              </lines>
+            </method>
+            <method name="getUseContextClassLoader" signature="()Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="123" hits="66" branch="false"/>
+              </lines>
+            </method>
+            <method name="parse" signature="(Ljava/net/URL;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="186" hits="27" branch="false"/>
+                <line number="187" hits="27" branch="false"/>
+                <line number="190" hits="27" branch="false"/>
+                <line number="192" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="parse" signature="(Lorg/apache/commons/chain/Catalog;Ljava/net/URL;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="162" hits="27" branch="false"/>
+                <line number="163" hits="27" branch="false"/>
+                <line number="164" hits="27" branch="false"/>
+                <line number="167" hits="27" branch="false"/>
+                <line number="169" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="setRuleSet" signature="(Lorg/apache/commons/digester/RuleSet;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="109" hits="0" branch="false"/>
+                <line number="110" hits="0" branch="false"/>
+                <line number="112" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setUseContextClassLoader" signature="(Z)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="135" hits="0" branch="false"/>
+                <line number="137" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="38" hits="63" branch="false"/>
+            <line number="47" hits="63" branch="false"/>
+            <line number="54" hits="63" branch="false"/>
+            <line number="60" hits="63" branch="false"/>
+            <line number="73" hits="60" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="74" hits="60" branch="false"/>
+            <line number="75" hits="60" branch="false"/>
+            <line number="76" hits="60" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="60" branch="false"/>
+            <line number="78" hits="60" branch="false"/>
+            <line number="79" hits="60" branch="false"/>
+            <line number="81" hits="60" branch="false"/>
+            <line number="93" hits="66" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="94" hits="60" branch="false"/>
+            <line number="96" hits="66" branch="false"/>
+            <line number="109" hits="0" branch="false"/>
+            <line number="110" hits="0" branch="false"/>
+            <line number="112" hits="0" branch="false"/>
+            <line number="123" hits="66" branch="false"/>
+            <line number="135" hits="0" branch="false"/>
+            <line number="137" hits="0" branch="false"/>
+            <line number="162" hits="27" branch="false"/>
+            <line number="163" hits="27" branch="false"/>
+            <line number="164" hits="27" branch="false"/>
+            <line number="167" hits="27" branch="false"/>
+            <line number="169" hits="27" branch="false"/>
+            <line number="186" hits="27" branch="false"/>
+            <line number="187" hits="27" branch="false"/>
+            <line number="190" hits="27" branch="false"/>
+            <line number="192" hits="27" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.config.ConfigRegisterRule"
+               filename="org/apache/commons/chain/config/ConfigRegisterRule.java" line-rate="0.8888888888888888"
+               branch-rate="0.5833333333333334" complexity="5.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="363" branch="false"/>
+                <line number="53" hits="363" branch="false"/>
+                <line number="54" hits="363" branch="false"/>
+                <line number="64" hits="363" branch="false"/>
+              </lines>
+            </method>
+            <method name="begin" signature="(Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V"
+                    line-rate="0.8571428571428571" branch-rate="0.5833333333333334">
+              <lines>
+                <line number="84" hits="2214" branch="false"/>
+                <line number="85" hits="2214" branch="true" condition-coverage="50% (2/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="87" hits="0" branch="false"/>
+                <line number="89" hits="2214" branch="false"/>
+                <line number="92" hits="2214" branch="false"/>
+                <line number="93" hits="2214" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="94" hits="0" branch="false"/>
+                <line number="98" hits="2214" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="99" hits="918" branch="false"/>
+                <line number="100" hits="918" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="101" hits="918" branch="false"/>
+                <line number="103" hits="918" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="104" hits="1296" branch="false"/>
+                <line number="107" hits="2214" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="52" hits="363" branch="false"/>
+            <line number="53" hits="363" branch="false"/>
+            <line number="54" hits="363" branch="false"/>
+            <line number="64" hits="363" branch="false"/>
+            <line number="84" hits="2214" branch="false"/>
+            <line number="85" hits="2214" branch="true" condition-coverage="50% (2/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="87" hits="0" branch="false"/>
+            <line number="89" hits="2214" branch="false"/>
+            <line number="92" hits="2214" branch="false"/>
+            <line number="93" hits="2214" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="94" hits="0" branch="false"/>
+            <line number="98" hits="2214" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="99" hits="918" branch="false"/>
+            <line number="100" hits="918" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="101" hits="918" branch="false"/>
+            <line number="103" hits="918" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="104" hits="1296" branch="false"/>
+            <line number="107" hits="2214" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.config.ConfigRuleSet"
+               filename="org/apache/commons/chain/config/ConfigRuleSet.java" line-rate="0.6046511627906976"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="80" hits="60" branch="false"/>
+                <line number="86" hits="60" branch="false"/>
+                <line number="87" hits="60" branch="false"/>
+                <line number="88" hits="60" branch="false"/>
+                <line number="89" hits="60" branch="false"/>
+                <line number="90" hits="60" branch="false"/>
+                <line number="91" hits="60" branch="false"/>
+                <line number="92" hits="60" branch="false"/>
+                <line number="93" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="addRuleInstances" signature="(Lorg/apache/commons/digester/Digester;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="272" hits="60" branch="false"/>
+                <line number="274" hits="60" branch="false"/>
+                <line number="277" hits="60" branch="false"/>
+                <line number="280" hits="60" branch="false"/>
+                <line number="281" hits="60" branch="false"/>
+                <line number="285" hits="60" branch="false"/>
+                <line number="288" hits="60" branch="false"/>
+                <line number="289" hits="60" branch="false"/>
+                <line number="293" hits="60" branch="false"/>
+                <line number="297" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalogClass" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalogElement" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="126" hits="120" branch="false"/>
+              </lines>
+            </method>
+            <method name="getChainClass" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="146" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="getChainElement" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="167" hits="186" branch="false"/>
+              </lines>
+            </method>
+            <method name="getClassAttribute" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="186" hits="186" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommandElement" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="205" hits="186" branch="false"/>
+              </lines>
+            </method>
+            <method name="getDefineElement" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="224" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="getNameAttribute" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="243" hits="66" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalogClass" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="117" hits="0" branch="false"/>
+                <line number="118" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalogElement" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="136" hits="0" branch="false"/>
+                <line number="137" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setChainClass" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="158" hits="0" branch="false"/>
+                <line number="159" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setChainElement" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="177" hits="0" branch="false"/>
+                <line number="178" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setClassAttribute" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="196" hits="0" branch="false"/>
+                <line number="197" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCommandElement" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="215" hits="0" branch="false"/>
+                <line number="216" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setDefineElement" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="234" hits="0" branch="false"/>
+                <line number="235" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setNameAttribute" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="253" hits="0" branch="false"/>
+                <line number="254" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="80" hits="60" branch="false"/>
+            <line number="86" hits="60" branch="false"/>
+            <line number="87" hits="60" branch="false"/>
+            <line number="88" hits="60" branch="false"/>
+            <line number="89" hits="60" branch="false"/>
+            <line number="90" hits="60" branch="false"/>
+            <line number="91" hits="60" branch="false"/>
+            <line number="92" hits="60" branch="false"/>
+            <line number="93" hits="60" branch="false"/>
+            <line number="105" hits="0" branch="false"/>
+            <line number="117" hits="0" branch="false"/>
+            <line number="118" hits="0" branch="false"/>
+            <line number="126" hits="120" branch="false"/>
+            <line number="136" hits="0" branch="false"/>
+            <line number="137" hits="0" branch="false"/>
+            <line number="146" hits="60" branch="false"/>
+            <line number="158" hits="0" branch="false"/>
+            <line number="159" hits="0" branch="false"/>
+            <line number="167" hits="186" branch="false"/>
+            <line number="177" hits="0" branch="false"/>
+            <line number="178" hits="0" branch="false"/>
+            <line number="186" hits="186" branch="false"/>
+            <line number="196" hits="0" branch="false"/>
+            <line number="197" hits="0" branch="false"/>
+            <line number="205" hits="186" branch="false"/>
+            <line number="215" hits="0" branch="false"/>
+            <line number="216" hits="0" branch="false"/>
+            <line number="224" hits="60" branch="false"/>
+            <line number="234" hits="0" branch="false"/>
+            <line number="235" hits="0" branch="false"/>
+            <line number="243" hits="66" branch="false"/>
+            <line number="253" hits="0" branch="false"/>
+            <line number="254" hits="0" branch="false"/>
+            <line number="272" hits="60" branch="false"/>
+            <line number="274" hits="60" branch="false"/>
+            <line number="277" hits="60" branch="false"/>
+            <line number="280" hits="60" branch="false"/>
+            <line number="281" hits="60" branch="false"/>
+            <line number="285" hits="60" branch="false"/>
+            <line number="288" hits="60" branch="false"/>
+            <line number="289" hits="60" branch="false"/>
+            <line number="293" hits="60" branch="false"/>
+            <line number="297" hits="60" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+    <package name="org.apache.commons.chain.generic" line-rate="0.6388888888888888" branch-rate="0.515625"
+             complexity="1.98">
+      <classes>
+        <class name="org.apache.commons.chain.generic.CopyCommand"
+               filename="org/apache/commons/chain/generic/CopyCommand.java" line-rate="0.0" branch-rate="0.0"
+               complexity="1.2857142857142858">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="32" hits="0" branch="false"/>
+                <line number="38" hits="0" branch="false"/>
+                <line number="64" hits="0" branch="false"/>
+                <line number="90" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="130" hits="0" branch="false"/>
+                <line number="132" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="0" branch="false"/>
+                <line number="136" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="137" hits="0" branch="false"/>
+                <line number="139" hits="0" branch="false"/>
+                <line number="142" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getFromKey" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="47" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getToKey" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getValue" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="99" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setFromKey" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="59" hits="0" branch="false"/>
+                <line number="61" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setToKey" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+                <line number="87" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setValue" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="111" hits="0" branch="false"/>
+                <line number="113" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="32" hits="0" branch="false"/>
+            <line number="38" hits="0" branch="false"/>
+            <line number="47" hits="0" branch="false"/>
+            <line number="59" hits="0" branch="false"/>
+            <line number="61" hits="0" branch="false"/>
+            <line number="64" hits="0" branch="false"/>
+            <line number="73" hits="0" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="87" hits="0" branch="false"/>
+            <line number="90" hits="0" branch="false"/>
+            <line number="99" hits="0" branch="false"/>
+            <line number="111" hits="0" branch="false"/>
+            <line number="113" hits="0" branch="false"/>
+            <line number="130" hits="0" branch="false"/>
+            <line number="132" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="0" branch="false"/>
+            <line number="136" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="137" hits="0" branch="false"/>
+            <line number="139" hits="0" branch="false"/>
+            <line number="142" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.generic.DispatchCommand"
+               filename="org/apache/commons/chain/generic/DispatchCommand.java" line-rate="0.8157894736842105"
+               branch-rate="0.625" complexity="2.4444444444444446">
+          <methods>
+            <method name="&lt;clinit&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="49" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="34" hits="9" branch="false"/>
+                <line number="37" hits="9" branch="false"/>
+                <line number="40" hits="9" branch="false"/>
+                <line number="43" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="class$" signature="(Ljava/lang/String;)Ljava/lang/Class;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+              </lines>
+            </method>
+            <method name="evaluateResult" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.75">
+              <lines>
+                <line number="128" hits="9" branch="false"/>
+                <line number="129" hits="9" branch="true" condition-coverage="75% (3/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="0.3333333333333333"
+                    branch-rate="0.5">
+              <lines>
+                <line number="65" hits="9" branch="true" condition-coverage="75% (3/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="66" hits="0" branch="false"/>
+                <line number="69" hits="9" branch="false"/>
+                <line number="72" hits="9" branch="false"/>
+                <line number="73" hits="0" branch="false"/>
+                <line number="74" hits="0" branch="false"/>
+                <line number="75" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="76" hits="0" branch="false"/>
+                <line number="78" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="extractMethod" signature="(Lorg/apache/commons/chain/Context;)Ljava/lang/reflect/Method;"
+                    line-rate="0.9285714285714286" branch-rate="0.6666666666666666">
+              <lines>
+                <line number="94" hits="9" branch="false"/>
+                <line number="96" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="97" hits="3" branch="false"/>
+                <line number="98" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="99" hits="0" branch="false"/>
+                <line number="101" hits="3" branch="false"/>
+                <line number="105" hits="9" branch="false"/>
+                <line number="107" hits="9" branch="false"/>
+                <line number="108" hits="9" branch="false"/>
+                <line number="110" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="111" hits="9" branch="false"/>
+                <line number="112" hits="9" branch="false"/>
+                <line number="114" hits="9" branch="false"/>
+                <line number="116" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="getArguments" signature="(Lorg/apache/commons/chain/Context;)[Ljava/lang/Object;"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="151" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="getMethod" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="159" hits="18" branch="false"/>
+              </lines>
+            </method>
+            <method name="getMethodKey" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="167" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="getSignature" signature="()[Ljava/lang/Class;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="138" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="setMethod" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="175" hits="6" branch="false"/>
+                <line number="176" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="setMethodKey" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="183" hits="3" branch="false"/>
+                <line number="184" hits="3" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="34" hits="9" branch="false"/>
+            <line number="37" hits="9" branch="false"/>
+            <line number="40" hits="9" branch="false"/>
+            <line number="43" hits="9" branch="false"/>
+            <line number="49" hits="6" branch="false"/>
+            <line number="65" hits="9" branch="true" condition-coverage="75% (3/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="66" hits="0" branch="false"/>
+            <line number="69" hits="9" branch="false"/>
+            <line number="72" hits="9" branch="false"/>
+            <line number="73" hits="0" branch="false"/>
+            <line number="74" hits="0" branch="false"/>
+            <line number="75" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="76" hits="0" branch="false"/>
+            <line number="78" hits="0" branch="false"/>
+            <line number="94" hits="9" branch="false"/>
+            <line number="96" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="97" hits="3" branch="false"/>
+            <line number="98" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="99" hits="0" branch="false"/>
+            <line number="101" hits="3" branch="false"/>
+            <line number="105" hits="9" branch="false"/>
+            <line number="107" hits="9" branch="false"/>
+            <line number="108" hits="9" branch="false"/>
+            <line number="110" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="111" hits="9" branch="false"/>
+            <line number="112" hits="9" branch="false"/>
+            <line number="114" hits="9" branch="false"/>
+            <line number="116" hits="9" branch="false"/>
+            <line number="128" hits="9" branch="false"/>
+            <line number="129" hits="9" branch="true" condition-coverage="75% (3/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="138" hits="6" branch="false"/>
+            <line number="151" hits="6" branch="false"/>
+            <line number="159" hits="18" branch="false"/>
+            <line number="167" hits="6" branch="false"/>
+            <line number="175" hits="6" branch="false"/>
+            <line number="176" hits="6" branch="false"/>
+            <line number="183" hits="3" branch="false"/>
+            <line number="184" hits="3" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.generic.DispatchLookupCommand"
+               filename="org/apache/commons/chain/generic/DispatchLookupCommand.java" line-rate="0.8717948717948718"
+               branch-rate="0.625" complexity="2.0">
+          <methods>
+            <method name="&lt;clinit&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="81" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="64" hits="18" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="(Lorg/apache/commons/chain/CatalogFactory;)V" line-rate="0.6"
+                    branch-rate="1.0">
+              <lines>
+                <line number="72" hits="0" branch="false"/>
+                <line number="73" hits="0" branch="false"/>
+                <line number="87" hits="9" branch="false"/>
+                <line number="92" hits="9" branch="false"/>
+                <line number="93" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="class$" signature="(Ljava/lang/String;)Ljava/lang/Class;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="82" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="0.7777777777777778"
+                    branch-rate="0.6">
+              <lines>
+                <line number="142" hits="15" branch="true" condition-coverage="75% (3/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="143" hits="0" branch="false"/>
+                <line number="148" hits="15" branch="false"/>
+                <line number="150" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="151" hits="12" branch="false"/>
+                <line number="152" hits="12" branch="false"/>
+                <line number="153" hits="12" branch="false"/>
+                <line number="155" hits="12" branch="true" condition-coverage="50% (2/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="157" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="extractMethod"
+                    signature="(Lorg/apache/commons/chain/Command;Lorg/apache/commons/chain/Context;)Ljava/lang/reflect/Method;"
+                    line-rate="0.9285714285714286" branch-rate="0.6666666666666666">
+              <lines>
+                <line number="214" hits="12" branch="false"/>
+                <line number="216" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="217" hits="6" branch="false"/>
+                <line number="218" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="219" hits="0" branch="false"/>
+                <line number="222" hits="6" branch="false"/>
+                <line number="226" hits="12" branch="false"/>
+                <line number="228" hits="12" branch="false"/>
+                <line number="229" hits="12" branch="false"/>
+                <line number="231" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="232" hits="12" branch="false"/>
+                <line number="234" hits="12" branch="false"/>
+                <line number="236" hits="12" branch="false"/>
+                <line number="238" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="getArguments" signature="(Lorg/apache/commons/chain/Context;)[Ljava/lang/Object;"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="189" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="getMethod" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="100" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="getMethodKey" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="108" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="getSignature" signature="()[Ljava/lang/Class;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="174" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="setMethod" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="116" hits="9" branch="false"/>
+                <line number="117" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="setMethodKey" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="124" hits="6" branch="false"/>
+                <line number="125" hits="6" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="64" hits="18" branch="false"/>
+            <line number="72" hits="0" branch="false"/>
+            <line number="73" hits="0" branch="false"/>
+            <line number="81" hits="3" branch="false"/>
+            <line number="82" hits="3" branch="false"/>
+            <line number="87" hits="9" branch="false"/>
+            <line number="92" hits="9" branch="false"/>
+            <line number="93" hits="9" branch="false"/>
+            <line number="100" hits="27" branch="false"/>
+            <line number="108" hits="12" branch="false"/>
+            <line number="116" hits="9" branch="false"/>
+            <line number="117" hits="9" branch="false"/>
+            <line number="124" hits="6" branch="false"/>
+            <line number="125" hits="6" branch="false"/>
+            <line number="142" hits="15" branch="true" condition-coverage="75% (3/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="143" hits="0" branch="false"/>
+            <line number="148" hits="15" branch="false"/>
+            <line number="150" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="151" hits="12" branch="false"/>
+            <line number="152" hits="12" branch="false"/>
+            <line number="153" hits="12" branch="false"/>
+            <line number="155" hits="12" branch="true" condition-coverage="50% (2/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="157" hits="0" branch="false"/>
+            <line number="174" hits="12" branch="false"/>
+            <line number="189" hits="12" branch="false"/>
+            <line number="214" hits="12" branch="false"/>
+            <line number="216" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="217" hits="6" branch="false"/>
+            <line number="218" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="219" hits="0" branch="false"/>
+            <line number="222" hits="6" branch="false"/>
+            <line number="226" hits="12" branch="false"/>
+            <line number="228" hits="12" branch="false"/>
+            <line number="229" hits="12" branch="false"/>
+            <line number="231" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="232" hits="12" branch="false"/>
+            <line number="234" hits="12" branch="false"/>
+            <line number="236" hits="12" branch="false"/>
+            <line number="238" hits="12" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.generic.LookupCommand"
+               filename="org/apache/commons/chain/generic/LookupCommand.java" line-rate="0.6578947368421053"
+               branch-rate="0.4642857142857143" complexity="2.142857142857143">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="59" hits="24" branch="false"/>
+                <line number="60" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="(Lorg/apache/commons/chain/CatalogFactory;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="70" hits="24" branch="false"/>
+                <line number="71" hits="24" branch="false"/>
+                <line number="72" hits="24" branch="false"/>
+                <line number="77" hits="24" branch="false"/>
+                <line number="103" hits="24" branch="false"/>
+                <line number="130" hits="24" branch="false"/>
+                <line number="158" hits="24" branch="false"/>
+                <line number="186" hits="24" branch="false"/>
+                <line number="212" hits="24" branch="false"/>
+                <line number="245" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="0.8571428571428571"
+                    branch-rate="0.75">
+              <lines>
+                <line number="303" hits="15" branch="false"/>
+                <line number="304" hits="15" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="305" hits="15" branch="false"/>
+                <line number="306" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="307" hits="3" branch="false"/>
+                <line number="309" hits="12" branch="false"/>
+                <line number="311" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalog" signature="(Lorg/apache/commons/chain/Context;)Lorg/apache/commons/chain/Catalog;"
+                    line-rate="0.6153846153846154" branch-rate="0.375">
+              <lines>
+                <line number="361" hits="30" branch="false"/>
+                <line number="362" hits="30" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="363" hits="0" branch="false"/>
+                <line number="366" hits="30" branch="false"/>
+                <line number="367" hits="30" branch="false"/>
+                <line number="368" hits="30" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="370" hits="30" branch="false"/>
+                <line number="372" hits="0" branch="false"/>
+                <line number="374" hits="30" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="375" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="376" hits="0" branch="false"/>
+                <line number="379" hits="0" branch="false"/>
+                <line number="384" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalogFactory" signature="()Lorg/apache/commons/chain/CatalogFactory;" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="99" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalogName" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="112" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommand" signature="(Lorg/apache/commons/chain/Context;)Lorg/apache/commons/chain/Command;"
+                    line-rate="0.8181818181818182" branch-rate="0.625">
+              <lines>
+                <line number="398" hits="30" branch="false"/>
+                <line number="400" hits="30" branch="false"/>
+                <line number="401" hits="30" branch="false"/>
+                <line number="402" hits="30" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="403" hits="30" branch="false"/>
+                <line number="404" hits="30" branch="true" condition-coverage="75% (3/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="405" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="406" hits="3" branch="false"/>
+                <line number="410" hits="0" branch="false"/>
+                <line number="415" hits="27" branch="false"/>
+                <line number="417" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommandName" signature="(Lorg/apache/commons/chain/Context;)Ljava/lang/String;"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="432" hits="30" branch="false"/>
+                <line number="433" hits="30" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="434" hits="6" branch="false"/>
+                <line number="436" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="getName" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="140" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="getNameKey" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="168" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="isIgnoreExecuteResult" signature="()Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="226" hits="15" branch="false"/>
+              </lines>
+            </method>
+            <method name="isIgnorePostprocessResult" signature="()Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="260" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="isOptional" signature="()Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="196" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="postprocess" signature="(Lorg/apache/commons/chain/Context;Ljava/lang/Exception;)Z"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="332" hits="0" branch="false"/>
+                <line number="333" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="334" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="335" hits="0" branch="false"/>
+                <line number="336" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="337" hits="0" branch="false"/>
+                <line number="339" hits="0" branch="false"/>
+                <line number="342" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalogFactory" signature="(Lorg/apache/commons/chain/CatalogFactory;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="88" hits="0" branch="false"/>
+                <line number="89" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalogName" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="0" branch="false"/>
+                <line number="127" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setIgnoreExecuteResult" signature="(Z)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="242" hits="3" branch="false"/>
+                <line number="243" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="setIgnorePostprocessResult" signature="(Z)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="276" hits="0" branch="false"/>
+                <line number="277" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setName" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="153" hits="18" branch="false"/>
+                <line number="155" hits="18" branch="false"/>
+              </lines>
+            </method>
+            <method name="setNameKey" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="181" hits="6" branch="false"/>
+                <line number="183" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="setOptional" signature="(Z)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="208" hits="0" branch="false"/>
+                <line number="210" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="59" hits="24" branch="false"/>
+            <line number="60" hits="24" branch="false"/>
+            <line number="70" hits="24" branch="false"/>
+            <line number="71" hits="24" branch="false"/>
+            <line number="72" hits="24" branch="false"/>
+            <line number="77" hits="24" branch="false"/>
+            <line number="88" hits="0" branch="false"/>
+            <line number="89" hits="0" branch="false"/>
+            <line number="99" hits="0" branch="false"/>
+            <line number="103" hits="24" branch="false"/>
+            <line number="112" hits="30" branch="false"/>
+            <line number="125" hits="0" branch="false"/>
+            <line number="127" hits="0" branch="false"/>
+            <line number="130" hits="24" branch="false"/>
+            <line number="140" hits="30" branch="false"/>
+            <line number="153" hits="18" branch="false"/>
+            <line number="155" hits="18" branch="false"/>
+            <line number="158" hits="24" branch="false"/>
+            <line number="168" hits="6" branch="false"/>
+            <line number="181" hits="6" branch="false"/>
+            <line number="183" hits="6" branch="false"/>
+            <line number="186" hits="24" branch="false"/>
+            <line number="196" hits="3" branch="false"/>
+            <line number="208" hits="0" branch="false"/>
+            <line number="210" hits="0" branch="false"/>
+            <line number="212" hits="24" branch="false"/>
+            <line number="226" hits="15" branch="false"/>
+            <line number="242" hits="3" branch="false"/>
+            <line number="243" hits="3" branch="false"/>
+            <line number="245" hits="24" branch="false"/>
+            <line number="260" hits="0" branch="false"/>
+            <line number="276" hits="0" branch="false"/>
+            <line number="277" hits="0" branch="false"/>
+            <line number="303" hits="15" branch="false"/>
+            <line number="304" hits="15" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="305" hits="15" branch="false"/>
+            <line number="306" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="307" hits="3" branch="false"/>
+            <line number="309" hits="12" branch="false"/>
+            <line number="311" hits="0" branch="false"/>
+            <line number="332" hits="0" branch="false"/>
+            <line number="333" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="334" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="335" hits="0" branch="false"/>
+            <line number="336" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="337" hits="0" branch="false"/>
+            <line number="339" hits="0" branch="false"/>
+            <line number="342" hits="0" branch="false"/>
+            <line number="361" hits="30" branch="false"/>
+            <line number="362" hits="30" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="363" hits="0" branch="false"/>
+            <line number="366" hits="30" branch="false"/>
+            <line number="367" hits="30" branch="false"/>
+            <line number="368" hits="30" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="370" hits="30" branch="false"/>
+            <line number="372" hits="0" branch="false"/>
+            <line number="374" hits="30" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="375" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="376" hits="0" branch="false"/>
+            <line number="379" hits="0" branch="false"/>
+            <line number="384" hits="30" branch="false"/>
+            <line number="398" hits="30" branch="false"/>
+            <line number="400" hits="30" branch="false"/>
+            <line number="401" hits="30" branch="false"/>
+            <line number="402" hits="30" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="403" hits="30" branch="false"/>
+            <line number="404" hits="30" branch="true" condition-coverage="75% (3/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="405" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="406" hits="3" branch="false"/>
+            <line number="410" hits="0" branch="false"/>
+            <line number="415" hits="27" branch="false"/>
+            <line number="417" hits="0" branch="false"/>
+            <line number="432" hits="30" branch="false"/>
+            <line number="433" hits="30" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="434" hits="6" branch="false"/>
+            <line number="436" hits="30" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.generic.RemoveCommand"
+               filename="org/apache/commons/chain/generic/RemoveCommand.java" line-rate="0.0" branch-rate="1.0"
+               complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="31" hits="0" branch="false"/>
+                <line number="37" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="77" hits="0" branch="false"/>
+                <line number="78" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getFromKey" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="46" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setFromKey" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="58" hits="0" branch="false"/>
+                <line number="60" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="31" hits="0" branch="false"/>
+            <line number="37" hits="0" branch="false"/>
+            <line number="46" hits="0" branch="false"/>
+            <line number="58" hits="0" branch="false"/>
+            <line number="60" hits="0" branch="false"/>
+            <line number="77" hits="0" branch="false"/>
+            <line number="78" hits="0" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+    <package name="org.apache.commons.chain.impl" line-rate="0.5766423357664233" branch-rate="0.546875"
+             complexity="2.59375">
+      <classes>
+        <class name="org.apache.commons.chain.impl.CatalogBase"
+               filename="org/apache/commons/chain/impl/CatalogBase.java" line-rate="0.35294117647058826"
+               branch-rate="0.0" complexity="1.3333333333333333">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="56" hits="234" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="(Ljava/util/Map;)V" line-rate="0.25" branch-rate="1.0">
+              <lines>
+                <line number="48" hits="117" branch="false"/>
+                <line number="66" hits="0" branch="false"/>
+                <line number="67" hits="0" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="addCommand" signature="(Ljava/lang/String;Lorg/apache/commons/chain/Command;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="84" hits="999" branch="false"/>
+                <line number="86" hits="999" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommand" signature="(Ljava/lang/String;)Lorg/apache/commons/chain/Command;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="98" hits="318" branch="false"/>
+              </lines>
+            </method>
+            <method name="getNames" signature="()Ljava/util/Iterator;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="111" hits="18" branch="false"/>
+              </lines>
+            </method>
+            <method name="toString" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="121" hits="0" branch="false"/>
+                <line number="122" hits="0" branch="false"/>
+                <line number="125" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="126" hits="0" branch="false"/>
+                <line number="127" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="128" hits="0" branch="false"/>
+                <line number="131" hits="0" branch="false"/>
+                <line number="133" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="48" hits="117" branch="false"/>
+            <line number="56" hits="234" branch="false"/>
+            <line number="66" hits="0" branch="false"/>
+            <line number="67" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="84" hits="999" branch="false"/>
+            <line number="86" hits="999" branch="false"/>
+            <line number="98" hits="318" branch="false"/>
+            <line number="111" hits="18" branch="false"/>
+            <line number="121" hits="0" branch="false"/>
+            <line number="122" hits="0" branch="false"/>
+            <line number="125" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="126" hits="0" branch="false"/>
+            <line number="127" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="128" hits="0" branch="false"/>
+            <line number="131" hits="0" branch="false"/>
+            <line number="133" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.CatalogFactoryBase"
+               filename="org/apache/commons/chain/impl/CatalogFactoryBase.java" line-rate="0.875" branch-rate="1.0"
+               complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="72" branch="false"/>
+                <line number="52" hits="36" branch="false"/>
+                <line number="58" hits="36" branch="false"/>
+              </lines>
+            </method>
+            <method name="addCatalog" signature="(Ljava/lang/String;Lorg/apache/commons/chain/Catalog;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="114" hits="12" branch="false"/>
+                <line number="115" hits="12" branch="false"/>
+                <line number="116" hits="12" branch="false"/>
+                <line number="118" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalog" signature="()Lorg/apache/commons/chain/Catalog;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="72" hits="96" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalog" signature="(Ljava/lang/String;)Lorg/apache/commons/chain/Catalog;"
+                    line-rate="0.6666666666666666" branch-rate="1.0">
+              <lines>
+                <line number="98" hits="75" branch="false"/>
+                <line number="99" hits="75" branch="false"/>
+                <line number="100" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getNames" signature="()Ljava/util/Iterator;" line-rate="0.6666666666666666" branch-rate="1.0">
+              <lines>
+                <line number="129" hits="15" branch="false"/>
+                <line number="130" hits="15" branch="false"/>
+                <line number="131" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalog" signature="(Lorg/apache/commons/chain/Catalog;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="84" hits="36" branch="false"/>
+                <line number="86" hits="36" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="72" branch="false"/>
+            <line number="52" hits="36" branch="false"/>
+            <line number="58" hits="36" branch="false"/>
+            <line number="72" hits="96" branch="false"/>
+            <line number="84" hits="36" branch="false"/>
+            <line number="86" hits="36" branch="false"/>
+            <line number="98" hits="75" branch="false"/>
+            <line number="99" hits="75" branch="false"/>
+            <line number="100" hits="0" branch="false"/>
+            <line number="114" hits="12" branch="false"/>
+            <line number="115" hits="12" branch="false"/>
+            <line number="116" hits="12" branch="false"/>
+            <line number="118" hits="12" branch="false"/>
+            <line number="129" hits="15" branch="false"/>
+            <line number="130" hits="15" branch="false"/>
+            <line number="131" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ChainBase" filename="org/apache/commons/chain/impl/ChainBase.java"
+               line-rate="0.576271186440678" branch-rate="0.5" complexity="4.285714285714286">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="44" hits="552" branch="false"/>
+                <line number="46" hits="552" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="(Ljava/util/Collection;)V" line-rate="0.2222222222222222"
+                    branch-rate="0.0">
+              <lines>
+                <line number="97" hits="0" branch="false"/>
+                <line number="99" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="100" hits="0" branch="false"/>
+                <line number="102" hits="0" branch="false"/>
+                <line number="103" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="104" hits="0" branch="false"/>
+                <line number="107" hits="0" branch="false"/>
+                <line number="118" hits="552" branch="false"/>
+                <line number="125" hits="552" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="(Lorg/apache/commons/chain/Command;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="58" hits="0" branch="false"/>
+                <line number="60" hits="0" branch="false"/>
+                <line number="62" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="([Lorg/apache/commons/chain/Command;)V" line-rate="0.0"
+                    branch-rate="0.0">
+              <lines>
+                <line number="75" hits="0" branch="false"/>
+                <line number="77" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="78" hits="0" branch="false"/>
+                <line number="80" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="81" hits="0" branch="false"/>
+                <line number="84" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="addCommand" signature="(Lorg/apache/commons/chain/Command;)V" line-rate="0.7777777777777778"
+                    branch-rate="0.5">
+              <lines>
+                <line number="142" hits="1416" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="143" hits="0" branch="false"/>
+                <line number="145" hits="1416" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="146" hits="0" branch="false"/>
+                <line number="148" hits="1416" branch="false"/>
+                <line number="149" hits="1416" branch="false"/>
+                <line number="150" hits="1416" branch="false"/>
+                <line number="151" hits="1416" branch="false"/>
+                <line number="153" hits="1416" branch="false"/>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="0.7586206896551724"
+                    branch-rate="0.7222222222222222">
+              <lines>
+                <line number="176" hits="99" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="177" hits="0" branch="false"/>
+                <line number="181" hits="99" branch="false"/>
+                <line number="185" hits="99" branch="false"/>
+                <line number="186" hits="99" branch="false"/>
+                <line number="187" hits="99" branch="false"/>
+                <line number="188" hits="99" branch="false"/>
+                <line number="189" hits="261" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="191" hits="237" branch="false"/>
+                <line number="192" hits="237" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="193" hits="75" branch="false"/>
+                <line number="195" hits="0" branch="false"/>
+                <line number="196" hits="0" branch="false"/>
+                <line number="197" hits="0" branch="false"/>
+                <line number="198" hits="162" branch="false"/>
+                <line number="202" hits="99" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="203" hits="24" branch="false"/>
+                <line number="205" hits="99" branch="false"/>
+                <line number="206" hits="99" branch="false"/>
+                <line number="207" hits="336" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="208" hits="237" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="210" hits="81" branch="false"/>
+                <line number="213" hits="81" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="214" hits="0" branch="false"/>
+                <line number="216" hits="0" branch="false"/>
+                <line number="218" hits="81" branch="false"/>
+                <line number="223" hits="99" branch="true" condition-coverage="25% (1/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="224" hits="0" branch="false"/>
+                <line number="226" hits="99" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommands" signature="()[Lorg/apache/commons/chain/Command;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="242" hits="15" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="44" hits="552" branch="false"/>
+            <line number="46" hits="552" branch="false"/>
+            <line number="58" hits="0" branch="false"/>
+            <line number="60" hits="0" branch="false"/>
+            <line number="62" hits="0" branch="false"/>
+            <line number="75" hits="0" branch="false"/>
+            <line number="77" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="78" hits="0" branch="false"/>
+            <line number="80" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="81" hits="0" branch="false"/>
+            <line number="84" hits="0" branch="false"/>
+            <line number="97" hits="0" branch="false"/>
+            <line number="99" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="100" hits="0" branch="false"/>
+            <line number="102" hits="0" branch="false"/>
+            <line number="103" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="104" hits="0" branch="false"/>
+            <line number="107" hits="0" branch="false"/>
+            <line number="118" hits="552" branch="false"/>
+            <line number="125" hits="552" branch="false"/>
+            <line number="142" hits="1416" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="143" hits="0" branch="false"/>
+            <line number="145" hits="1416" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="146" hits="0" branch="false"/>
+            <line number="148" hits="1416" branch="false"/>
+            <line number="149" hits="1416" branch="false"/>
+            <line number="150" hits="1416" branch="false"/>
+            <line number="151" hits="1416" branch="false"/>
+            <line number="153" hits="1416" branch="false"/>
+            <line number="176" hits="99" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="177" hits="0" branch="false"/>
+            <line number="181" hits="99" branch="false"/>
+            <line number="185" hits="99" branch="false"/>
+            <line number="186" hits="99" branch="false"/>
+            <line number="187" hits="99" branch="false"/>
+            <line number="188" hits="99" branch="false"/>
+            <line number="189" hits="261" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="191" hits="237" branch="false"/>
+            <line number="192" hits="237" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="193" hits="75" branch="false"/>
+            <line number="195" hits="0" branch="false"/>
+            <line number="196" hits="0" branch="false"/>
+            <line number="197" hits="0" branch="false"/>
+            <line number="198" hits="162" branch="false"/>
+            <line number="202" hits="99" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="203" hits="24" branch="false"/>
+            <line number="205" hits="99" branch="false"/>
+            <line number="206" hits="99" branch="false"/>
+            <line number="207" hits="336" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="208" hits="237" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="210" hits="81" branch="false"/>
+            <line number="213" hits="81" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="214" hits="0" branch="false"/>
+            <line number="216" hits="0" branch="false"/>
+            <line number="218" hits="81" branch="false"/>
+            <line number="223" hits="99" branch="true" condition-coverage="25% (1/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="224" hits="0" branch="false"/>
+            <line number="226" hits="99" branch="false"/>
+            <line number="242" hits="15" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ContextBase"
+               filename="org/apache/commons/chain/impl/ContextBase.java" line-rate="0.7927927927927928"
+               branch-rate="0.7878787878787878" complexity="2.7111111111111112">
+          <methods>
+            <method name="&lt;clinit&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+                <line number="138" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="64" hits="558" branch="false"/>
+                <line number="65" hits="558" branch="false"/>
+                <line number="67" hits="558" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="(Ljava/util/Map;)V" line-rate="0.3333333333333333" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+                <line number="86" hits="0" branch="false"/>
+                <line number="87" hits="0" branch="false"/>
+                <line number="89" hits="0" branch="false"/>
+                <line number="107" hits="558" branch="false"/>
+                <line number="113" hits="558" branch="false"/>
+              </lines>
+            </method>
+            <method name="access$400"
+                    signature="(Lorg/apache/commons/chain/impl/ContextBase;Ljava/lang/Object;)Ljava/util/Map$Entry;"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+              </lines>
+            </method>
+            <method name="access$500" signature="(Lorg/apache/commons/chain/impl/ContextBase;)Ljava/util/Iterator;"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+              </lines>
+            </method>
+            <method name="access$600" signature="(Lorg/apache/commons/chain/impl/ContextBase;Ljava/util/Map$Entry;)Z"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+              </lines>
+            </method>
+            <method name="access$700" signature="(Lorg/apache/commons/chain/impl/ContextBase;)Ljava/util/Iterator;"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="53" hits="816" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="150" hits="24" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="151" hits="6" branch="false"/>
+                <line number="153" hits="18" branch="false"/>
+                <line number="154" hits="207" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="155" hits="189" branch="false"/>
+                <line number="156" hits="189" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="157" hits="27" branch="false"/>
+                <line number="159" hits="189" branch="false"/>
+                <line number="162" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.7692307692307693"
+                    branch-rate="0.7142857142857143">
+              <lines>
+                <line number="179" hits="108" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="180" hits="27" branch="false"/>
+                <line number="184" hits="81" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="185" hits="36" branch="false"/>
+                <line number="189" hits="540" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="190" hits="495" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="191" hits="480" branch="false"/>
+                <line number="192" hits="480" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="193" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="194" hits="0" branch="false"/>
+                <line number="196" hits="480" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="197" hits="0" branch="false"/>
+                <line number="201" hits="45" branch="false"/>
+              </lines>
+            </method>
+            <method name="entriesIterator" signature="()Ljava/util/Iterator;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="428" hits="108" branch="false"/>
+              </lines>
+            </method>
+            <method name="entry" signature="(Ljava/lang/Object;)Ljava/util/Map$Entry;" line-rate="0.6666666666666666"
+                    branch-rate="0.5">
+              <lines>
+                <line number="441" hits="708" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="442" hits="708" branch="false"/>
+                <line number="444" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="217" hits="108" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="0.875">
+              <lines>
+                <line number="243" hits="1593" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="244" hits="561" branch="false"/>
+                <line number="248" hits="1032" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="249" hits="1032" branch="false"/>
+                <line number="251" hits="1032" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="252" hits="816" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="253" hits="783" branch="false"/>
+                <line number="255" hits="33" branch="false"/>
+                <line number="261" hits="216" branch="false"/>
+              </lines>
+            </method>
+            <method name="initialize" signature="()V" line-rate="0.8333333333333334" branch-rate="1.0">
+              <lines>
+                <line number="465" hits="558" branch="false"/>
+                <line number="467" hits="0" branch="false"/>
+                <line number="468" hits="0" branch="false"/>
+                <line number="469" hits="558" branch="false"/>
+                <line number="472" hits="4833" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="473" hits="4275" branch="false"/>
+                <line number="476" hits="4275" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="477" hits="3159" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="478" hits="333" branch="false"/>
+                <line number="480" hits="3159" branch="false"/>
+                <line number="481" hits="3159" branch="false"/>
+                <line number="485" hits="558" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="277" hits="177" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="278" hits="39" branch="false"/>
+                <line number="282" hits="138" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="299" hits="330" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="0.875">
+              <lines>
+                <line number="321" hits="375" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="322" hits="195" branch="false"/>
+                <line number="326" hits="180" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="327" hits="180" branch="false"/>
+                <line number="329" hits="180" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="330" hits="9" branch="false"/>
+                <line number="331" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="332" hits="6" branch="false"/>
+                <line number="334" hits="9" branch="false"/>
+                <line number="335" hits="6" branch="false"/>
+                <line number="340" hits="171" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="360" hits="12" branch="false"/>
+                <line number="361" hits="48" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="362" hits="36" branch="false"/>
+                <line number="363" hits="36" branch="false"/>
+                <line number="364" hits="36" branch="false"/>
+                <line number="366" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="readProperty" signature="(Ljava/beans/PropertyDescriptor;)Ljava/lang/Object;" line-rate="0.5"
+                    branch-rate="0.5">
+              <lines>
+                <line number="502" hits="1269" branch="false"/>
+                <line number="503" hits="1269" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="504" hits="0" branch="false"/>
+                <line number="508" hits="1269" branch="false"/>
+                <line number="509" hits="0" branch="false"/>
+                <line number="510" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="0.8571428571428571"
+                    branch-rate="0.6666666666666666">
+              <lines>
+                <line number="383" hits="36" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="384" hits="9" branch="false"/>
+                <line number="388" hits="27" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="389" hits="27" branch="false"/>
+                <line number="391" hits="27" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="392" hits="0" branch="false"/>
+                <line number="398" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/util/Map$Entry;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="530" hits="0" branch="false"/>
+                <line number="531" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="532" hits="0" branch="false"/>
+                <line number="533" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="534" hits="0" branch="false"/>
+                <line number="536" hits="0" branch="false"/>
+                <line number="537" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="414" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="valuesIterator" signature="()Ljava/util/Iterator;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="549" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="writeProperty" signature="(Ljava/beans/PropertyDescriptor;Ljava/lang/Object;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="570" hits="9" branch="false"/>
+                <line number="571" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="572" hits="3" branch="false"/>
+                <line number="576" hits="6" branch="false"/>
+                <line number="577" hits="3" branch="false"/>
+                <line number="578" hits="3" branch="false"/>
+                <line number="581" hits="6" branch="false"/>
+                <line number="583" hits="6" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="53" hits="816" branch="false"/>
+            <line number="64" hits="558" branch="false"/>
+            <line number="65" hits="558" branch="false"/>
+            <line number="67" hits="558" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="86" hits="0" branch="false"/>
+            <line number="87" hits="0" branch="false"/>
+            <line number="89" hits="0" branch="false"/>
+            <line number="107" hits="558" branch="false"/>
+            <line number="113" hits="558" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="138" hits="3" branch="false"/>
+            <line number="150" hits="24" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="151" hits="6" branch="false"/>
+            <line number="153" hits="18" branch="false"/>
+            <line number="154" hits="207" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="155" hits="189" branch="false"/>
+            <line number="156" hits="189" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="157" hits="27" branch="false"/>
+            <line number="159" hits="189" branch="false"/>
+            <line number="162" hits="24" branch="false"/>
+            <line number="179" hits="108" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="180" hits="27" branch="false"/>
+            <line number="184" hits="81" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="185" hits="36" branch="false"/>
+            <line number="189" hits="540" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="190" hits="495" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="191" hits="480" branch="false"/>
+            <line number="192" hits="480" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="193" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="194" hits="0" branch="false"/>
+            <line number="196" hits="480" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="197" hits="0" branch="false"/>
+            <line number="201" hits="45" branch="false"/>
+            <line number="217" hits="108" branch="false"/>
+            <line number="243" hits="1593" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="244" hits="561" branch="false"/>
+            <line number="248" hits="1032" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="249" hits="1032" branch="false"/>
+            <line number="251" hits="1032" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="252" hits="816" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="253" hits="783" branch="false"/>
+            <line number="255" hits="33" branch="false"/>
+            <line number="261" hits="216" branch="false"/>
+            <line number="277" hits="177" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="278" hits="39" branch="false"/>
+            <line number="282" hits="138" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="299" hits="330" branch="false"/>
+            <line number="321" hits="375" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="322" hits="195" branch="false"/>
+            <line number="326" hits="180" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="327" hits="180" branch="false"/>
+            <line number="329" hits="180" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="330" hits="9" branch="false"/>
+            <line number="331" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="332" hits="6" branch="false"/>
+            <line number="334" hits="9" branch="false"/>
+            <line number="335" hits="6" branch="false"/>
+            <line number="340" hits="171" branch="false"/>
+            <line number="360" hits="12" branch="false"/>
+            <line number="361" hits="48" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="362" hits="36" branch="false"/>
+            <line number="363" hits="36" branch="false"/>
+            <line number="364" hits="36" branch="false"/>
+            <line number="366" hits="12" branch="false"/>
+            <line number="383" hits="36" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="384" hits="9" branch="false"/>
+            <line number="388" hits="27" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="389" hits="27" branch="false"/>
+            <line number="391" hits="27" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="392" hits="0" branch="false"/>
+            <line number="398" hits="27" branch="false"/>
+            <line number="414" hits="0" branch="false"/>
+            <line number="428" hits="108" branch="false"/>
+            <line number="441" hits="708" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="442" hits="708" branch="false"/>
+            <line number="444" hits="0" branch="false"/>
+            <line number="465" hits="558" branch="false"/>
+            <line number="467" hits="0" branch="false"/>
+            <line number="468" hits="0" branch="false"/>
+            <line number="469" hits="558" branch="false"/>
+            <line number="472" hits="4833" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="473" hits="4275" branch="false"/>
+            <line number="476" hits="4275" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="477" hits="3159" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="478" hits="333" branch="false"/>
+            <line number="480" hits="3159" branch="false"/>
+            <line number="481" hits="3159" branch="false"/>
+            <line number="485" hits="558" branch="false"/>
+            <line number="502" hits="1269" branch="false"/>
+            <line number="503" hits="1269" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="504" hits="0" branch="false"/>
+            <line number="508" hits="1269" branch="false"/>
+            <line number="509" hits="0" branch="false"/>
+            <line number="510" hits="0" branch="false"/>
+            <line number="530" hits="0" branch="false"/>
+            <line number="531" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="532" hits="0" branch="false"/>
+            <line number="533" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="534" hits="0" branch="false"/>
+            <line number="536" hits="0" branch="false"/>
+            <line number="537" hits="0" branch="false"/>
+            <line number="549" hits="0" branch="false"/>
+            <line number="570" hits="9" branch="false"/>
+            <line number="571" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="572" hits="3" branch="false"/>
+            <line number="576" hits="6" branch="false"/>
+            <line number="577" hits="3" branch="false"/>
+            <line number="578" hits="3" branch="false"/>
+            <line number="581" hits="6" branch="false"/>
+            <line number="583" hits="6" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ContextBase$1"
+               filename="org/apache/commons/chain/impl/ContextBase.java" line-rate="0.5" branch-rate="1.0"
+               complexity="2.7111111111111112">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="126" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="127" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="126" hits="3" branch="false"/>
+            <line number="127" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ContextBase$EntrySetImpl"
+               filename="org/apache/commons/chain/impl/ContextBase.java" line-rate="0.125" branch-rate="0.0"
+               complexity="2.7111111111111112">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Lorg/apache/commons/chain/impl/ContextBase;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;"
+                    signature="(Lorg/apache/commons/chain/impl/ContextBase;Lorg/apache/commons/chain/impl/ContextBase$1;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="593" hits="216" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="596" hits="0" branch="false"/>
+                <line number="597" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="contains" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="600" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="601" hits="0" branch="false"/>
+                <line number="603" hits="0" branch="false"/>
+                <line number="604" hits="0" branch="false"/>
+                <line number="605" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="606" hits="0" branch="false"/>
+                <line number="608" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="613" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="iterator" signature="()Ljava/util/Iterator;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="617" hits="108" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="621" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="622" hits="0" branch="false"/>
+                <line number="624" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="629" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="593" hits="216" branch="false"/>
+            <line number="596" hits="0" branch="false"/>
+            <line number="597" hits="0" branch="false"/>
+            <line number="600" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="601" hits="0" branch="false"/>
+            <line number="603" hits="0" branch="false"/>
+            <line number="604" hits="0" branch="false"/>
+            <line number="605" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="606" hits="0" branch="false"/>
+            <line number="608" hits="0" branch="false"/>
+            <line number="613" hits="0" branch="false"/>
+            <line number="617" hits="108" branch="false"/>
+            <line number="621" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="622" hits="0" branch="false"/>
+            <line number="624" hits="0" branch="false"/>
+            <line number="629" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ContextBase$EntrySetIterator"
+               filename="org/apache/commons/chain/impl/ContextBase.java" line-rate="0.75" branch-rate="1.0"
+               complexity="2.7111111111111112">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Lorg/apache/commons/chain/impl/ContextBase;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="641" hits="108" branch="false"/>
+                <line number="642" hits="108" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;"
+                    signature="(Lorg/apache/commons/chain/impl/ContextBase;Lorg/apache/commons/chain/impl/ContextBase$1;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="639" hits="216" branch="false"/>
+              </lines>
+            </method>
+            <method name="hasNext" signature="()Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="645" hits="816" branch="false"/>
+              </lines>
+            </method>
+            <method name="next" signature="()Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="649" hits="708" branch="false"/>
+                <line number="650" hits="708" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="654" hits="0" branch="false"/>
+                <line number="655" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="639" hits="216" branch="false"/>
+            <line number="641" hits="108" branch="false"/>
+            <line number="642" hits="108" branch="false"/>
+            <line number="645" hits="816" branch="false"/>
+            <line number="649" hits="708" branch="false"/>
+            <line number="650" hits="708" branch="false"/>
+            <line number="654" hits="0" branch="false"/>
+            <line number="655" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ContextBase$MapEntryImpl"
+               filename="org/apache/commons/chain/impl/ContextBase.java" line-rate="0.2916666666666667"
+               branch-rate="0.16666666666666666" complexity="2.7111111111111112">
+          <methods>
+            <method name="&lt;init&gt;"
+                    signature="(Lorg/apache/commons/chain/impl/ContextBase;Ljava/lang/Object;Ljava/lang/Object;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="666" hits="708" branch="false"/>
+                <line number="667" hits="708" branch="false"/>
+                <line number="668" hits="708" branch="false"/>
+                <line number="669" hits="708" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="675" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="676" hits="0" branch="false"/>
+                <line number="677" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="678" hits="0" branch="false"/>
+                <line number="680" hits="0" branch="false"/>
+                <line number="681" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="682" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="684" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="685" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="686" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="688" hits="0" branch="false"/>
+                <line number="691" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getKey" signature="()Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="696" hits="36" branch="false"/>
+              </lines>
+            </method>
+            <method name="getValue" signature="()Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="700" hits="36" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="0.75">
+              <lines>
+                <line number="704" hits="672" branch="true" condition-coverage="75% (3/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="setValue" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="709" hits="0" branch="false"/>
+                <line number="710" hits="0" branch="false"/>
+                <line number="711" hits="0" branch="false"/>
+                <line number="712" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="toString" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="716" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="666" hits="708" branch="false"/>
+            <line number="667" hits="708" branch="false"/>
+            <line number="668" hits="708" branch="false"/>
+            <line number="669" hits="708" branch="false"/>
+            <line number="675" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="676" hits="0" branch="false"/>
+            <line number="677" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="678" hits="0" branch="false"/>
+            <line number="680" hits="0" branch="false"/>
+            <line number="681" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="682" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="684" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="685" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="686" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="688" hits="0" branch="false"/>
+            <line number="691" hits="0" branch="false"/>
+            <line number="696" hits="36" branch="false"/>
+            <line number="700" hits="36" branch="false"/>
+            <line number="704" hits="672" branch="true" condition-coverage="75% (3/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="709" hits="0" branch="false"/>
+            <line number="710" hits="0" branch="false"/>
+            <line number="711" hits="0" branch="false"/>
+            <line number="712" hits="0" branch="false"/>
+            <line number="716" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ContextBase$ValuesImpl"
+               filename="org/apache/commons/chain/impl/ContextBase.java" line-rate="0.0" branch-rate="0.0"
+               complexity="2.7111111111111112">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Lorg/apache/commons/chain/impl/ContextBase;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;"
+                    signature="(Lorg/apache/commons/chain/impl/ContextBase;Lorg/apache/commons/chain/impl/ContextBase$1;)V"
+                    line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="725" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="728" hits="0" branch="false"/>
+                <line number="729" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="contains" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="732" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="733" hits="0" branch="false"/>
+                <line number="735" hits="0" branch="false"/>
+                <line number="736" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="740" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="iterator" signature="()Ljava/util/Iterator;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="744" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="748" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="749" hits="0" branch="false"/>
+                <line number="751" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="756" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="725" hits="0" branch="false"/>
+            <line number="728" hits="0" branch="false"/>
+            <line number="729" hits="0" branch="false"/>
+            <line number="732" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="733" hits="0" branch="false"/>
+            <line number="735" hits="0" branch="false"/>
+            <line number="736" hits="0" branch="false"/>
+            <line number="740" hits="0" branch="false"/>
+            <line number="744" hits="0" branch="false"/>
+            <line number="748" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="749" hits="0" branch="false"/>
+            <line number="751" hits="0" branch="false"/>
+            <line number="756" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.impl.ContextBase$ValuesIterator"
+               filename="org/apache/commons/chain/impl/ContextBase.java" line-rate="0.0" branch-rate="1.0"
+               complexity="2.7111111111111112">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Lorg/apache/commons/chain/impl/ContextBase;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="768" hits="0" branch="false"/>
+                <line number="769" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;"
+                    signature="(Lorg/apache/commons/chain/impl/ContextBase;Lorg/apache/commons/chain/impl/ContextBase$1;)V"
+                    line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="766" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="hasNext" signature="()Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="772" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="next" signature="()Ljava/lang/Object;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="776" hits="0" branch="false"/>
+                <line number="777" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="781" hits="0" branch="false"/>
+                <line number="782" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="766" hits="0" branch="false"/>
+            <line number="768" hits="0" branch="false"/>
+            <line number="769" hits="0" branch="false"/>
+            <line number="772" hits="0" branch="false"/>
+            <line number="776" hits="0" branch="false"/>
+            <line number="777" hits="0" branch="false"/>
+            <line number="781" hits="0" branch="false"/>
+            <line number="782" hits="0" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+    <package name="org.apache.commons.chain.web" line-rate="0.22014925373134328" branch-rate="0.16666666666666666"
+             complexity="3.5277777777777777">
+      <classes>
+        <class name="org.apache.commons.chain.web.AbstractGetLocaleCommand"
+               filename="org/apache/commons/chain/web/AbstractGetLocaleCommand.java" line-rate="1.0" branch-rate="1.0"
+               complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="34" hits="18" branch="false"/>
+                <line number="43" hits="18" branch="false"/>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="86" hits="18" branch="false"/>
+                <line number="87" hits="18" branch="false"/>
+              </lines>
+            </method>
+            <method name="getLocaleKey" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="54" hits="54" branch="false"/>
+              </lines>
+            </method>
+            <method name="setLocaleKey" signature="(Ljava/lang/String;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="67" hits="9" branch="false"/>
+                <line number="69" hits="9" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="34" hits="18" branch="false"/>
+            <line number="43" hits="18" branch="false"/>
+            <line number="54" hits="54" branch="false"/>
+            <line number="67" hits="9" branch="false"/>
+            <line number="69" hits="9" branch="false"/>
+            <line number="86" hits="18" branch="false"/>
+            <line number="87" hits="18" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.AbstractSetLocaleCommand"
+               filename="org/apache/commons/chain/web/AbstractSetLocaleCommand.java" line-rate="0.0" branch-rate="1.0"
+               complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="35" hits="0" branch="false"/>
+                <line number="44" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="execute" signature="(Lorg/apache/commons/chain/Context;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="87" hits="0" branch="false"/>
+                <line number="89" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getLocaleKey" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="55" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setLocaleKey" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="68" hits="0" branch="false"/>
+                <line number="70" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="35" hits="0" branch="false"/>
+            <line number="44" hits="0" branch="false"/>
+            <line number="55" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="70" hits="0" branch="false"/>
+            <line number="87" hits="0" branch="false"/>
+            <line number="89" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.ChainListener"
+               filename="org/apache/commons/chain/web/ChainListener.java" line-rate="0.0" branch-rate="0.0"
+               complexity="7.4">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="99" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="class$" signature="(Ljava/lang/String;)Ljava/lang/Class;" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="169" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="contextDestroyed" signature="(Ljavax/servlet/ServletContextEvent;)V" line-rate="0.0"
+                    branch-rate="0.0">
+              <lines>
+                <line number="150" hits="0" branch="false"/>
+                <line number="151" hits="0" branch="false"/>
+                <line number="152" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="153" hits="0" branch="false"/>
+                <line number="155" hits="0" branch="false"/>
+                <line number="157" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="contextInitialized" signature="(Ljavax/servlet/ServletContextEvent;)V" line-rate="0.0"
+                    branch-rate="0.0">
+              <lines>
+                <line number="170" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="171" hits="0" branch="false"/>
+                <line number="173" hits="0" branch="false"/>
+                <line number="176" hits="0" branch="false"/>
+                <line number="177" hits="0" branch="false"/>
+                <line number="179" hits="0" branch="false"/>
+                <line number="180" hits="0" branch="false"/>
+                <line number="183" hits="0" branch="false"/>
+                <line number="184" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="185" hits="0" branch="false"/>
+                <line number="186" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="187" hits="0" branch="false"/>
+                <line number="192" hits="0" branch="false"/>
+                <line number="193" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="195" hits="0" branch="false"/>
+                <line number="197" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="198" hits="0" branch="false"/>
+                <line number="200" hits="0" branch="false"/>
+                <line number="201" hits="0" branch="false"/>
+                <line number="202" hits="0" branch="false"/>
+                <line number="203" hits="0" branch="false"/>
+                <line number="206" hits="0" branch="false"/>
+                <line number="210" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="211" hits="0" branch="false"/>
+                <line number="212" hits="0" branch="false"/>
+                <line number="214" hits="0" branch="false"/>
+                <line number="217" hits="0" branch="false"/>
+                <line number="218" hits="0" branch="false"/>
+                <line number="220" hits="0" branch="false"/>
+                <line number="225" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="226" hits="0" branch="false"/>
+                <line number="229" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="parseJarResources"
+                    signature="(Ljavax/servlet/ServletContext;Lorg/apache/commons/chain/config/ConfigParser;Lorg/apache/commons/logging/Log;)V"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="245" hits="0" branch="false"/>
+                <line number="246" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="247" hits="0" branch="false"/>
+                <line number="249" hits="0" branch="false"/>
+                <line number="250" hits="0" branch="false"/>
+                <line number="251" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="253" hits="0" branch="false"/>
+                <line number="254" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="255" hits="0" branch="false"/>
+                <line number="257" hits="0" branch="false"/>
+                <line number="259" hits="0" branch="false"/>
+                <line number="260" hits="0" branch="false"/>
+                <line number="263" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="264" hits="0" branch="false"/>
+                <line number="266" hits="0" branch="false"/>
+                <line number="268" hits="0" branch="false"/>
+                <line number="269" hits="0" branch="false"/>
+                <line number="271" hits="0" branch="false"/>
+                <line number="272" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="273" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="274" hits="0" branch="false"/>
+                <line number="276" hits="0" branch="false"/>
+                <line number="278" hits="0" branch="false"/>
+                <line number="280" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="281" hits="0" branch="false"/>
+                <line number="283" hits="0" branch="false"/>
+                <line number="284" hits="0" branch="false"/>
+                <line number="285" hits="0" branch="false"/>
+                <line number="289" hits="0" branch="false"/>
+                <line number="290" hits="0" branch="false"/>
+                <line number="292" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="parseJarResources"
+                    signature="(Lorg/apache/commons/chain/Catalog;Ljavax/servlet/ServletContext;Lorg/apache/commons/chain/config/ConfigParser;Lorg/apache/commons/logging/Log;)V"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="309" hits="0" branch="false"/>
+                <line number="310" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="311" hits="0" branch="false"/>
+                <line number="313" hits="0" branch="false"/>
+                <line number="314" hits="0" branch="false"/>
+                <line number="315" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="317" hits="0" branch="false"/>
+                <line number="318" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="319" hits="0" branch="false"/>
+                <line number="321" hits="0" branch="false"/>
+                <line number="323" hits="0" branch="false"/>
+                <line number="324" hits="0" branch="false"/>
+                <line number="327" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="328" hits="0" branch="false"/>
+                <line number="330" hits="0" branch="false"/>
+                <line number="332" hits="0" branch="false"/>
+                <line number="333" hits="0" branch="false"/>
+                <line number="335" hits="0" branch="false"/>
+                <line number="336" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="337" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="338" hits="0" branch="false"/>
+                <line number="340" hits="0" branch="false"/>
+                <line number="342" hits="0" branch="false"/>
+                <line number="344" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="345" hits="0" branch="false"/>
+                <line number="347" hits="0" branch="false"/>
+                <line number="348" hits="0" branch="false"/>
+                <line number="349" hits="0" branch="false"/>
+                <line number="353" hits="0" branch="false"/>
+                <line number="354" hits="0" branch="false"/>
+                <line number="356" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="translate" signature="(Ljava/lang/String;)Ljava/lang/String;" line-rate="0.0"
+                    branch-rate="0.0">
+              <lines>
+                <line number="368" hits="0" branch="false"/>
+                <line number="369" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="370" hits="0" branch="false"/>
+                <line number="372" hits="0" branch="false"/>
+                <line number="373" hits="0" branch="false"/>
+                <line number="374" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="99" hits="0" branch="false"/>
+            <line number="150" hits="0" branch="false"/>
+            <line number="151" hits="0" branch="false"/>
+            <line number="152" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="153" hits="0" branch="false"/>
+            <line number="155" hits="0" branch="false"/>
+            <line number="157" hits="0" branch="false"/>
+            <line number="169" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="170" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="171" hits="0" branch="false"/>
+            <line number="173" hits="0" branch="false"/>
+            <line number="176" hits="0" branch="false"/>
+            <line number="177" hits="0" branch="false"/>
+            <line number="179" hits="0" branch="false"/>
+            <line number="180" hits="0" branch="false"/>
+            <line number="183" hits="0" branch="false"/>
+            <line number="184" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="185" hits="0" branch="false"/>
+            <line number="186" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="187" hits="0" branch="false"/>
+            <line number="192" hits="0" branch="false"/>
+            <line number="193" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="195" hits="0" branch="false"/>
+            <line number="197" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="198" hits="0" branch="false"/>
+            <line number="200" hits="0" branch="false"/>
+            <line number="201" hits="0" branch="false"/>
+            <line number="202" hits="0" branch="false"/>
+            <line number="203" hits="0" branch="false"/>
+            <line number="206" hits="0" branch="false"/>
+            <line number="210" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="211" hits="0" branch="false"/>
+            <line number="212" hits="0" branch="false"/>
+            <line number="214" hits="0" branch="false"/>
+            <line number="217" hits="0" branch="false"/>
+            <line number="218" hits="0" branch="false"/>
+            <line number="220" hits="0" branch="false"/>
+            <line number="225" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="226" hits="0" branch="false"/>
+            <line number="229" hits="0" branch="false"/>
+            <line number="245" hits="0" branch="false"/>
+            <line number="246" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="247" hits="0" branch="false"/>
+            <line number="249" hits="0" branch="false"/>
+            <line number="250" hits="0" branch="false"/>
+            <line number="251" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="253" hits="0" branch="false"/>
+            <line number="254" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="255" hits="0" branch="false"/>
+            <line number="257" hits="0" branch="false"/>
+            <line number="259" hits="0" branch="false"/>
+            <line number="260" hits="0" branch="false"/>
+            <line number="263" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="264" hits="0" branch="false"/>
+            <line number="266" hits="0" branch="false"/>
+            <line number="268" hits="0" branch="false"/>
+            <line number="269" hits="0" branch="false"/>
+            <line number="271" hits="0" branch="false"/>
+            <line number="272" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="273" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="274" hits="0" branch="false"/>
+            <line number="276" hits="0" branch="false"/>
+            <line number="278" hits="0" branch="false"/>
+            <line number="280" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="281" hits="0" branch="false"/>
+            <line number="283" hits="0" branch="false"/>
+            <line number="284" hits="0" branch="false"/>
+            <line number="285" hits="0" branch="false"/>
+            <line number="289" hits="0" branch="false"/>
+            <line number="290" hits="0" branch="false"/>
+            <line number="292" hits="0" branch="false"/>
+            <line number="309" hits="0" branch="false"/>
+            <line number="310" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="311" hits="0" branch="false"/>
+            <line number="313" hits="0" branch="false"/>
+            <line number="314" hits="0" branch="false"/>
+            <line number="315" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="317" hits="0" branch="false"/>
+            <line number="318" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="319" hits="0" branch="false"/>
+            <line number="321" hits="0" branch="false"/>
+            <line number="323" hits="0" branch="false"/>
+            <line number="324" hits="0" branch="false"/>
+            <line number="327" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="328" hits="0" branch="false"/>
+            <line number="330" hits="0" branch="false"/>
+            <line number="332" hits="0" branch="false"/>
+            <line number="333" hits="0" branch="false"/>
+            <line number="335" hits="0" branch="false"/>
+            <line number="336" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="337" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="338" hits="0" branch="false"/>
+            <line number="340" hits="0" branch="false"/>
+            <line number="342" hits="0" branch="false"/>
+            <line number="344" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="345" hits="0" branch="false"/>
+            <line number="347" hits="0" branch="false"/>
+            <line number="348" hits="0" branch="false"/>
+            <line number="349" hits="0" branch="false"/>
+            <line number="353" hits="0" branch="false"/>
+            <line number="354" hits="0" branch="false"/>
+            <line number="356" hits="0" branch="false"/>
+            <line number="368" hits="0" branch="false"/>
+            <line number="369" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="370" hits="0" branch="false"/>
+            <line number="372" hits="0" branch="false"/>
+            <line number="373" hits="0" branch="false"/>
+            <line number="374" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.ChainResources"
+               filename="org/apache/commons/chain/web/ChainResources.java" line-rate="0.1744186046511628"
+               branch-rate="0.17857142857142858" complexity="8.6">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="39" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="class$" signature="(Ljava/lang/String;)Ljava/lang/Class;" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="57" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="getResourcePaths" signature="(Ljava/lang/String;)[Ljava/lang/String;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="227" hits="30" branch="false"/>
+                <line number="229" hits="30" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="233" hits="87" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="234" hits="60" branch="false"/>
+                <line number="235" hits="60" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="236" hits="39" branch="false"/>
+                <line number="238" hits="60" branch="false"/>
+                <line number="240" hits="27" branch="false"/>
+                <line number="241" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="242" hits="15" branch="false"/>
+                <line number="246" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="parseClassResources"
+                    signature="(Ljava/lang/String;Lorg/apache/commons/chain/config/ConfigParser;)V"
+                    line-rate="0.10526315789473684" branch-rate="0.08333333333333333">
+              <lines>
+                <line number="54" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="55" hits="3" branch="false"/>
+                <line number="58" hits="0" branch="false"/>
+                <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="61" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="63" hits="0" branch="false"/>
+                <line number="64" hits="0" branch="false"/>
+                <line number="66" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="67" hits="0" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+                <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="70" hits="0" branch="false"/>
+                <line number="73" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="74" hits="0" branch="false"/>
+                <line number="76" hits="0" branch="false"/>
+                <line number="78" hits="0" branch="false"/>
+                <line number="79" hits="0" branch="false"/>
+                <line number="82" hits="0" branch="false"/>
+                <line number="84" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="parseClassResources"
+                    signature="(Lorg/apache/commons/chain/Catalog;Ljava/lang/String;Lorg/apache/commons/chain/config/ConfigParser;)V"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="101" hits="0" branch="false"/>
+                <line number="103" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="104" hits="0" branch="false"/>
+                <line number="106" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="109" hits="0" branch="false"/>
+                <line number="110" hits="0" branch="false"/>
+                <line number="112" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="113" hits="0" branch="false"/>
+                <line number="114" hits="0" branch="false"/>
+                <line number="115" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="116" hits="0" branch="false"/>
+                <line number="119" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="120" hits="0" branch="false"/>
+                <line number="122" hits="0" branch="false"/>
+                <line number="124" hits="0" branch="false"/>
+                <line number="125" hits="0" branch="false"/>
+                <line number="128" hits="0" branch="false"/>
+                <line number="130" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="parseWebResources"
+                    signature="(Ljavax/servlet/ServletContext;Ljava/lang/String;Lorg/apache/commons/chain/config/ConfigParser;)V"
+                    line-rate="0.11764705882352941" branch-rate="0.1">
+              <lines>
+                <line number="144" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="145" hits="3" branch="false"/>
+                <line number="147" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="148" hits="0" branch="false"/>
+                <line number="149" hits="0" branch="false"/>
+                <line number="151" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="0" branch="false"/>
+                <line number="154" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="155" hits="0" branch="false"/>
+                <line number="158" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="159" hits="0" branch="false"/>
+                <line number="161" hits="0" branch="false"/>
+                <line number="163" hits="0" branch="false"/>
+                <line number="164" hits="0" branch="false"/>
+                <line number="167" hits="0" branch="false"/>
+                <line number="169" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="parseWebResources"
+                    signature="(Lorg/apache/commons/chain/Catalog;Ljavax/servlet/ServletContext;Ljava/lang/String;Lorg/apache/commons/chain/config/ConfigParser;)V"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="187" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="188" hits="0" branch="false"/>
+                <line number="190" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="191" hits="0" branch="false"/>
+                <line number="192" hits="0" branch="false"/>
+                <line number="194" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="195" hits="0" branch="false"/>
+                <line number="196" hits="0" branch="false"/>
+                <line number="197" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="198" hits="0" branch="false"/>
+                <line number="201" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="202" hits="0" branch="false"/>
+                <line number="204" hits="0" branch="false"/>
+                <line number="206" hits="0" branch="false"/>
+                <line number="207" hits="0" branch="false"/>
+                <line number="210" hits="0" branch="false"/>
+                <line number="212" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="39" hits="0" branch="false"/>
+            <line number="54" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="55" hits="3" branch="false"/>
+            <line number="57" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="58" hits="0" branch="false"/>
+            <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="61" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="63" hits="0" branch="false"/>
+            <line number="64" hits="0" branch="false"/>
+            <line number="66" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="67" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="70" hits="0" branch="false"/>
+            <line number="73" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="74" hits="0" branch="false"/>
+            <line number="76" hits="0" branch="false"/>
+            <line number="78" hits="0" branch="false"/>
+            <line number="79" hits="0" branch="false"/>
+            <line number="82" hits="0" branch="false"/>
+            <line number="84" hits="0" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="101" hits="0" branch="false"/>
+            <line number="103" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="104" hits="0" branch="false"/>
+            <line number="106" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="109" hits="0" branch="false"/>
+            <line number="110" hits="0" branch="false"/>
+            <line number="112" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="113" hits="0" branch="false"/>
+            <line number="114" hits="0" branch="false"/>
+            <line number="115" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="116" hits="0" branch="false"/>
+            <line number="119" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="120" hits="0" branch="false"/>
+            <line number="122" hits="0" branch="false"/>
+            <line number="124" hits="0" branch="false"/>
+            <line number="125" hits="0" branch="false"/>
+            <line number="128" hits="0" branch="false"/>
+            <line number="130" hits="0" branch="false"/>
+            <line number="144" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="145" hits="3" branch="false"/>
+            <line number="147" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="148" hits="0" branch="false"/>
+            <line number="149" hits="0" branch="false"/>
+            <line number="151" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="0" branch="false"/>
+            <line number="154" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="155" hits="0" branch="false"/>
+            <line number="158" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="159" hits="0" branch="false"/>
+            <line number="161" hits="0" branch="false"/>
+            <line number="163" hits="0" branch="false"/>
+            <line number="164" hits="0" branch="false"/>
+            <line number="167" hits="0" branch="false"/>
+            <line number="169" hits="0" branch="false"/>
+            <line number="187" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="188" hits="0" branch="false"/>
+            <line number="190" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="191" hits="0" branch="false"/>
+            <line number="192" hits="0" branch="false"/>
+            <line number="194" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="195" hits="0" branch="false"/>
+            <line number="196" hits="0" branch="false"/>
+            <line number="197" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="198" hits="0" branch="false"/>
+            <line number="201" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="202" hits="0" branch="false"/>
+            <line number="204" hits="0" branch="false"/>
+            <line number="206" hits="0" branch="false"/>
+            <line number="207" hits="0" branch="false"/>
+            <line number="210" hits="0" branch="false"/>
+            <line number="212" hits="0" branch="false"/>
+            <line number="227" hits="30" branch="false"/>
+            <line number="229" hits="30" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="233" hits="87" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="234" hits="60" branch="false"/>
+            <line number="235" hits="60" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="236" hits="39" branch="false"/>
+            <line number="238" hits="60" branch="false"/>
+            <line number="240" hits="27" branch="false"/>
+            <line number="241" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="242" hits="15" branch="false"/>
+            <line number="246" hits="30" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.ChainServlet"
+               filename="org/apache/commons/chain/web/ChainServlet.java" line-rate="0.4634146341463415"
+               branch-rate="0.3333333333333333" complexity="4.333333333333333">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="96" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="class$" signature="(Ljava/lang/String;)Ljava/lang/Class;" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="163" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="destroy" signature="()V" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="144" hits="0" branch="false"/>
+                <line number="145" hits="0" branch="false"/>
+                <line number="146" hits="0" branch="false"/>
+                <line number="147" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="148" hits="0" branch="false"/>
+                <line number="150" hits="0" branch="false"/>
+                <line number="152" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="init" signature="()V" line-rate="0.5483870967741935" branch-rate="0.35714285714285715">
+              <lines>
+                <line number="164" hits="3" branch="false"/>
+                <line number="165" hits="3" branch="false"/>
+                <line number="166" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="167" hits="3" branch="false"/>
+                <line number="172" hits="3" branch="false"/>
+                <line number="173" hits="3" branch="false"/>
+                <line number="175" hits="3" branch="false"/>
+                <line number="176" hits="3" branch="false"/>
+                <line number="179" hits="3" branch="false"/>
+                <line number="180" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="181" hits="0" branch="false"/>
+                <line number="182" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="183" hits="0" branch="false"/>
+                <line number="188" hits="3" branch="false"/>
+                <line number="189" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="191" hits="0" branch="false"/>
+                <line number="193" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="194" hits="0" branch="false"/>
+                <line number="196" hits="0" branch="false"/>
+                <line number="197" hits="0" branch="false"/>
+                <line number="198" hits="0" branch="false"/>
+                <line number="199" hits="0" branch="false"/>
+                <line number="201" hits="0" branch="false"/>
+                <line number="205" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="206" hits="3" branch="false"/>
+                <line number="208" hits="3" branch="false"/>
+                <line number="211" hits="0" branch="false"/>
+                <line number="213" hits="0" branch="false"/>
+                <line number="218" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="219" hits="0" branch="false"/>
+                <line number="222" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="service"
+                    signature="(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V"
+                    line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="241" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="96" hits="3" branch="false"/>
+            <line number="144" hits="0" branch="false"/>
+            <line number="145" hits="0" branch="false"/>
+            <line number="146" hits="0" branch="false"/>
+            <line number="147" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="148" hits="0" branch="false"/>
+            <line number="150" hits="0" branch="false"/>
+            <line number="152" hits="0" branch="false"/>
+            <line number="163" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="164" hits="3" branch="false"/>
+            <line number="165" hits="3" branch="false"/>
+            <line number="166" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="167" hits="3" branch="false"/>
+            <line number="172" hits="3" branch="false"/>
+            <line number="173" hits="3" branch="false"/>
+            <line number="175" hits="3" branch="false"/>
+            <line number="176" hits="3" branch="false"/>
+            <line number="179" hits="3" branch="false"/>
+            <line number="180" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="181" hits="0" branch="false"/>
+            <line number="182" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="183" hits="0" branch="false"/>
+            <line number="188" hits="3" branch="false"/>
+            <line number="189" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="191" hits="0" branch="false"/>
+            <line number="193" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="194" hits="0" branch="false"/>
+            <line number="196" hits="0" branch="false"/>
+            <line number="197" hits="0" branch="false"/>
+            <line number="198" hits="0" branch="false"/>
+            <line number="199" hits="0" branch="false"/>
+            <line number="201" hits="0" branch="false"/>
+            <line number="205" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="206" hits="3" branch="false"/>
+            <line number="208" hits="3" branch="false"/>
+            <line number="211" hits="0" branch="false"/>
+            <line number="213" hits="0" branch="false"/>
+            <line number="218" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="219" hits="0" branch="false"/>
+            <line number="222" hits="3" branch="false"/>
+            <line number="241" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.MapEntry" filename="org/apache/commons/chain/web/MapEntry.java"
+               line-rate="0.9444444444444444" branch-rate="0.36363636363636365" complexity="2.8333333333333335">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljava/lang/Object;Ljava/lang/Object;Z)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="46" hits="474" branch="false"/>
+                <line number="56" hits="474" branch="false"/>
+                <line number="57" hits="474" branch="false"/>
+                <line number="58" hits="474" branch="false"/>
+                <line number="59" hits="474" branch="false"/>
+                <line number="60" hits="474" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.75" branch-rate="0.25">
+              <lines>
+                <line number="108" hits="84" branch="true" condition-coverage="50% (2/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="109" hits="84" branch="false"/>
+                <line number="110" hits="84" branch="true" condition-coverage="16% (2/12)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="0%"/>
+                    <condition number="2" type="jump" coverage="50%"/>
+                    <condition number="3" type="jump" coverage="0%"/>
+                    <condition number="4" type="jump" coverage="0%"/>
+                    <condition number="5" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="115" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getKey" signature="()Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="69" hits="1200" branch="false"/>
+              </lines>
+            </method>
+            <method name="getValue" signature="()Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="79" hits="948" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="125" hits="474" branch="true" condition-coverage="50% (2/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="setValue" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="91" hits="54" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="92" hits="36" branch="false"/>
+                <line number="93" hits="36" branch="false"/>
+                <line number="94" hits="36" branch="false"/>
+                <line number="96" hits="18" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="46" hits="474" branch="false"/>
+            <line number="56" hits="474" branch="false"/>
+            <line number="57" hits="474" branch="false"/>
+            <line number="58" hits="474" branch="false"/>
+            <line number="59" hits="474" branch="false"/>
+            <line number="60" hits="474" branch="false"/>
+            <line number="69" hits="1200" branch="false"/>
+            <line number="79" hits="948" branch="false"/>
+            <line number="91" hits="54" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="92" hits="36" branch="false"/>
+            <line number="93" hits="36" branch="false"/>
+            <line number="94" hits="36" branch="false"/>
+            <line number="96" hits="18" branch="false"/>
+            <line number="108" hits="84" branch="true" condition-coverage="50% (2/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="109" hits="84" branch="false"/>
+            <line number="110" hits="84" branch="true" condition-coverage="16% (2/12)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="0%"/>
+                <condition number="2" type="jump" coverage="50%"/>
+                <condition number="3" type="jump" coverage="0%"/>
+                <condition number="4" type="jump" coverage="0%"/>
+                <condition number="5" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="115" hits="0" branch="false"/>
+            <line number="125" hits="474" branch="true" condition-coverage="50% (2/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.WebContext" filename="org/apache/commons/chain/web/WebContext.java"
+               line-rate="1.0" branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="42" hits="240" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="42" hits="240" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+    <package name="org.apache.commons.chain.web.faces" line-rate="0.0" branch-rate="1.0" complexity="1.0">
+      <classes>
+        <class name="org.apache.commons.chain.web.faces.FacesGetLocaleCommand"
+               filename="org/apache/commons/chain/web/faces/FacesGetLocaleCommand.java" line-rate="0.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="31" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getLocale" signature="(Lorg/apache/commons/chain/Context;)Ljava/util/Locale;" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="45" hits="0" branch="false"/>
+                <line number="47" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="31" hits="0" branch="false"/>
+            <line number="45" hits="0" branch="false"/>
+            <line number="47" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.faces.FacesSetLocaleCommand"
+               filename="org/apache/commons/chain/web/faces/FacesSetLocaleCommand.java" line-rate="0.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="31" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setLocale" signature="(Lorg/apache/commons/chain/Context;Ljava/util/Locale;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="45" hits="0" branch="false"/>
+                <line number="47" hits="0" branch="false"/>
+                <line number="49" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="31" hits="0" branch="false"/>
+            <line number="45" hits="0" branch="false"/>
+            <line number="47" hits="0" branch="false"/>
+            <line number="49" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.faces.FacesWebContext"
+               filename="org/apache/commons/chain/web/faces/FacesWebContext.java" line-rate="0.0" branch-rate="1.0"
+               complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="44" hits="0" branch="false"/>
+                <line number="45" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;" signature="(Ljavax/faces/context/FacesContext;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="54" hits="0" branch="false"/>
+                <line number="56" hits="0" branch="false"/>
+                <line number="58" hits="0" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getApplicationScope" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="124" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getContext" signature="()Ljavax/faces/context/FacesContext;" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="82" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCookies" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="197" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getHeader" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="136" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getHeaderValues" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="148" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getInitParam" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="160" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getParam" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="172" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getParamValues" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="184" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getRequestScope" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="209" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getSessionScope" signature="()Ljava/util/Map;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="221" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="initialize" signature="(Ljavax/faces/context/FacesContext;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="95" hits="0" branch="false"/>
+                <line number="97" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="release" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="108" hits="0" branch="false"/>
+                <line number="110" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="44" hits="0" branch="false"/>
+            <line number="45" hits="0" branch="false"/>
+            <line number="54" hits="0" branch="false"/>
+            <line number="56" hits="0" branch="false"/>
+            <line number="58" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="82" hits="0" branch="false"/>
+            <line number="95" hits="0" branch="false"/>
+            <line number="97" hits="0" branch="false"/>
+            <line number="108" hits="0" branch="false"/>
+            <line number="110" hits="0" branch="false"/>
+            <line number="124" hits="0" branch="false"/>
+            <line number="136" hits="0" branch="false"/>
+            <line number="148" hits="0" branch="false"/>
+            <line number="160" hits="0" branch="false"/>
+            <line number="172" hits="0" branch="false"/>
+            <line number="184" hits="0" branch="false"/>
+            <line number="197" hits="0" branch="false"/>
+            <line number="209" hits="0" branch="false"/>
+            <line number="221" hits="0" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+    <package name="org.apache.commons.chain.web.portlet" line-rate="0.8608490566037735" branch-rate="0.7259615384615384"
+             complexity="2.1826086956521737">
+      <classes>
+        <class name="org.apache.commons.chain.web.portlet.PortletApplicationScopeMap"
+               filename="org/apache/commons/chain/web/portlet/PortletApplicationScopeMap.java"
+               line-rate="0.7846153846153846" branch-rate="0.5714285714285714" complexity="2.0625">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/portlet/PortletContext;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+                <line number="53" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="54" hits="12" branch="false"/>
+                <line number="56" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="66" hits="0" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+                <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="70" hits="0" branch="false"/>
+                <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="72" hits="0" branch="false"/>
+                <line number="74" hits="0" branch="false"/>
+                <line number="75" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="80" hits="27" branch="false"/>
+                <line number="81" hits="27" branch="false"/>
+                <line number="83" hits="105" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="84" hits="78" branch="false"/>
+                <line number="85" hits="78" branch="false"/>
+                <line number="87" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="92" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="97" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="102" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="171" hits="42" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="172" hits="0" branch="false"/>
+                <line number="173" hits="42" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="174" hits="39" branch="false"/>
+                <line number="176" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="112" hits="27" branch="false"/>
+                <line number="113" hits="27" branch="false"/>
+                <line number="114" hits="105" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="115" hits="78" branch="false"/>
+                <line number="117" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
+                    line-rate="0.8333333333333334" branch-rate="0.5">
+              <lines>
+                <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="123" hits="0" branch="false"/>
+                <line number="125" hits="12" branch="false"/>
+                <line number="126" hits="12" branch="false"/>
+                <line number="127" hits="12" branch="false"/>
+                <line number="128" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="133" hits="3" branch="false"/>
+                <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="135" hits="6" branch="false"/>
+                <line number="136" hits="6" branch="false"/>
+                <line number="137" hits="6" branch="false"/>
+                <line number="138" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="142" hits="3" branch="false"/>
+                <line number="143" hits="3" branch="false"/>
+                <line number="144" hits="3" branch="false"/>
+                <line number="145" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="150" hits="33" branch="false"/>
+                <line number="151" hits="33" branch="false"/>
+                <line number="152" hits="135" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="153" hits="102" branch="false"/>
+                <line number="154" hits="102" branch="false"/>
+                <line number="156" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="161" hits="24" branch="false"/>
+                <line number="162" hits="24" branch="false"/>
+                <line number="163" hits="90" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="164" hits="66" branch="false"/>
+                <line number="166" hits="24" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="53" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="54" hits="12" branch="false"/>
+            <line number="56" hits="3" branch="false"/>
+            <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="66" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="70" hits="0" branch="false"/>
+            <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="72" hits="0" branch="false"/>
+            <line number="74" hits="0" branch="false"/>
+            <line number="75" hits="0" branch="false"/>
+            <line number="80" hits="27" branch="false"/>
+            <line number="81" hits="27" branch="false"/>
+            <line number="83" hits="105" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="84" hits="78" branch="false"/>
+            <line number="85" hits="78" branch="false"/>
+            <line number="87" hits="27" branch="false"/>
+            <line number="92" hits="0" branch="false"/>
+            <line number="97" hits="27" branch="false"/>
+            <line number="102" hits="24" branch="false"/>
+            <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="112" hits="27" branch="false"/>
+            <line number="113" hits="27" branch="false"/>
+            <line number="114" hits="105" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="115" hits="78" branch="false"/>
+            <line number="117" hits="27" branch="false"/>
+            <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="123" hits="0" branch="false"/>
+            <line number="125" hits="12" branch="false"/>
+            <line number="126" hits="12" branch="false"/>
+            <line number="127" hits="12" branch="false"/>
+            <line number="128" hits="12" branch="false"/>
+            <line number="133" hits="3" branch="false"/>
+            <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="135" hits="6" branch="false"/>
+            <line number="136" hits="6" branch="false"/>
+            <line number="137" hits="6" branch="false"/>
+            <line number="138" hits="3" branch="false"/>
+            <line number="142" hits="3" branch="false"/>
+            <line number="143" hits="3" branch="false"/>
+            <line number="144" hits="3" branch="false"/>
+            <line number="145" hits="3" branch="false"/>
+            <line number="150" hits="33" branch="false"/>
+            <line number="151" hits="33" branch="false"/>
+            <line number="152" hits="135" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="153" hits="102" branch="false"/>
+            <line number="154" hits="102" branch="false"/>
+            <line number="156" hits="33" branch="false"/>
+            <line number="161" hits="24" branch="false"/>
+            <line number="162" hits="24" branch="false"/>
+            <line number="163" hits="90" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="164" hits="66" branch="false"/>
+            <line number="166" hits="24" branch="false"/>
+            <line number="171" hits="42" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="172" hits="0" branch="false"/>
+            <line number="173" hits="42" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="174" hits="39" branch="false"/>
+            <line number="176" hits="3" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletGetLocaleCommand"
+               filename="org/apache/commons/chain/web/portlet/PortletGetLocaleCommand.java" line-rate="1.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="31" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="getLocale" signature="(Lorg/apache/commons/chain/Context;)Ljava/util/Locale;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="45" hits="6" branch="false"/>
+                <line number="47" hits="6" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="31" hits="6" branch="false"/>
+            <line number="45" hits="6" branch="false"/>
+            <line number="47" hits="6" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletInitParamMap"
+               filename="org/apache/commons/chain/web/portlet/PortletInitParamMap.java" line-rate="0.8888888888888888"
+               branch-rate="0.7" complexity="1.9375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/portlet/PortletContext;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="62" hits="9" branch="false"/>
+                <line number="63" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="9" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="6" branch="false"/>
+                <line number="74" hits="6" branch="false"/>
+                <line number="76" hits="24" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="18" branch="false"/>
+                <line number="78" hits="18" branch="false"/>
+                <line number="80" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="95" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="151" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="18" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="3" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+                <line number="107" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="108" hits="9" branch="false"/>
+                <line number="110" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="120" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="9" branch="false"/>
+                <line number="131" hits="9" branch="false"/>
+                <line number="132" hits="36" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="27" branch="false"/>
+                <line number="134" hits="27" branch="false"/>
+                <line number="136" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="141" hits="12" branch="false"/>
+                <line number="142" hits="12" branch="false"/>
+                <line number="143" hits="48" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="36" branch="false"/>
+                <line number="146" hits="12" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="9" branch="false"/>
+            <line number="63" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="9" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="73" hits="6" branch="false"/>
+            <line number="74" hits="6" branch="false"/>
+            <line number="76" hits="24" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="18" branch="false"/>
+            <line number="78" hits="18" branch="false"/>
+            <line number="80" hits="6" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="9" branch="false"/>
+            <line number="95" hits="24" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="105" hits="3" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="107" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="108" hits="9" branch="false"/>
+            <line number="110" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="120" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="130" hits="9" branch="false"/>
+            <line number="131" hits="9" branch="false"/>
+            <line number="132" hits="36" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="27" branch="false"/>
+            <line number="134" hits="27" branch="false"/>
+            <line number="136" hits="9" branch="false"/>
+            <line number="141" hits="12" branch="false"/>
+            <line number="142" hits="12" branch="false"/>
+            <line number="143" hits="48" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="36" branch="false"/>
+            <line number="146" hits="12" branch="false"/>
+            <line number="151" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="18" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletParamMap"
+               filename="org/apache/commons/chain/web/portlet/PortletParamMap.java" line-rate="0.8888888888888888"
+               branch-rate="0.7" complexity="1.9375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/portlet/PortletRequest;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="62" hits="6" branch="false"/>
+                <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="6" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="6" branch="false"/>
+                <line number="74" hits="6" branch="false"/>
+                <line number="76" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="12" branch="false"/>
+                <line number="78" hits="12" branch="false"/>
+                <line number="80" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="95" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="12" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="3" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+                <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="108" hits="6" branch="false"/>
+                <line number="110" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="120" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="9" branch="false"/>
+                <line number="131" hits="9" branch="false"/>
+                <line number="132" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="18" branch="false"/>
+                <line number="134" hits="18" branch="false"/>
+                <line number="136" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="141" hits="9" branch="false"/>
+                <line number="142" hits="9" branch="false"/>
+                <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="18" branch="false"/>
+                <line number="146" hits="9" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="6" branch="false"/>
+            <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="6" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="73" hits="6" branch="false"/>
+            <line number="74" hits="6" branch="false"/>
+            <line number="76" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="12" branch="false"/>
+            <line number="78" hits="12" branch="false"/>
+            <line number="80" hits="6" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="6" branch="false"/>
+            <line number="95" hits="24" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="105" hits="3" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="108" hits="6" branch="false"/>
+            <line number="110" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="120" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="130" hits="9" branch="false"/>
+            <line number="131" hits="9" branch="false"/>
+            <line number="132" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="18" branch="false"/>
+            <line number="134" hits="18" branch="false"/>
+            <line number="136" hits="9" branch="false"/>
+            <line number="141" hits="9" branch="false"/>
+            <line number="142" hits="9" branch="false"/>
+            <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="18" branch="false"/>
+            <line number="146" hits="9" branch="false"/>
+            <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="12" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletParamValuesMap"
+               filename="org/apache/commons/chain/web/portlet/PortletParamValuesMap.java" line-rate="0.8888888888888888"
+               branch-rate="0.7" complexity="1.9375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/portlet/PortletRequest;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="62" hits="6" branch="false"/>
+                <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="6" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="3" branch="false"/>
+                <line number="74" hits="3" branch="false"/>
+                <line number="76" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="6" branch="false"/>
+                <line number="78" hits="6" branch="false"/>
+                <line number="80" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="95" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="12" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="3" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+                <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="108" hits="6" branch="false"/>
+                <line number="110" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="120" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="3" branch="false"/>
+                <line number="131" hits="3" branch="false"/>
+                <line number="132" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="6" branch="false"/>
+                <line number="134" hits="6" branch="false"/>
+                <line number="136" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="141" hits="9" branch="false"/>
+                <line number="142" hits="9" branch="false"/>
+                <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="18" branch="false"/>
+                <line number="146" hits="9" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="6" branch="false"/>
+            <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="6" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="73" hits="3" branch="false"/>
+            <line number="74" hits="3" branch="false"/>
+            <line number="76" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="6" branch="false"/>
+            <line number="78" hits="6" branch="false"/>
+            <line number="80" hits="3" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="6" branch="false"/>
+            <line number="95" hits="24" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="105" hits="3" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="108" hits="6" branch="false"/>
+            <line number="110" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="120" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="130" hits="3" branch="false"/>
+            <line number="131" hits="3" branch="false"/>
+            <line number="132" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="6" branch="false"/>
+            <line number="134" hits="6" branch="false"/>
+            <line number="136" hits="3" branch="false"/>
+            <line number="141" hits="9" branch="false"/>
+            <line number="142" hits="9" branch="false"/>
+            <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="18" branch="false"/>
+            <line number="146" hits="9" branch="false"/>
+            <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="12" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletRequestScopeMap"
+               filename="org/apache/commons/chain/web/portlet/PortletRequestScopeMap.java"
+               line-rate="0.7846153846153846" branch-rate="0.5714285714285714" complexity="2.0625">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/portlet/PortletRequest;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+                <line number="53" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="54" hits="6" branch="false"/>
+                <line number="56" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="66" hits="0" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+                <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="70" hits="0" branch="false"/>
+                <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="72" hits="0" branch="false"/>
+                <line number="74" hits="0" branch="false"/>
+                <line number="75" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="80" hits="30" branch="false"/>
+                <line number="81" hits="30" branch="false"/>
+                <line number="83" hits="72" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="84" hits="42" branch="false"/>
+                <line number="85" hits="42" branch="false"/>
+                <line number="87" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="92" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="97" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="102" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="171" hits="36" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="172" hits="0" branch="false"/>
+                <line number="173" hits="36" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="174" hits="33" branch="false"/>
+                <line number="176" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="112" hits="30" branch="false"/>
+                <line number="113" hits="30" branch="false"/>
+                <line number="114" hits="72" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="115" hits="42" branch="false"/>
+                <line number="117" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
+                    line-rate="0.8333333333333334" branch-rate="0.5">
+              <lines>
+                <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="123" hits="0" branch="false"/>
+                <line number="125" hits="12" branch="false"/>
+                <line number="126" hits="12" branch="false"/>
+                <line number="127" hits="12" branch="false"/>
+                <line number="128" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="133" hits="3" branch="false"/>
+                <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="135" hits="6" branch="false"/>
+                <line number="136" hits="6" branch="false"/>
+                <line number="137" hits="6" branch="false"/>
+                <line number="138" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="142" hits="3" branch="false"/>
+                <line number="143" hits="3" branch="false"/>
+                <line number="144" hits="3" branch="false"/>
+                <line number="145" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="150" hits="33" branch="false"/>
+                <line number="151" hits="33" branch="false"/>
+                <line number="152" hits="81" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="153" hits="48" branch="false"/>
+                <line number="154" hits="48" branch="false"/>
+                <line number="156" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="161" hits="27" branch="false"/>
+                <line number="162" hits="27" branch="false"/>
+                <line number="163" hits="63" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="164" hits="36" branch="false"/>
+                <line number="166" hits="27" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="53" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="54" hits="6" branch="false"/>
+            <line number="56" hits="3" branch="false"/>
+            <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="66" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="70" hits="0" branch="false"/>
+            <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="72" hits="0" branch="false"/>
+            <line number="74" hits="0" branch="false"/>
+            <line number="75" hits="0" branch="false"/>
+            <line number="80" hits="30" branch="false"/>
+            <line number="81" hits="30" branch="false"/>
+            <line number="83" hits="72" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="84" hits="42" branch="false"/>
+            <line number="85" hits="42" branch="false"/>
+            <line number="87" hits="30" branch="false"/>
+            <line number="92" hits="0" branch="false"/>
+            <line number="97" hits="21" branch="false"/>
+            <line number="102" hits="24" branch="false"/>
+            <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="112" hits="30" branch="false"/>
+            <line number="113" hits="30" branch="false"/>
+            <line number="114" hits="72" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="115" hits="42" branch="false"/>
+            <line number="117" hits="30" branch="false"/>
+            <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="123" hits="0" branch="false"/>
+            <line number="125" hits="12" branch="false"/>
+            <line number="126" hits="12" branch="false"/>
+            <line number="127" hits="12" branch="false"/>
+            <line number="128" hits="12" branch="false"/>
+            <line number="133" hits="3" branch="false"/>
+            <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="135" hits="6" branch="false"/>
+            <line number="136" hits="6" branch="false"/>
+            <line number="137" hits="6" branch="false"/>
+            <line number="138" hits="3" branch="false"/>
+            <line number="142" hits="3" branch="false"/>
+            <line number="143" hits="3" branch="false"/>
+            <line number="144" hits="3" branch="false"/>
+            <line number="145" hits="3" branch="false"/>
+            <line number="150" hits="33" branch="false"/>
+            <line number="151" hits="33" branch="false"/>
+            <line number="152" hits="81" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="153" hits="48" branch="false"/>
+            <line number="154" hits="48" branch="false"/>
+            <line number="156" hits="33" branch="false"/>
+            <line number="161" hits="27" branch="false"/>
+            <line number="162" hits="27" branch="false"/>
+            <line number="163" hits="63" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="164" hits="36" branch="false"/>
+            <line number="166" hits="27" branch="false"/>
+            <line number="171" hits="36" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="172" hits="0" branch="false"/>
+            <line number="173" hits="36" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="174" hits="33" branch="false"/>
+            <line number="176" hits="3" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletSessionScopeMap"
+               filename="org/apache/commons/chain/web/portlet/PortletSessionScopeMap.java"
+               line-rate="0.8723404255319149" branch-rate="0.75" complexity="3.411764705882353">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/portlet/PortletRequest;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="44" hits="24" branch="false"/>
+                <line number="45" hits="24" branch="false"/>
+                <line number="46" hits="24" branch="false"/>
+                <line number="47" hits="24" branch="false"/>
+                <line number="50" hits="24" branch="false"/>
+                <line number="51" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="55" hits="6" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="56" hits="3" branch="false"/>
+                <line number="57" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="58" hits="9" branch="false"/>
+                <line number="61" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="0.6666666666666666"
+                    branch-rate="0.25">
+              <lines>
+                <line number="65" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="66" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="68" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.2222222222222222"
+                    branch-rate="0.25">
+              <lines>
+                <line number="74" hits="3" branch="true" condition-coverage="50% (2/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="75" hits="3" branch="false"/>
+                <line number="77" hits="0" branch="false"/>
+                <line number="79" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="80" hits="0" branch="false"/>
+                <line number="81" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="82" hits="0" branch="false"/>
+                <line number="84" hits="0" branch="false"/>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="33" branch="false"/>
+                <line number="91" hits="33" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="92" hits="30" branch="false"/>
+                <line number="95" hits="96" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="96" hits="66" branch="false"/>
+                <line number="97" hits="66" branch="false"/>
+                <line number="100" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.6666666666666666" branch-rate="0.5">
+              <lines>
+                <line number="105" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="106" hits="0" branch="false"/>
+                <line number="108" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="114" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="115" hits="24" branch="false"/>
+                <line number="117" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="123" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="124" hits="24" branch="false"/>
+                <line number="126" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.6666666666666666" branch-rate="0.25">
+              <lines>
+                <line number="132" hits="3" branch="true" condition-coverage="25% (1/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="134" hits="0" branch="false"/>
+                <line number="136" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="222" hits="42" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="223" hits="0" branch="false"/>
+                <line number="224" hits="42" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="225" hits="39" branch="false"/>
+                <line number="227" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="142" hits="33" branch="false"/>
+                <line number="143" hits="33" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="30" branch="false"/>
+                <line number="146" hits="96" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="147" hits="66" branch="false"/>
+                <line number="150" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
+                    line-rate="0.8888888888888888" branch-rate="0.75">
+              <lines>
+                <line number="155" hits="15" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="156" hits="0" branch="false"/>
+                <line number="161" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="162" hits="3" branch="false"/>
+                <line number="163" hits="3" branch="false"/>
+                <line number="166" hits="15" branch="false"/>
+                <line number="167" hits="15" branch="false"/>
+                <line number="168" hits="15" branch="false"/>
+                <line number="169" hits="15" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="174" hits="6" branch="false"/>
+                <line number="175" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="176" hits="6" branch="false"/>
+                <line number="177" hits="6" branch="false"/>
+                <line number="178" hits="6" branch="false"/>
+                <line number="179" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="183" hits="6" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="184" hits="3" branch="false"/>
+                <line number="185" hits="3" branch="false"/>
+                <line number="186" hits="3" branch="false"/>
+                <line number="187" hits="3" branch="false"/>
+                <line number="189" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="sessionExists" signature="()Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="232" hits="234" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="233" hits="60" branch="false"/>
+                <line number="234" hits="60" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="235" hits="21" branch="false"/>
+                <line number="238" hits="234" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="239" hits="195" branch="false"/>
+                <line number="241" hits="39" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="195" hits="36" branch="false"/>
+                <line number="196" hits="36" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="197" hits="33" branch="false"/>
+                <line number="199" hits="108" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="200" hits="75" branch="false"/>
+                <line number="201" hits="75" branch="false"/>
+                <line number="204" hits="36" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="209" hits="30" branch="false"/>
+                <line number="210" hits="30" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="211" hits="27" branch="false"/>
+                <line number="213" hits="84" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="214" hits="57" branch="false"/>
+                <line number="217" hits="30" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="44" hits="24" branch="false"/>
+            <line number="45" hits="24" branch="false"/>
+            <line number="46" hits="24" branch="false"/>
+            <line number="47" hits="24" branch="false"/>
+            <line number="50" hits="24" branch="false"/>
+            <line number="51" hits="24" branch="false"/>
+            <line number="55" hits="6" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="56" hits="3" branch="false"/>
+            <line number="57" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="58" hits="9" branch="false"/>
+            <line number="61" hits="6" branch="false"/>
+            <line number="65" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="66" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="68" hits="3" branch="false"/>
+            <line number="74" hits="3" branch="true" condition-coverage="50% (2/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="75" hits="3" branch="false"/>
+            <line number="77" hits="0" branch="false"/>
+            <line number="79" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="80" hits="0" branch="false"/>
+            <line number="81" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="82" hits="0" branch="false"/>
+            <line number="84" hits="0" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="33" branch="false"/>
+            <line number="91" hits="33" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="92" hits="30" branch="false"/>
+            <line number="95" hits="96" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="96" hits="66" branch="false"/>
+            <line number="97" hits="66" branch="false"/>
+            <line number="100" hits="33" branch="false"/>
+            <line number="105" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="106" hits="0" branch="false"/>
+            <line number="108" hits="3" branch="false"/>
+            <line number="114" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="115" hits="24" branch="false"/>
+            <line number="117" hits="3" branch="false"/>
+            <line number="123" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="124" hits="24" branch="false"/>
+            <line number="126" hits="3" branch="false"/>
+            <line number="132" hits="3" branch="true" condition-coverage="25% (1/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="134" hits="0" branch="false"/>
+            <line number="136" hits="3" branch="false"/>
+            <line number="142" hits="33" branch="false"/>
+            <line number="143" hits="33" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="30" branch="false"/>
+            <line number="146" hits="96" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="147" hits="66" branch="false"/>
+            <line number="150" hits="33" branch="false"/>
+            <line number="155" hits="15" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="156" hits="0" branch="false"/>
+            <line number="161" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="162" hits="3" branch="false"/>
+            <line number="163" hits="3" branch="false"/>
+            <line number="166" hits="15" branch="false"/>
+            <line number="167" hits="15" branch="false"/>
+            <line number="168" hits="15" branch="false"/>
+            <line number="169" hits="15" branch="false"/>
+            <line number="174" hits="6" branch="false"/>
+            <line number="175" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="176" hits="6" branch="false"/>
+            <line number="177" hits="6" branch="false"/>
+            <line number="178" hits="6" branch="false"/>
+            <line number="179" hits="6" branch="false"/>
+            <line number="183" hits="6" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="184" hits="3" branch="false"/>
+            <line number="185" hits="3" branch="false"/>
+            <line number="186" hits="3" branch="false"/>
+            <line number="187" hits="3" branch="false"/>
+            <line number="189" hits="3" branch="false"/>
+            <line number="195" hits="36" branch="false"/>
+            <line number="196" hits="36" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="197" hits="33" branch="false"/>
+            <line number="199" hits="108" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="200" hits="75" branch="false"/>
+            <line number="201" hits="75" branch="false"/>
+            <line number="204" hits="36" branch="false"/>
+            <line number="209" hits="30" branch="false"/>
+            <line number="210" hits="30" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="211" hits="27" branch="false"/>
+            <line number="213" hits="84" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="214" hits="57" branch="false"/>
+            <line number="217" hits="30" branch="false"/>
+            <line number="222" hits="42" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="223" hits="0" branch="false"/>
+            <line number="224" hits="42" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="225" hits="39" branch="false"/>
+            <line number="227" hits="3" branch="false"/>
+            <line number="232" hits="234" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="233" hits="60" branch="false"/>
+            <line number="234" hits="60" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="235" hits="21" branch="false"/>
+            <line number="238" hits="234" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="239" hits="195" branch="false"/>
+            <line number="241" hits="39" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletSetLocaleCommand"
+               filename="org/apache/commons/chain/web/portlet/PortletSetLocaleCommand.java" line-rate="0.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="31" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setLocale" signature="(Lorg/apache/commons/chain/Context;Ljava/util/Locale;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="50" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="31" hits="0" branch="false"/>
+            <line number="50" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.portlet.PortletWebContext"
+               filename="org/apache/commons/chain/web/portlet/PortletWebContext.java" line-rate="0.9666666666666667"
+               branch-rate="1.0" complexity="2.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="47" hits="0" branch="false"/>
+                <line number="48" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;"
+                    signature="(Ljavax/portlet/PortletContext;Ljavax/portlet/PortletRequest;Ljavax/portlet/PortletResponse;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="61" hits="117" branch="false"/>
+                <line number="63" hits="117" branch="false"/>
+                <line number="65" hits="117" branch="false"/>
+                <line number="75" hits="117" branch="false"/>
+                <line number="81" hits="117" branch="false"/>
+                <line number="88" hits="117" branch="false"/>
+                <line number="95" hits="117" branch="false"/>
+                <line number="102" hits="117" branch="false"/>
+                <line number="109" hits="117" branch="false"/>
+                <line number="116" hits="117" branch="false"/>
+                <line number="122" hits="117" branch="false"/>
+                <line number="129" hits="117" branch="false"/>
+                <line number="135" hits="117" branch="false"/>
+                <line number="142" hits="117" branch="false"/>
+              </lines>
+            </method>
+            <method name="getApplicationScope" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="243" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="244" hits="21" branch="false"/>
+                <line number="246" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getContext" signature="()Ljavax/portlet/PortletContext;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="155" hits="39" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCookies" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="336" hits="51" branch="false"/>
+              </lines>
+            </method>
+            <method name="getHeader" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="258" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="260" hits="21" branch="false"/>
+                <line number="262" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getHeaderValues" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="274" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="276" hits="21" branch="false"/>
+                <line number="278" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getInitParam" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="290" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="291" hits="21" branch="false"/>
+                <line number="293" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getParam" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="305" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="306" hits="21" branch="false"/>
+                <line number="308" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getParamValues" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="320" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="321" hits="21" branch="false"/>
+                <line number="323" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getRequest" signature="()Ljavax/portlet/PortletRequest;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="167" hits="93" branch="false"/>
+              </lines>
+            </method>
+            <method name="getRequestScope" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="348" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="349" hits="21" branch="false"/>
+                <line number="351" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getResponse" signature="()Ljavax/portlet/PortletResponse;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="179" hits="39" branch="false"/>
+              </lines>
+            </method>
+            <method name="getSessionScope" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="363" hits="60" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="364" hits="24" branch="false"/>
+                <line number="367" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="initialize"
+                    signature="(Ljavax/portlet/PortletContext;Ljavax/portlet/PortletRequest;Ljavax/portlet/PortletResponse;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="197" hits="117" branch="false"/>
+                <line number="198" hits="117" branch="false"/>
+                <line number="199" hits="117" branch="false"/>
+                <line number="203" hits="117" branch="false"/>
+              </lines>
+            </method>
+            <method name="release" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="215" hits="3" branch="false"/>
+                <line number="216" hits="3" branch="false"/>
+                <line number="217" hits="3" branch="false"/>
+                <line number="218" hits="3" branch="false"/>
+                <line number="219" hits="3" branch="false"/>
+                <line number="220" hits="3" branch="false"/>
+                <line number="221" hits="3" branch="false"/>
+                <line number="222" hits="3" branch="false"/>
+                <line number="225" hits="3" branch="false"/>
+                <line number="226" hits="3" branch="false"/>
+                <line number="227" hits="3" branch="false"/>
+                <line number="229" hits="3" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="47" hits="0" branch="false"/>
+            <line number="48" hits="0" branch="false"/>
+            <line number="61" hits="117" branch="false"/>
+            <line number="63" hits="117" branch="false"/>
+            <line number="65" hits="117" branch="false"/>
+            <line number="75" hits="117" branch="false"/>
+            <line number="81" hits="117" branch="false"/>
+            <line number="88" hits="117" branch="false"/>
+            <line number="95" hits="117" branch="false"/>
+            <line number="102" hits="117" branch="false"/>
+            <line number="109" hits="117" branch="false"/>
+            <line number="116" hits="117" branch="false"/>
+            <line number="122" hits="117" branch="false"/>
+            <line number="129" hits="117" branch="false"/>
+            <line number="135" hits="117" branch="false"/>
+            <line number="142" hits="117" branch="false"/>
+            <line number="155" hits="39" branch="false"/>
+            <line number="167" hits="93" branch="false"/>
+            <line number="179" hits="39" branch="false"/>
+            <line number="197" hits="117" branch="false"/>
+            <line number="198" hits="117" branch="false"/>
+            <line number="199" hits="117" branch="false"/>
+            <line number="203" hits="117" branch="false"/>
+            <line number="215" hits="3" branch="false"/>
+            <line number="216" hits="3" branch="false"/>
+            <line number="217" hits="3" branch="false"/>
+            <line number="218" hits="3" branch="false"/>
+            <line number="219" hits="3" branch="false"/>
+            <line number="220" hits="3" branch="false"/>
+            <line number="221" hits="3" branch="false"/>
+            <line number="222" hits="3" branch="false"/>
+            <line number="225" hits="3" branch="false"/>
+            <line number="226" hits="3" branch="false"/>
+            <line number="227" hits="3" branch="false"/>
+            <line number="229" hits="3" branch="false"/>
+            <line number="243" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="244" hits="21" branch="false"/>
+            <line number="246" hits="57" branch="false"/>
+            <line number="258" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="260" hits="21" branch="false"/>
+            <line number="262" hits="57" branch="false"/>
+            <line number="274" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="276" hits="21" branch="false"/>
+            <line number="278" hits="57" branch="false"/>
+            <line number="290" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="291" hits="21" branch="false"/>
+            <line number="293" hits="57" branch="false"/>
+            <line number="305" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="306" hits="21" branch="false"/>
+            <line number="308" hits="57" branch="false"/>
+            <line number="320" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="321" hits="21" branch="false"/>
+            <line number="323" hits="57" branch="false"/>
+            <line number="336" hits="51" branch="false"/>
+            <line number="348" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="349" hits="21" branch="false"/>
+            <line number="351" hits="57" branch="false"/>
+            <line number="363" hits="60" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="364" hits="24" branch="false"/>
+            <line number="367" hits="60" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+    <package name="org.apache.commons.chain.web.servlet" line-rate="0.7784431137724551" branch-rate="0.6772151898734177"
+             complexity="2.161111111111111">
+      <classes>
+        <class name="org.apache.commons.chain.web.servlet.ChainProcessor"
+               filename="org/apache/commons/chain/web/servlet/ChainProcessor.java" line-rate="0.3548387096774194"
+               branch-rate="0.125" complexity="3.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="57" hits="3" branch="false"/>
+                <line number="104" hits="3" branch="false"/>
+                <line number="112" hits="3" branch="false"/>
+                <line number="119" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="destroy" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="0" branch="false"/>
+                <line number="131" hits="0" branch="false"/>
+                <line number="132" hits="0" branch="false"/>
+                <line number="133" hits="0" branch="false"/>
+                <line number="135" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="init" signature="()V" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="145" hits="3" branch="false"/>
+                <line number="146" hits="3" branch="false"/>
+                <line number="147" hits="3" branch="false"/>
+                <line number="148" hits="3" branch="false"/>
+                <line number="149" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="150" hits="3" branch="false"/>
+                <line number="153" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="service"
+                    signature="(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="171" hits="0" branch="false"/>
+                <line number="173" hits="0" branch="false"/>
+                <line number="174" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="175" hits="0" branch="false"/>
+                <line number="177" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="178" hits="0" branch="false"/>
+                <line number="180" hits="0" branch="false"/>
+                <line number="182" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="183" hits="0" branch="false"/>
+                <line number="185" hits="0" branch="false"/>
+                <line number="187" hits="0" branch="false"/>
+                <line number="188" hits="0" branch="false"/>
+                <line number="189" hits="0" branch="false"/>
+                <line number="190" hits="0" branch="false"/>
+                <line number="192" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="57" hits="3" branch="false"/>
+            <line number="104" hits="3" branch="false"/>
+            <line number="112" hits="3" branch="false"/>
+            <line number="119" hits="3" branch="false"/>
+            <line number="130" hits="0" branch="false"/>
+            <line number="131" hits="0" branch="false"/>
+            <line number="132" hits="0" branch="false"/>
+            <line number="133" hits="0" branch="false"/>
+            <line number="135" hits="0" branch="false"/>
+            <line number="145" hits="3" branch="false"/>
+            <line number="146" hits="3" branch="false"/>
+            <line number="147" hits="3" branch="false"/>
+            <line number="148" hits="3" branch="false"/>
+            <line number="149" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="150" hits="3" branch="false"/>
+            <line number="153" hits="3" branch="false"/>
+            <line number="171" hits="0" branch="false"/>
+            <line number="173" hits="0" branch="false"/>
+            <line number="174" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="175" hits="0" branch="false"/>
+            <line number="177" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="178" hits="0" branch="false"/>
+            <line number="180" hits="0" branch="false"/>
+            <line number="182" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="183" hits="0" branch="false"/>
+            <line number="185" hits="0" branch="false"/>
+            <line number="187" hits="0" branch="false"/>
+            <line number="188" hits="0" branch="false"/>
+            <line number="189" hits="0" branch="false"/>
+            <line number="190" hits="0" branch="false"/>
+            <line number="192" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.PathInfoMapper"
+               filename="org/apache/commons/chain/web/servlet/PathInfoMapper.java" line-rate="0.0" branch-rate="0.0"
+               complexity="1.5">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="39" hits="0" branch="false"/>
+                <line number="45" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalog" signature="(Lorg/apache/commons/chain/Context;)Lorg/apache/commons/chain/Catalog;"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="121" hits="0" branch="false"/>
+                <line number="122" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="123" hits="0" branch="false"/>
+                <line number="125" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalogKey" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="62" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommandName" signature="(Lorg/apache/commons/chain/Context;)Ljava/lang/String;"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="98" hits="0" branch="false"/>
+                <line number="99" hits="0" branch="false"/>
+                <line number="100" hits="0" branch="false"/>
+                <line number="102" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="103" hits="0" branch="false"/>
+                <line number="106" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalogKey" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="78" hits="0" branch="false"/>
+                <line number="80" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="39" hits="0" branch="false"/>
+            <line number="45" hits="0" branch="false"/>
+            <line number="62" hits="0" branch="false"/>
+            <line number="78" hits="0" branch="false"/>
+            <line number="80" hits="0" branch="false"/>
+            <line number="98" hits="0" branch="false"/>
+            <line number="99" hits="0" branch="false"/>
+            <line number="100" hits="0" branch="false"/>
+            <line number="102" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="103" hits="0" branch="false"/>
+            <line number="106" hits="0" branch="false"/>
+            <line number="121" hits="0" branch="false"/>
+            <line number="122" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="123" hits="0" branch="false"/>
+            <line number="125" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.RequestParameterMapper"
+               filename="org/apache/commons/chain/web/servlet/RequestParameterMapper.java" line-rate="0.0"
+               branch-rate="0.0" complexity="1.1666666666666667">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="40" hits="0" branch="false"/>
+                <line number="46" hits="0" branch="false"/>
+                <line number="47" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalog" signature="(Lorg/apache/commons/chain/Context;)Lorg/apache/commons/chain/Catalog;"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="145" hits="0" branch="false"/>
+                <line number="146" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="147" hits="0" branch="false"/>
+                <line number="149" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalogKey" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="61" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommandName" signature="(Lorg/apache/commons/chain/Context;)Ljava/lang/String;"
+                    line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="126" hits="0" branch="false"/>
+                <line number="127" hits="0" branch="false"/>
+                <line number="128" hits="0" branch="false"/>
+                <line number="129" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getParameter" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="93" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalogKey" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="77" hits="0" branch="false"/>
+                <line number="79" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setParameter" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="106" hits="0" branch="false"/>
+                <line number="108" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="40" hits="0" branch="false"/>
+            <line number="46" hits="0" branch="false"/>
+            <line number="47" hits="0" branch="false"/>
+            <line number="61" hits="0" branch="false"/>
+            <line number="77" hits="0" branch="false"/>
+            <line number="79" hits="0" branch="false"/>
+            <line number="93" hits="0" branch="false"/>
+            <line number="106" hits="0" branch="false"/>
+            <line number="108" hits="0" branch="false"/>
+            <line number="126" hits="0" branch="false"/>
+            <line number="127" hits="0" branch="false"/>
+            <line number="128" hits="0" branch="false"/>
+            <line number="129" hits="0" branch="false"/>
+            <line number="145" hits="0" branch="false"/>
+            <line number="146" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="147" hits="0" branch="false"/>
+            <line number="149" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletApplicationScopeMap"
+               filename="org/apache/commons/chain/web/servlet/ServletApplicationScopeMap.java"
+               line-rate="0.7846153846153846" branch-rate="0.5714285714285714" complexity="2.0625">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/ServletContext;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+                <line number="53" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="54" hits="12" branch="false"/>
+                <line number="56" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="66" hits="0" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+                <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="70" hits="0" branch="false"/>
+                <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="72" hits="0" branch="false"/>
+                <line number="74" hits="0" branch="false"/>
+                <line number="75" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="80" hits="27" branch="false"/>
+                <line number="81" hits="27" branch="false"/>
+                <line number="83" hits="105" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="84" hits="78" branch="false"/>
+                <line number="85" hits="78" branch="false"/>
+                <line number="87" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="92" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="97" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="102" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="171" hits="42" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="172" hits="0" branch="false"/>
+                <line number="173" hits="42" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="174" hits="39" branch="false"/>
+                <line number="176" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="112" hits="27" branch="false"/>
+                <line number="113" hits="27" branch="false"/>
+                <line number="114" hits="105" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="115" hits="78" branch="false"/>
+                <line number="117" hits="27" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
+                    line-rate="0.8333333333333334" branch-rate="0.5">
+              <lines>
+                <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="123" hits="0" branch="false"/>
+                <line number="125" hits="12" branch="false"/>
+                <line number="126" hits="12" branch="false"/>
+                <line number="127" hits="12" branch="false"/>
+                <line number="128" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="133" hits="3" branch="false"/>
+                <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="135" hits="6" branch="false"/>
+                <line number="136" hits="6" branch="false"/>
+                <line number="137" hits="6" branch="false"/>
+                <line number="138" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="142" hits="3" branch="false"/>
+                <line number="143" hits="3" branch="false"/>
+                <line number="144" hits="3" branch="false"/>
+                <line number="145" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="150" hits="33" branch="false"/>
+                <line number="151" hits="33" branch="false"/>
+                <line number="152" hits="135" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="153" hits="102" branch="false"/>
+                <line number="154" hits="102" branch="false"/>
+                <line number="156" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="161" hits="24" branch="false"/>
+                <line number="162" hits="24" branch="false"/>
+                <line number="163" hits="90" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="164" hits="66" branch="false"/>
+                <line number="166" hits="24" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="53" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="54" hits="12" branch="false"/>
+            <line number="56" hits="3" branch="false"/>
+            <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="66" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="70" hits="0" branch="false"/>
+            <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="72" hits="0" branch="false"/>
+            <line number="74" hits="0" branch="false"/>
+            <line number="75" hits="0" branch="false"/>
+            <line number="80" hits="27" branch="false"/>
+            <line number="81" hits="27" branch="false"/>
+            <line number="83" hits="105" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="84" hits="78" branch="false"/>
+            <line number="85" hits="78" branch="false"/>
+            <line number="87" hits="27" branch="false"/>
+            <line number="92" hits="0" branch="false"/>
+            <line number="97" hits="27" branch="false"/>
+            <line number="102" hits="24" branch="false"/>
+            <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="112" hits="27" branch="false"/>
+            <line number="113" hits="27" branch="false"/>
+            <line number="114" hits="105" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="115" hits="78" branch="false"/>
+            <line number="117" hits="27" branch="false"/>
+            <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="123" hits="0" branch="false"/>
+            <line number="125" hits="12" branch="false"/>
+            <line number="126" hits="12" branch="false"/>
+            <line number="127" hits="12" branch="false"/>
+            <line number="128" hits="12" branch="false"/>
+            <line number="133" hits="3" branch="false"/>
+            <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="135" hits="6" branch="false"/>
+            <line number="136" hits="6" branch="false"/>
+            <line number="137" hits="6" branch="false"/>
+            <line number="138" hits="3" branch="false"/>
+            <line number="142" hits="3" branch="false"/>
+            <line number="143" hits="3" branch="false"/>
+            <line number="144" hits="3" branch="false"/>
+            <line number="145" hits="3" branch="false"/>
+            <line number="150" hits="33" branch="false"/>
+            <line number="151" hits="33" branch="false"/>
+            <line number="152" hits="135" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="153" hits="102" branch="false"/>
+            <line number="154" hits="102" branch="false"/>
+            <line number="156" hits="33" branch="false"/>
+            <line number="161" hits="24" branch="false"/>
+            <line number="162" hits="24" branch="false"/>
+            <line number="163" hits="90" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="164" hits="66" branch="false"/>
+            <line number="166" hits="24" branch="false"/>
+            <line number="171" hits="42" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="172" hits="0" branch="false"/>
+            <line number="173" hits="42" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="174" hits="39" branch="false"/>
+            <line number="176" hits="3" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletCookieMap"
+               filename="org/apache/commons/chain/web/servlet/ServletCookieMap.java" line-rate="0.8775510204081632"
+               branch-rate="0.6176470588235294" complexity="2.4375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/http/HttpServletRequest;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="42" hits="21" branch="false"/>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="47" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="51" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="56" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8333333333333334"
+                    branch-rate="0.6666666666666666">
+              <lines>
+                <line number="61" hits="6" branch="false"/>
+                <line number="62" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="6" branch="false"/>
+                <line number="69" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="0.75">
+              <lines>
+                <line number="74" hits="3" branch="false"/>
+                <line number="75" hits="3" branch="false"/>
+                <line number="76" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="78" hits="6" branch="false"/>
+                <line number="81" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="86" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="0.8333333333333334"
+                    branch-rate="0.6666666666666666">
+              <lines>
+                <line number="91" hits="12" branch="false"/>
+                <line number="92" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="93" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="94" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="95" hits="12" branch="false"/>
+                <line number="99" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="104" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="109" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="159" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="160" hits="0" branch="false"/>
+                <line number="161" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="162" hits="18" branch="false"/>
+                <line number="164" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="0.75">
+              <lines>
+                <line number="114" hits="3" branch="false"/>
+                <line number="115" hits="3" branch="false"/>
+                <line number="116" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="117" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="118" hits="6" branch="false"/>
+                <line number="121" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="126" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="131" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="136" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="141" hits="6" branch="false"/>
+                <line number="142" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="0.75">
+              <lines>
+                <line number="147" hits="3" branch="false"/>
+                <line number="148" hits="3" branch="false"/>
+                <line number="149" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="150" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="151" hits="6" branch="false"/>
+                <line number="154" hits="3" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="42" hits="21" branch="false"/>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="47" hits="21" branch="false"/>
+            <line number="51" hits="3" branch="false"/>
+            <line number="56" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="61" hits="6" branch="false"/>
+            <line number="62" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="6" branch="false"/>
+            <line number="69" hits="0" branch="false"/>
+            <line number="74" hits="3" branch="false"/>
+            <line number="75" hits="3" branch="false"/>
+            <line number="76" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="78" hits="6" branch="false"/>
+            <line number="81" hits="3" branch="false"/>
+            <line number="86" hits="0" branch="false"/>
+            <line number="91" hits="12" branch="false"/>
+            <line number="92" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="93" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="94" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="95" hits="12" branch="false"/>
+            <line number="99" hits="0" branch="false"/>
+            <line number="104" hits="24" branch="false"/>
+            <line number="109" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="114" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="116" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="117" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="118" hits="6" branch="false"/>
+            <line number="121" hits="3" branch="false"/>
+            <line number="126" hits="3" branch="false"/>
+            <line number="131" hits="3" branch="false"/>
+            <line number="136" hits="3" branch="false"/>
+            <line number="141" hits="6" branch="false"/>
+            <line number="142" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="147" hits="3" branch="false"/>
+            <line number="148" hits="3" branch="false"/>
+            <line number="149" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="150" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="151" hits="6" branch="false"/>
+            <line number="154" hits="3" branch="false"/>
+            <line number="159" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="160" hits="0" branch="false"/>
+            <line number="161" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="162" hits="18" branch="false"/>
+            <line number="164" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletGetLocaleCommand"
+               filename="org/apache/commons/chain/web/servlet/ServletGetLocaleCommand.java" line-rate="1.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="31" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="getLocale" signature="(Lorg/apache/commons/chain/Context;)Ljava/util/Locale;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="45" hits="12" branch="false"/>
+                <line number="47" hits="12" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="31" hits="12" branch="false"/>
+            <line number="45" hits="12" branch="false"/>
+            <line number="47" hits="12" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletHeaderMap"
+               filename="org/apache/commons/chain/web/servlet/ServletHeaderMap.java" line-rate="0.8888888888888888"
+               branch-rate="0.7" complexity="1.9375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/http/HttpServletRequest;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="62" hits="6" branch="false"/>
+                <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="6" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="6" branch="false"/>
+                <line number="74" hits="6" branch="false"/>
+                <line number="76" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="12" branch="false"/>
+                <line number="78" hits="12" branch="false"/>
+                <line number="80" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="95" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="12" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="3" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+                <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="108" hits="6" branch="false"/>
+                <line number="110" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="120" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="9" branch="false"/>
+                <line number="131" hits="9" branch="false"/>
+                <line number="132" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="18" branch="false"/>
+                <line number="134" hits="18" branch="false"/>
+                <line number="136" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="141" hits="9" branch="false"/>
+                <line number="142" hits="9" branch="false"/>
+                <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="18" branch="false"/>
+                <line number="146" hits="9" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="6" branch="false"/>
+            <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="6" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="73" hits="6" branch="false"/>
+            <line number="74" hits="6" branch="false"/>
+            <line number="76" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="12" branch="false"/>
+            <line number="78" hits="12" branch="false"/>
+            <line number="80" hits="6" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="6" branch="false"/>
+            <line number="95" hits="24" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="105" hits="3" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="108" hits="6" branch="false"/>
+            <line number="110" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="120" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="130" hits="9" branch="false"/>
+            <line number="131" hits="9" branch="false"/>
+            <line number="132" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="18" branch="false"/>
+            <line number="134" hits="18" branch="false"/>
+            <line number="136" hits="9" branch="false"/>
+            <line number="141" hits="9" branch="false"/>
+            <line number="142" hits="9" branch="false"/>
+            <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="18" branch="false"/>
+            <line number="146" hits="9" branch="false"/>
+            <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="12" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletHeaderValuesMap"
+               filename="org/apache/commons/chain/web/servlet/ServletHeaderValuesMap.java"
+               line-rate="0.8787878787878788" branch-rate="0.71875" complexity="2.375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/http/HttpServletRequest;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.75"
+                    branch-rate="0.6666666666666666">
+              <lines>
+                <line number="62" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="63" hits="0" branch="false"/>
+                <line number="65" hits="6" branch="false"/>
+                <line number="66" hits="6" branch="false"/>
+                <line number="67" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="68" hits="9" branch="false"/>
+                <line number="69" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="70" hits="6" branch="false"/>
+                <line number="71" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="72" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="73" hits="0" branch="false"/>
+                <line number="74" hits="0" branch="false"/>
+                <line number="77" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="78" hits="6" branch="false"/>
+                <line number="81" hits="3" branch="false"/>
+                <line number="82" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="87" hits="6" branch="false"/>
+                <line number="88" hits="6" branch="false"/>
+                <line number="90" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="91" hits="12" branch="false"/>
+                <line number="92" hits="12" branch="false"/>
+                <line number="94" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="99" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="104" hits="6" branch="false"/>
+                <line number="105" hits="6" branch="false"/>
+                <line number="106" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="107" hits="9" branch="false"/>
+                <line number="109" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="114" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="119" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="176" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="177" hits="0" branch="false"/>
+                <line number="178" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="179" hits="12" branch="false"/>
+                <line number="181" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="124" hits="3" branch="false"/>
+                <line number="125" hits="3" branch="false"/>
+                <line number="126" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="127" hits="6" branch="false"/>
+                <line number="129" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="134" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="139" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="144" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="149" hits="9" branch="false"/>
+                <line number="150" hits="9" branch="false"/>
+                <line number="151" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="18" branch="false"/>
+                <line number="153" hits="18" branch="false"/>
+                <line number="155" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="160" hits="9" branch="false"/>
+                <line number="161" hits="9" branch="false"/>
+                <line number="162" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="163" hits="18" branch="false"/>
+                <line number="164" hits="18" branch="false"/>
+                <line number="165" hits="18" branch="false"/>
+                <line number="166" hits="45" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="167" hits="27" branch="false"/>
+                <line number="169" hits="18" branch="false"/>
+                <line number="170" hits="18" branch="false"/>
+                <line number="171" hits="9" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="63" hits="0" branch="false"/>
+            <line number="65" hits="6" branch="false"/>
+            <line number="66" hits="6" branch="false"/>
+            <line number="67" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="68" hits="9" branch="false"/>
+            <line number="69" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="70" hits="6" branch="false"/>
+            <line number="71" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="72" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="73" hits="0" branch="false"/>
+            <line number="74" hits="0" branch="false"/>
+            <line number="77" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="78" hits="6" branch="false"/>
+            <line number="81" hits="3" branch="false"/>
+            <line number="82" hits="0" branch="false"/>
+            <line number="87" hits="6" branch="false"/>
+            <line number="88" hits="6" branch="false"/>
+            <line number="90" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="91" hits="12" branch="false"/>
+            <line number="92" hits="12" branch="false"/>
+            <line number="94" hits="6" branch="false"/>
+            <line number="99" hits="0" branch="false"/>
+            <line number="104" hits="6" branch="false"/>
+            <line number="105" hits="6" branch="false"/>
+            <line number="106" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="107" hits="9" branch="false"/>
+            <line number="109" hits="6" branch="false"/>
+            <line number="114" hits="24" branch="false"/>
+            <line number="119" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="124" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="126" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="127" hits="6" branch="false"/>
+            <line number="129" hits="3" branch="false"/>
+            <line number="134" hits="3" branch="false"/>
+            <line number="139" hits="3" branch="false"/>
+            <line number="144" hits="3" branch="false"/>
+            <line number="149" hits="9" branch="false"/>
+            <line number="150" hits="9" branch="false"/>
+            <line number="151" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="18" branch="false"/>
+            <line number="153" hits="18" branch="false"/>
+            <line number="155" hits="9" branch="false"/>
+            <line number="160" hits="9" branch="false"/>
+            <line number="161" hits="9" branch="false"/>
+            <line number="162" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="163" hits="18" branch="false"/>
+            <line number="164" hits="18" branch="false"/>
+            <line number="165" hits="18" branch="false"/>
+            <line number="166" hits="45" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="167" hits="27" branch="false"/>
+            <line number="169" hits="18" branch="false"/>
+            <line number="170" hits="18" branch="false"/>
+            <line number="171" hits="9" branch="false"/>
+            <line number="176" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="177" hits="0" branch="false"/>
+            <line number="178" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="179" hits="12" branch="false"/>
+            <line number="181" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletInitParamMap"
+               filename="org/apache/commons/chain/web/servlet/ServletInitParamMap.java" line-rate="0.8888888888888888"
+               branch-rate="0.7" complexity="1.9375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/ServletContext;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="62" hits="9" branch="false"/>
+                <line number="63" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="9" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="6" branch="false"/>
+                <line number="74" hits="6" branch="false"/>
+                <line number="76" hits="24" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="18" branch="false"/>
+                <line number="78" hits="18" branch="false"/>
+                <line number="80" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="95" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="151" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="18" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="18" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="3" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+                <line number="107" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="108" hits="9" branch="false"/>
+                <line number="110" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="120" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="9" branch="false"/>
+                <line number="131" hits="9" branch="false"/>
+                <line number="132" hits="36" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="27" branch="false"/>
+                <line number="134" hits="27" branch="false"/>
+                <line number="136" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="141" hits="12" branch="false"/>
+                <line number="142" hits="12" branch="false"/>
+                <line number="143" hits="48" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="36" branch="false"/>
+                <line number="146" hits="12" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="9" branch="false"/>
+            <line number="63" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="9" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="73" hits="6" branch="false"/>
+            <line number="74" hits="6" branch="false"/>
+            <line number="76" hits="24" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="18" branch="false"/>
+            <line number="78" hits="18" branch="false"/>
+            <line number="80" hits="6" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="9" branch="false"/>
+            <line number="95" hits="24" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="105" hits="3" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="107" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="108" hits="9" branch="false"/>
+            <line number="110" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="120" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="130" hits="9" branch="false"/>
+            <line number="131" hits="9" branch="false"/>
+            <line number="132" hits="36" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="27" branch="false"/>
+            <line number="134" hits="27" branch="false"/>
+            <line number="136" hits="9" branch="false"/>
+            <line number="141" hits="12" branch="false"/>
+            <line number="142" hits="12" branch="false"/>
+            <line number="143" hits="48" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="36" branch="false"/>
+            <line number="146" hits="12" branch="false"/>
+            <line number="151" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="18" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="18" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletParamMap"
+               filename="org/apache/commons/chain/web/servlet/ServletParamMap.java" line-rate="0.8888888888888888"
+               branch-rate="0.7" complexity="1.9375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/http/HttpServletRequest;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="62" hits="6" branch="false"/>
+                <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="6" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="6" branch="false"/>
+                <line number="74" hits="6" branch="false"/>
+                <line number="76" hits="18" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="12" branch="false"/>
+                <line number="78" hits="12" branch="false"/>
+                <line number="80" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="95" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="12" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="3" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+                <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="108" hits="6" branch="false"/>
+                <line number="110" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="120" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="9" branch="false"/>
+                <line number="131" hits="9" branch="false"/>
+                <line number="132" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="18" branch="false"/>
+                <line number="134" hits="18" branch="false"/>
+                <line number="136" hits="9" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="141" hits="9" branch="false"/>
+                <line number="142" hits="9" branch="false"/>
+                <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="18" branch="false"/>
+                <line number="146" hits="9" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="6" branch="false"/>
+            <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="6" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="73" hits="6" branch="false"/>
+            <line number="74" hits="6" branch="false"/>
+            <line number="76" hits="18" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="12" branch="false"/>
+            <line number="78" hits="12" branch="false"/>
+            <line number="80" hits="6" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="6" branch="false"/>
+            <line number="95" hits="24" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="105" hits="3" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="108" hits="6" branch="false"/>
+            <line number="110" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="120" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="130" hits="9" branch="false"/>
+            <line number="131" hits="9" branch="false"/>
+            <line number="132" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="18" branch="false"/>
+            <line number="134" hits="18" branch="false"/>
+            <line number="136" hits="9" branch="false"/>
+            <line number="141" hits="9" branch="false"/>
+            <line number="142" hits="9" branch="false"/>
+            <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="18" branch="false"/>
+            <line number="146" hits="9" branch="false"/>
+            <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="12" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletParamValuesMap"
+               filename="org/apache/commons/chain/web/servlet/ServletParamValuesMap.java" line-rate="0.8888888888888888"
+               branch-rate="0.7" complexity="1.9375">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/http/HttpServletRequest;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="1.0" branch-rate="0.5">
+              <lines>
+                <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="62" hits="6" branch="false"/>
+                <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="65" hits="6" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="73" hits="3" branch="false"/>
+                <line number="74" hits="3" branch="false"/>
+                <line number="76" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="77" hits="6" branch="false"/>
+                <line number="78" hits="6" branch="false"/>
+                <line number="80" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="90" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="95" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.6" branch-rate="0.5">
+              <lines>
+                <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="152" hits="0" branch="false"/>
+                <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="154" hits="12" branch="false"/>
+                <line number="156" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="105" hits="3" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+                <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="108" hits="6" branch="false"/>
+                <line number="110" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="120" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="125" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="130" hits="3" branch="false"/>
+                <line number="131" hits="3" branch="false"/>
+                <line number="132" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="133" hits="6" branch="false"/>
+                <line number="134" hits="6" branch="false"/>
+                <line number="136" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="141" hits="9" branch="false"/>
+                <line number="142" hits="9" branch="false"/>
+                <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="18" branch="false"/>
+                <line number="146" hits="9" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="57" hits="6" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="62" hits="6" branch="false"/>
+            <line number="63" hits="9" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="64" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="6" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="73" hits="3" branch="false"/>
+            <line number="74" hits="3" branch="false"/>
+            <line number="76" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="77" hits="6" branch="false"/>
+            <line number="78" hits="6" branch="false"/>
+            <line number="80" hits="3" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="90" hits="6" branch="false"/>
+            <line number="95" hits="24" branch="false"/>
+            <line number="100" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="105" hits="3" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="107" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="108" hits="6" branch="false"/>
+            <line number="110" hits="3" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="120" hits="3" branch="false"/>
+            <line number="125" hits="3" branch="false"/>
+            <line number="130" hits="3" branch="false"/>
+            <line number="131" hits="3" branch="false"/>
+            <line number="132" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="133" hits="6" branch="false"/>
+            <line number="134" hits="6" branch="false"/>
+            <line number="136" hits="3" branch="false"/>
+            <line number="141" hits="9" branch="false"/>
+            <line number="142" hits="9" branch="false"/>
+            <line number="143" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="18" branch="false"/>
+            <line number="146" hits="9" branch="false"/>
+            <line number="151" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="152" hits="0" branch="false"/>
+            <line number="153" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="154" hits="12" branch="false"/>
+            <line number="156" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletPathMapper"
+               filename="org/apache/commons/chain/web/servlet/ServletPathMapper.java" line-rate="0.0" branch-rate="0.0"
+               complexity="1.5">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="39" hits="0" branch="false"/>
+                <line number="45" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalog" signature="(Lorg/apache/commons/chain/Context;)Lorg/apache/commons/chain/Catalog;"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="121" hits="0" branch="false"/>
+                <line number="122" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="123" hits="0" branch="false"/>
+                <line number="125" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCatalogKey" signature="()Ljava/lang/String;" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="62" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCommandName" signature="(Lorg/apache/commons/chain/Context;)Ljava/lang/String;"
+                    line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="98" hits="0" branch="false"/>
+                <line number="99" hits="0" branch="false"/>
+                <line number="100" hits="0" branch="false"/>
+                <line number="102" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="103" hits="0" branch="false"/>
+                <line number="106" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setCatalogKey" signature="(Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="78" hits="0" branch="false"/>
+                <line number="80" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="39" hits="0" branch="false"/>
+            <line number="45" hits="0" branch="false"/>
+            <line number="62" hits="0" branch="false"/>
+            <line number="78" hits="0" branch="false"/>
+            <line number="80" hits="0" branch="false"/>
+            <line number="98" hits="0" branch="false"/>
+            <line number="99" hits="0" branch="false"/>
+            <line number="100" hits="0" branch="false"/>
+            <line number="102" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="103" hits="0" branch="false"/>
+            <line number="106" hits="0" branch="false"/>
+            <line number="121" hits="0" branch="false"/>
+            <line number="122" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="123" hits="0" branch="false"/>
+            <line number="125" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletRequestScopeMap"
+               filename="org/apache/commons/chain/web/servlet/ServletRequestScopeMap.java"
+               line-rate="0.7846153846153846" branch-rate="0.5714285714285714" complexity="2.0625">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/http/HttpServletRequest;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="43" hits="21" branch="false"/>
+                <line number="44" hits="21" branch="false"/>
+                <line number="45" hits="21" branch="false"/>
+                <line number="48" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="52" hits="3" branch="false"/>
+                <line number="53" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="54" hits="6" branch="false"/>
+                <line number="56" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="66" hits="0" branch="false"/>
+                <line number="68" hits="0" branch="false"/>
+                <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="70" hits="0" branch="false"/>
+                <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="72" hits="0" branch="false"/>
+                <line number="74" hits="0" branch="false"/>
+                <line number="75" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="80" hits="30" branch="false"/>
+                <line number="81" hits="30" branch="false"/>
+                <line number="83" hits="72" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="84" hits="42" branch="false"/>
+                <line number="85" hits="42" branch="false"/>
+                <line number="87" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="92" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="97" hits="21" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="102" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="171" hits="36" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="172" hits="0" branch="false"/>
+                <line number="173" hits="36" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="174" hits="33" branch="false"/>
+                <line number="176" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="112" hits="30" branch="false"/>
+                <line number="113" hits="30" branch="false"/>
+                <line number="114" hits="72" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="115" hits="42" branch="false"/>
+                <line number="117" hits="30" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
+                    line-rate="0.8333333333333334" branch-rate="0.5">
+              <lines>
+                <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="123" hits="0" branch="false"/>
+                <line number="125" hits="12" branch="false"/>
+                <line number="126" hits="12" branch="false"/>
+                <line number="127" hits="12" branch="false"/>
+                <line number="128" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="133" hits="3" branch="false"/>
+                <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="135" hits="6" branch="false"/>
+                <line number="136" hits="6" branch="false"/>
+                <line number="137" hits="6" branch="false"/>
+                <line number="138" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="142" hits="3" branch="false"/>
+                <line number="143" hits="3" branch="false"/>
+                <line number="144" hits="3" branch="false"/>
+                <line number="145" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="150" hits="33" branch="false"/>
+                <line number="151" hits="33" branch="false"/>
+                <line number="152" hits="81" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="153" hits="48" branch="false"/>
+                <line number="154" hits="48" branch="false"/>
+                <line number="156" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="161" hits="27" branch="false"/>
+                <line number="162" hits="27" branch="false"/>
+                <line number="163" hits="63" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="164" hits="36" branch="false"/>
+                <line number="166" hits="27" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="43" hits="21" branch="false"/>
+            <line number="44" hits="21" branch="false"/>
+            <line number="45" hits="21" branch="false"/>
+            <line number="48" hits="21" branch="false"/>
+            <line number="52" hits="3" branch="false"/>
+            <line number="53" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="54" hits="6" branch="false"/>
+            <line number="56" hits="3" branch="false"/>
+            <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="65" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="66" hits="0" branch="false"/>
+            <line number="68" hits="0" branch="false"/>
+            <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="70" hits="0" branch="false"/>
+            <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="72" hits="0" branch="false"/>
+            <line number="74" hits="0" branch="false"/>
+            <line number="75" hits="0" branch="false"/>
+            <line number="80" hits="30" branch="false"/>
+            <line number="81" hits="30" branch="false"/>
+            <line number="83" hits="72" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="84" hits="42" branch="false"/>
+            <line number="85" hits="42" branch="false"/>
+            <line number="87" hits="30" branch="false"/>
+            <line number="92" hits="0" branch="false"/>
+            <line number="97" hits="21" branch="false"/>
+            <line number="102" hits="24" branch="false"/>
+            <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="112" hits="30" branch="false"/>
+            <line number="113" hits="30" branch="false"/>
+            <line number="114" hits="72" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="115" hits="42" branch="false"/>
+            <line number="117" hits="30" branch="false"/>
+            <line number="122" hits="12" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="123" hits="0" branch="false"/>
+            <line number="125" hits="12" branch="false"/>
+            <line number="126" hits="12" branch="false"/>
+            <line number="127" hits="12" branch="false"/>
+            <line number="128" hits="12" branch="false"/>
+            <line number="133" hits="3" branch="false"/>
+            <line number="134" hits="9" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="135" hits="6" branch="false"/>
+            <line number="136" hits="6" branch="false"/>
+            <line number="137" hits="6" branch="false"/>
+            <line number="138" hits="3" branch="false"/>
+            <line number="142" hits="3" branch="false"/>
+            <line number="143" hits="3" branch="false"/>
+            <line number="144" hits="3" branch="false"/>
+            <line number="145" hits="3" branch="false"/>
+            <line number="150" hits="33" branch="false"/>
+            <line number="151" hits="33" branch="false"/>
+            <line number="152" hits="81" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="153" hits="48" branch="false"/>
+            <line number="154" hits="48" branch="false"/>
+            <line number="156" hits="33" branch="false"/>
+            <line number="161" hits="27" branch="false"/>
+            <line number="162" hits="27" branch="false"/>
+            <line number="163" hits="63" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="164" hits="36" branch="false"/>
+            <line number="166" hits="27" branch="false"/>
+            <line number="171" hits="36" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="172" hits="0" branch="false"/>
+            <line number="173" hits="36" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="174" hits="33" branch="false"/>
+            <line number="176" hits="3" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletSessionScopeMap"
+               filename="org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java"
+               line-rate="0.8617021276595744" branch-rate="0.75" complexity="3.411764705882353">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Ljavax/servlet/http/HttpServletRequest;)V" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="44" hits="24" branch="false"/>
+                <line number="45" hits="24" branch="false"/>
+                <line number="46" hits="24" branch="false"/>
+                <line number="47" hits="24" branch="false"/>
+                <line number="50" hits="24" branch="false"/>
+                <line number="51" hits="24" branch="false"/>
+              </lines>
+            </method>
+            <method name="clear" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="55" hits="6" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="56" hits="3" branch="false"/>
+                <line number="57" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="58" hits="9" branch="false"/>
+                <line number="61" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsKey" signature="(Ljava/lang/Object;)Z" line-rate="0.6666666666666666"
+                    branch-rate="0.25">
+              <lines>
+                <line number="65" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="66" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="68" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="containsValue" signature="(Ljava/lang/Object;)Z" line-rate="0.2222222222222222"
+                    branch-rate="0.25">
+              <lines>
+                <line number="74" hits="3" branch="true" condition-coverage="50% (2/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="75" hits="3" branch="false"/>
+                <line number="77" hits="0" branch="false"/>
+                <line number="78" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="79" hits="0" branch="false"/>
+                <line number="80" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="81" hits="0" branch="false"/>
+                <line number="83" hits="0" branch="false"/>
+                <line number="84" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="entrySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="89" hits="33" branch="false"/>
+                <line number="90" hits="33" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="91" hits="30" branch="false"/>
+                <line number="93" hits="96" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="94" hits="66" branch="false"/>
+                <line number="95" hits="66" branch="false"/>
+                <line number="98" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="equals" signature="(Ljava/lang/Object;)Z" line-rate="0.6666666666666666" branch-rate="0.5">
+              <lines>
+                <line number="103" hits="3" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="104" hits="0" branch="false"/>
+                <line number="106" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="get" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="112" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="113" hits="24" branch="false"/>
+                <line number="115" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="hashCode" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="121" hits="27" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="122" hits="24" branch="false"/>
+                <line number="124" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="isEmpty" signature="()Z" line-rate="0.6666666666666666" branch-rate="0.25">
+              <lines>
+                <line number="130" hits="3" branch="true" condition-coverage="25% (1/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                    <condition number="1" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="132" hits="0" branch="false"/>
+                <line number="134" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="key" signature="(Ljava/lang/Object;)Ljava/lang/String;" line-rate="0.8" branch-rate="0.75">
+              <lines>
+                <line number="217" hits="39" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="218" hits="0" branch="false"/>
+                <line number="219" hits="39" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="220" hits="36" branch="false"/>
+                <line number="222" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="keySet" signature="()Ljava/util/Set;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="140" hits="33" branch="false"/>
+                <line number="141" hits="33" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="142" hits="30" branch="false"/>
+                <line number="143" hits="96" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="144" hits="66" branch="false"/>
+                <line number="147" hits="33" branch="false"/>
+              </lines>
+            </method>
+            <method name="put" signature="(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
+                    line-rate="0.7777777777777778" branch-rate="0.75">
+              <lines>
+                <line number="152" hits="15" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="153" hits="0" branch="false"/>
+                <line number="158" hits="15" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="159" hits="3" branch="false"/>
+                <line number="160" hits="0" branch="false"/>
+                <line number="163" hits="12" branch="false"/>
+                <line number="164" hits="12" branch="false"/>
+                <line number="165" hits="12" branch="false"/>
+                <line number="166" hits="12" branch="false"/>
+              </lines>
+            </method>
+            <method name="putAll" signature="(Ljava/util/Map;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="171" hits="6" branch="false"/>
+                <line number="172" hits="12" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="173" hits="6" branch="false"/>
+                <line number="174" hits="6" branch="false"/>
+                <line number="175" hits="6" branch="false"/>
+                <line number="176" hits="6" branch="false"/>
+              </lines>
+            </method>
+            <method name="remove" signature="(Ljava/lang/Object;)Ljava/lang/Object;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="180" hits="6" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="181" hits="3" branch="false"/>
+                <line number="182" hits="3" branch="false"/>
+                <line number="183" hits="3" branch="false"/>
+                <line number="184" hits="3" branch="false"/>
+                <line number="186" hits="3" branch="false"/>
+              </lines>
+            </method>
+            <method name="sessionExists" signature="()Z" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="227" hits="234" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="228" hits="60" branch="false"/>
+                <line number="229" hits="60" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="230" hits="21" branch="false"/>
+                <line number="233" hits="234" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="234" hits="195" branch="false"/>
+                <line number="236" hits="39" branch="false"/>
+              </lines>
+            </method>
+            <method name="size" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="192" hits="36" branch="false"/>
+                <line number="193" hits="36" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="194" hits="33" branch="false"/>
+                <line number="195" hits="108" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="196" hits="75" branch="false"/>
+                <line number="197" hits="75" branch="false"/>
+                <line number="200" hits="36" branch="false"/>
+              </lines>
+            </method>
+            <method name="values" signature="()Ljava/util/Collection;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="205" hits="30" branch="false"/>
+                <line number="206" hits="30" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="207" hits="27" branch="false"/>
+                <line number="208" hits="84" branch="true" condition-coverage="100% (2/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="209" hits="57" branch="false"/>
+                <line number="212" hits="30" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="44" hits="24" branch="false"/>
+            <line number="45" hits="24" branch="false"/>
+            <line number="46" hits="24" branch="false"/>
+            <line number="47" hits="24" branch="false"/>
+            <line number="50" hits="24" branch="false"/>
+            <line number="51" hits="24" branch="false"/>
+            <line number="55" hits="6" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="56" hits="3" branch="false"/>
+            <line number="57" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="58" hits="9" branch="false"/>
+            <line number="61" hits="6" branch="false"/>
+            <line number="65" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="66" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="68" hits="3" branch="false"/>
+            <line number="74" hits="3" branch="true" condition-coverage="50% (2/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="75" hits="3" branch="false"/>
+            <line number="77" hits="0" branch="false"/>
+            <line number="78" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="79" hits="0" branch="false"/>
+            <line number="80" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="81" hits="0" branch="false"/>
+            <line number="83" hits="0" branch="false"/>
+            <line number="84" hits="0" branch="false"/>
+            <line number="89" hits="33" branch="false"/>
+            <line number="90" hits="33" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="91" hits="30" branch="false"/>
+            <line number="93" hits="96" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="94" hits="66" branch="false"/>
+            <line number="95" hits="66" branch="false"/>
+            <line number="98" hits="33" branch="false"/>
+            <line number="103" hits="3" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="104" hits="0" branch="false"/>
+            <line number="106" hits="3" branch="false"/>
+            <line number="112" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="113" hits="24" branch="false"/>
+            <line number="115" hits="3" branch="false"/>
+            <line number="121" hits="27" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="122" hits="24" branch="false"/>
+            <line number="124" hits="3" branch="false"/>
+            <line number="130" hits="3" branch="true" condition-coverage="25% (1/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+                <condition number="1" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="132" hits="0" branch="false"/>
+            <line number="134" hits="3" branch="false"/>
+            <line number="140" hits="33" branch="false"/>
+            <line number="141" hits="33" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="142" hits="30" branch="false"/>
+            <line number="143" hits="96" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="144" hits="66" branch="false"/>
+            <line number="147" hits="33" branch="false"/>
+            <line number="152" hits="15" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="153" hits="0" branch="false"/>
+            <line number="158" hits="15" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="159" hits="3" branch="false"/>
+            <line number="160" hits="0" branch="false"/>
+            <line number="163" hits="12" branch="false"/>
+            <line number="164" hits="12" branch="false"/>
+            <line number="165" hits="12" branch="false"/>
+            <line number="166" hits="12" branch="false"/>
+            <line number="171" hits="6" branch="false"/>
+            <line number="172" hits="12" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="173" hits="6" branch="false"/>
+            <line number="174" hits="6" branch="false"/>
+            <line number="175" hits="6" branch="false"/>
+            <line number="176" hits="6" branch="false"/>
+            <line number="180" hits="6" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="181" hits="3" branch="false"/>
+            <line number="182" hits="3" branch="false"/>
+            <line number="183" hits="3" branch="false"/>
+            <line number="184" hits="3" branch="false"/>
+            <line number="186" hits="3" branch="false"/>
+            <line number="192" hits="36" branch="false"/>
+            <line number="193" hits="36" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="194" hits="33" branch="false"/>
+            <line number="195" hits="108" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="196" hits="75" branch="false"/>
+            <line number="197" hits="75" branch="false"/>
+            <line number="200" hits="36" branch="false"/>
+            <line number="205" hits="30" branch="false"/>
+            <line number="206" hits="30" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="207" hits="27" branch="false"/>
+            <line number="208" hits="84" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="209" hits="57" branch="false"/>
+            <line number="212" hits="30" branch="false"/>
+            <line number="217" hits="39" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="218" hits="0" branch="false"/>
+            <line number="219" hits="39" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="220" hits="36" branch="false"/>
+            <line number="222" hits="3" branch="false"/>
+            <line number="227" hits="234" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="228" hits="60" branch="false"/>
+            <line number="229" hits="60" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="230" hits="21" branch="false"/>
+            <line number="233" hits="234" branch="true" condition-coverage="100% (2/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="234" hits="195" branch="false"/>
+            <line number="236" hits="39" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletSetLocaleCommand"
+               filename="org/apache/commons/chain/web/servlet/ServletSetLocaleCommand.java" line-rate="0.0"
+               branch-rate="1.0" complexity="1.0">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="31" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="setLocale" signature="(Lorg/apache/commons/chain/Context;Ljava/util/Locale;)V" line-rate="0.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="45" hits="0" branch="false"/>
+                <line number="47" hits="0" branch="false"/>
+                <line number="49" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="31" hits="0" branch="false"/>
+            <line number="45" hits="0" branch="false"/>
+            <line number="47" hits="0" branch="false"/>
+            <line number="49" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.apache.commons.chain.web.servlet.ServletWebContext"
+               filename="org/apache/commons/chain/web/servlet/ServletWebContext.java" line-rate="0.96875"
+               branch-rate="1.0" complexity="2.125">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="46" hits="0" branch="false"/>
+                <line number="47" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="&lt;init&gt;"
+                    signature="(Ljavax/servlet/ServletContext;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="60" hits="123" branch="false"/>
+                <line number="62" hits="123" branch="false"/>
+                <line number="64" hits="123" branch="false"/>
+                <line number="74" hits="123" branch="false"/>
+                <line number="80" hits="123" branch="false"/>
+                <line number="87" hits="123" branch="false"/>
+                <line number="94" hits="123" branch="false"/>
+                <line number="101" hits="123" branch="false"/>
+                <line number="107" hits="123" branch="false"/>
+                <line number="114" hits="123" branch="false"/>
+                <line number="121" hits="123" branch="false"/>
+                <line number="127" hits="123" branch="false"/>
+                <line number="134" hits="123" branch="false"/>
+                <line number="140" hits="123" branch="false"/>
+                <line number="147" hits="123" branch="false"/>
+              </lines>
+            </method>
+            <method name="getApplicationScope" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="249" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="250" hits="21" branch="false"/>
+                <line number="252" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getContext" signature="()Ljavax/servlet/ServletContext;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="160" hits="39" branch="false"/>
+              </lines>
+            </method>
+            <method name="getCookies" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="340" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="341" hits="21" branch="false"/>
+                <line number="343" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getHeader" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="264" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="265" hits="21" branch="false"/>
+                <line number="267" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getHeaderValues" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="279" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="280" hits="21" branch="false"/>
+                <line number="282" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getInitParam" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="294" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="295" hits="21" branch="false"/>
+                <line number="297" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getParam" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="309" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="310" hits="21" branch="false"/>
+                <line number="312" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getParamValues" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="324" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="325" hits="21" branch="false"/>
+                <line number="327" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getRequest" signature="()Ljavax/servlet/http/HttpServletRequest;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="172" hits="96" branch="false"/>
+              </lines>
+            </method>
+            <method name="getRequestScope" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="355" hits="57" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="356" hits="21" branch="false"/>
+                <line number="358" hits="57" branch="false"/>
+              </lines>
+            </method>
+            <method name="getResponse" signature="()Ljavax/servlet/http/HttpServletResponse;" line-rate="1.0"
+                    branch-rate="1.0">
+              <lines>
+                <line number="184" hits="39" branch="false"/>
+              </lines>
+            </method>
+            <method name="getSessionScope" signature="()Ljava/util/Map;" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="370" hits="60" branch="true" condition-coverage="100% (4/4)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="100%"/>
+                    <condition number="1" type="jump" coverage="100%"/>
+                  </conditions>
+                </line>
+                <line number="371" hits="24" branch="false"/>
+                <line number="373" hits="60" branch="false"/>
+              </lines>
+            </method>
+            <method name="initialize"
+                    signature="(Ljavax/servlet/ServletContext;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V"
+                    line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="202" hits="123" branch="false"/>
+                <line number="203" hits="123" branch="false"/>
+                <line number="204" hits="123" branch="false"/>
+                <line number="208" hits="123" branch="false"/>
+              </lines>
+            </method>
+            <method name="release" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="220" hits="3" branch="false"/>
+                <line number="221" hits="3" branch="false"/>
+                <line number="222" hits="3" branch="false"/>
+                <line number="223" hits="3" branch="false"/>
+                <line number="224" hits="3" branch="false"/>
+                <line number="225" hits="3" branch="false"/>
+                <line number="226" hits="3" branch="false"/>
+                <line number="227" hits="3" branch="false"/>
+                <line number="228" hits="3" branch="false"/>
+                <line number="231" hits="3" branch="false"/>
+                <line number="232" hits="3" branch="false"/>
+                <line number="233" hits="3" branch="false"/>
+                <line number="235" hits="3" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="46" hits="0" branch="false"/>
+            <line number="47" hits="0" branch="false"/>
+            <line number="60" hits="123" branch="false"/>
+            <line number="62" hits="123" branch="false"/>
+            <line number="64" hits="123" branch="false"/>
+            <line number="74" hits="123" branch="false"/>
+            <line number="80" hits="123" branch="false"/>
+            <line number="87" hits="123" branch="false"/>
+            <line number="94" hits="123" branch="false"/>
+            <line number="101" hits="123" branch="false"/>
+            <line number="107" hits="123" branch="false"/>
+            <line number="114" hits="123" branch="false"/>
+            <line number="121" hits="123" branch="false"/>
+            <line number="127" hits="123" branch="false"/>
+            <line number="134" hits="123" branch="false"/>
+            <line number="140" hits="123" branch="false"/>
+            <line number="147" hits="123" branch="false"/>
+            <line number="160" hits="39" branch="false"/>
+            <line number="172" hits="96" branch="false"/>
+            <line number="184" hits="39" branch="false"/>
+            <line number="202" hits="123" branch="false"/>
+            <line number="203" hits="123" branch="false"/>
+            <line number="204" hits="123" branch="false"/>
+            <line number="208" hits="123" branch="false"/>
+            <line number="220" hits="3" branch="false"/>
+            <line number="221" hits="3" branch="false"/>
+            <line number="222" hits="3" branch="false"/>
+            <line number="223" hits="3" branch="false"/>
+            <line number="224" hits="3" branch="false"/>
+            <line number="225" hits="3" branch="false"/>
+            <line number="226" hits="3" branch="false"/>
+            <line number="227" hits="3" branch="false"/>
+            <line number="228" hits="3" branch="false"/>
+            <line number="231" hits="3" branch="false"/>
+            <line number="232" hits="3" branch="false"/>
+            <line number="233" hits="3" branch="false"/>
+            <line number="235" hits="3" branch="false"/>
+            <line number="249" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="250" hits="21" branch="false"/>
+            <line number="252" hits="57" branch="false"/>
+            <line number="264" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="265" hits="21" branch="false"/>
+            <line number="267" hits="57" branch="false"/>
+            <line number="279" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="280" hits="21" branch="false"/>
+            <line number="282" hits="57" branch="false"/>
+            <line number="294" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="295" hits="21" branch="false"/>
+            <line number="297" hits="57" branch="false"/>
+            <line number="309" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="310" hits="21" branch="false"/>
+            <line number="312" hits="57" branch="false"/>
+            <line number="324" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="325" hits="21" branch="false"/>
+            <line number="327" hits="57" branch="false"/>
+            <line number="340" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="341" hits="21" branch="false"/>
+            <line number="343" hits="57" branch="false"/>
+            <line number="355" hits="57" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="356" hits="21" branch="false"/>
+            <line number="358" hits="57" branch="false"/>
+            <line number="370" hits="60" branch="true" condition-coverage="100% (4/4)">
+              <conditions>
+                <condition number="0" type="jump" coverage="100%"/>
+                <condition number="1" type="jump" coverage="100%"/>
+              </conditions>
+            </line>
+            <line number="371" hits="24" branch="false"/>
+            <line number="373" hits="60" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+  </packages>
+</coverage>
diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldInsertCoverageAtFileLevel/coverage.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldInsertCoverageAtFileLevel/coverage.xml
new file mode 100644 (file)
index 0000000..0f9517a
--- /dev/null
@@ -0,0 +1,180 @@
+<?xml version="1.0"?>
+<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
+
+<coverage line-rate="0.37142857142857144" branch-rate="0.25" lines-covered="13" lines-valid="35" branches-covered="1"
+          branches-valid="4" complexity="1.3076923076923077" version="1.9.2" timestamp="1253274062754">
+  <sources>
+    <source>/Users/simon/projects/sonar/trunk/tests/integration/reference-projects/reference/src/main/java</source>
+    <source>--source</source>
+  </sources>
+  <packages>
+    <package name="org.sonar.samples" line-rate="0.37142857142857144" branch-rate="0.25"
+             complexity="1.3076923076923077">
+      <classes>
+        <class name="org.sonar.samples.InnerClass" filename="org/sonar/samples/InnerClass.java"
+               line-rate="0.5384615384615384" branch-rate="0.5" complexity="1.3076923076923077">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="22" hits="2" branch="false"/>
+                <line number="44" hits="2" branch="false"/>
+              </lines>
+            </method>
+            <method name="methodOne" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="25" hits="0" branch="false"/>
+                <line number="26" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="methodReturnThree" signature="()I" line-rate="0.8333333333333334" branch-rate="0.5">
+              <lines>
+                <line number="34" hits="1" branch="false"/>
+                <line number="35" hits="1" branch="false"/>
+                <line number="36" hits="1" branch="true" condition-coverage="50% (1/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="50%"/>
+                  </conditions>
+                </line>
+                <line number="37" hits="0" branch="false"/>
+                <line number="39" hits="1" branch="false"/>
+                <line number="41" hits="1" branch="false"/>
+              </lines>
+            </method>
+            <method name="methodTwo" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="29" hits="0" branch="false"/>
+                <line number="30" hits="0" branch="false"/>
+                <line number="31" hits="0" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="22" hits="2" branch="false"/>
+            <line number="25" hits="0" branch="false"/>
+            <line number="26" hits="0" branch="false"/>
+            <line number="29" hits="0" branch="false"/>
+            <line number="30" hits="0" branch="false"/>
+            <line number="31" hits="0" branch="false"/>
+            <line number="34" hits="1" branch="false"/>
+            <line number="35" hits="1" branch="false"/>
+            <line number="36" hits="1" branch="true" condition-coverage="50% (1/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="50%"/>
+              </conditions>
+            </line>
+            <line number="37" hits="0" branch="false"/>
+            <line number="39" hits="1" branch="false"/>
+            <line number="41" hits="1" branch="false"/>
+            <line number="44" hits="2" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.sonar.samples.InnerClass$InnerClassInside" filename="org/sonar/samples/InnerClass.java"
+               line-rate="0.2727272727272727" branch-rate="0.0" complexity="1.3076923076923077">
+          <methods>
+            <method name="&lt;init&gt;" signature="(Lorg/sonar/samples/InnerClass;)V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="46" hits="1" branch="false"/>
+                <line number="47" hits="1" branch="false"/>
+              </lines>
+            </method>
+            <method name="innerMethodOne" signature="()V" line-rate="0.0" branch-rate="0.0">
+              <lines>
+                <line number="50" hits="0" branch="false"/>
+                <line number="51" hits="0" branch="false"/>
+                <line number="52" hits="0" branch="true" condition-coverage="0% (0/2)">
+                  <conditions>
+                    <condition number="0" type="jump" coverage="0%"/>
+                  </conditions>
+                </line>
+                <line number="53" hits="0" branch="false"/>
+                <line number="55" hits="0" branch="false"/>
+                <line number="57" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="innerMethodTwo" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="60" hits="0" branch="false"/>
+                <line number="61" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="methodReturnFour" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="64" hits="1" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="46" hits="1" branch="false"/>
+            <line number="47" hits="1" branch="false"/>
+            <line number="50" hits="0" branch="false"/>
+            <line number="51" hits="0" branch="false"/>
+            <line number="52" hits="0" branch="true" condition-coverage="0% (0/2)">
+              <conditions>
+                <condition number="0" type="jump" coverage="0%"/>
+              </conditions>
+            </line>
+            <line number="53" hits="0" branch="false"/>
+            <line number="55" hits="0" branch="false"/>
+            <line number="57" hits="0" branch="false"/>
+            <line number="60" hits="0" branch="false"/>
+            <line number="61" hits="0" branch="false"/>
+            <line number="64" hits="1" branch="false"/>
+          </lines>
+        </class>
+        <class name="org.sonar.samples.PrivateClass" filename="org/sonar/samples/InnerClass.java"
+               line-rate="0.2727272727272727" branch-rate="1.0" complexity="1.3076923076923077">
+          <methods>
+            <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="71" hits="1" branch="false"/>
+                <line number="73" hits="1" branch="false"/>
+              </lines>
+            </method>
+            <method name="innerMethodFive" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="85" hits="0" branch="false"/>
+                <line number="87" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="innerMethodFour" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="80" hits="0" branch="false"/>
+                <line number="81" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="innerMethodSix" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="91" hits="0" branch="false"/>
+                <line number="93" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="innerMethodThree" signature="()V" line-rate="0.0" branch-rate="1.0">
+              <lines>
+                <line number="76" hits="0" branch="false"/>
+                <line number="77" hits="0" branch="false"/>
+              </lines>
+            </method>
+            <method name="methodReturnfive" signature="()I" line-rate="1.0" branch-rate="1.0">
+              <lines>
+                <line number="96" hits="1" branch="false"/>
+              </lines>
+            </method>
+          </methods>
+          <lines>
+            <line number="71" hits="1" branch="false"/>
+            <line number="73" hits="1" branch="false"/>
+            <line number="76" hits="0" branch="false"/>
+            <line number="77" hits="0" branch="false"/>
+            <line number="80" hits="0" branch="false"/>
+            <line number="81" hits="0" branch="false"/>
+            <line number="85" hits="0" branch="false"/>
+            <line number="87" hits="0" branch="false"/>
+            <line number="91" hits="0" branch="false"/>
+            <line number="93" hits="0" branch="false"/>
+            <line number="96" hits="1" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+  </packages>
+</coverage>
diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldNotCountTwiceAnonymousClasses.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/utils/CoberturaReportParserUtilsTest/shouldNotCountTwiceAnonymousClasses.xml
new file mode 100644 (file)
index 0000000..55fa298
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
+
+
+
+<!-- line 26 is defined in two nodes -->    
+
+
+
+<coverage line-rate="0.37142857142857144" branch-rate="0.25" lines-covered="13" lines-valid="35" branches-covered="1"
+          branches-valid="4" complexity="1.3076923076923077" version="1.9.2" timestamp="1253274062754">
+  <sources>
+    <source>/Users/simon/projects/sonar/trunk/tests/integration/reference-projects/reference/src/main/java</source>
+    <source>--source</source>
+  </sources>
+  <packages>
+    <package name="org.sonar.samples" line-rate="0.37142857142857144" branch-rate="0.25"
+             complexity="1.3076923076923077">
+      <classes>
+        <class name="MyClass" filename="org/sonar/samples/MyFile.java"
+               line-rate="0.5384615384615384" branch-rate="0.5" complexity="1.3076923076923077">
+          <lines>
+            <line number="22" hits="2" branch="false"/>
+            <line number="25" hits="0" branch="false"/>
+            <line number="26" hits="0" branch="false"/>
+          </lines>
+        </class>
+        <class name="MyClass$1" filename="org/sonar/samples/MyFile.java"
+               line-rate="0.5384615384615384" branch-rate="0.5" complexity="1.3076923076923077">
+          <lines>
+
+            <line number="26" hits="0" branch="false"/>
+            <line number="27" hits="0" branch="false"/>
+            <line number="28" hits="0" branch="false"/>
+          </lines>
+        </class>
+      </classes>
+    </package>
+  </packages>
+</coverage>