]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5884 Remove usages of the component viewer
authorStas Vilchik <vilchiks@gmail.com>
Tue, 2 Dec 2014 14:01:41 +0000 (15:01 +0100)
committerStas Vilchik <stasvilchik@Stas-Vilchik-iMac.local>
Wed, 10 Dec 2014 08:07:52 +0000 (09:07 +0100)
92 files changed:
server/sonar-web/Gruntfile.coffee
server/sonar-web/src/main/coffee/component-viewer/app.coffee [deleted file]
server/sonar-web/src/main/coffee/dashboard/file-app.coffee [deleted file]
server/sonar-web/src/main/coffee/drilldown/app.coffee [deleted file]
server/sonar-web/src/main/coffee/issue/issue-view.coffee
server/sonar-web/src/main/coffee/issue/manual-issue-view.coffee
server/sonar-web/src/main/coffee/issues/component-viewer/main.coffee
server/sonar-web/src/main/hbs/source-viewer/source-viewer-header.hbs [new file with mode: 0644]
server/sonar-web/src/main/hbs/source-viewer/source-viewer-measures.hbs [new file with mode: 0644]
server/sonar-web/src/main/hbs/source-viewer/source-viewer-more-actions.hbs [new file with mode: 0644]
server/sonar-web/src/main/hbs/source-viewer/source-viewer.hbs
server/sonar-web/src/main/js/drilldown/app.js [new file with mode: 0644]
server/sonar-web/src/main/js/graphics/pie-chart.js [new file with mode: 0644]
server/sonar-web/src/main/js/source-viewer/app.js [new file with mode: 0644]
server/sonar-web/src/main/js/source-viewer/header.js [new file with mode: 0644]
server/sonar-web/src/main/js/source-viewer/measures-overlay.js [new file with mode: 0644]
server/sonar-web/src/main/js/source-viewer/more-actions.js [new file with mode: 0644]
server/sonar-web/src/main/js/source-viewer/popups/line-actions-popup.js
server/sonar-web/src/main/js/source-viewer/viewer.js
server/sonar-web/src/main/js/tests/e2e/lib.js
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-coverage-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-duplications-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-favorite-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-issues-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-lines-filters-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-link-to-raw-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-select-tab-by-metric-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec.js [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/app-not-logged-in.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/app.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/coverage.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/cross-project-duplications.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications-in-deleted-files.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/issues.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/resources-without-ncloc-data.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/resources.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/scm.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/source.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/test-cases.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/app.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/covered-files.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/resources.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/source.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/tests.json [deleted file]
server/sonar-web/src/main/js/tests/e2e/tests/issues-spec.js
server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/components-app.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/lines.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/search.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/search-reopened.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-favorite-spec.js [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-link-to-raw-spec.js [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file.js [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-components-app.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-issues-search.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-resources.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-sources-lines.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-tests-show.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures.js [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-components-app.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-issues-search.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-resources.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-sources-lines.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec.js [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/app-not-logged-in.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/app.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/coverage.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/create-issue.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/cross-project-duplications.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/duplications-in-deleted-files.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/duplications.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/issues.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/lines.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/resources-without-ncloc-data.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/resources.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/scm.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/source.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/test-cases.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/app.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/lines.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/tests.json [new file with mode: 0644]
server/sonar-web/src/main/js/tests/e2e/views/component-viewer.jade [deleted file]
server/sonar-web/src/main/js/tests/e2e/views/source-viewer.jade [new file with mode: 0644]
server/sonar-web/src/main/js/widgets/pie-chart.js
server/sonar-web/src/main/less/components.less
server/sonar-web/src/main/less/components/measures.less [new file with mode: 0644]
server/sonar-web/src/main/less/components/source.less
server/sonar-web/src/main/webapp/WEB-INF/app/controllers/component_controller.rb
server/sonar-web/src/main/webapp/WEB-INF/app/views/component/index.html.erb
server/sonar-web/src/main/webapp/WEB-INF/app/views/dashboard/no_dashboard.html.erb
server/sonar-web/src/main/webapp/WEB-INF/app/views/drilldown/measures.html.erb
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index 75826ff14c03771b6745ad6c63b313e99d6fbdf4..e4caebb3605f79e5b8d971057e142dbec4d2598f 100644 (file)
@@ -93,6 +93,7 @@ module.exports = (grunt) ->
             '<%= pkg.assets %>js/widgets/histogram.js'
             '<%= pkg.assets %>js/widgets/word-cloud.js'
             '<%= pkg.assets %>js/widgets/treemap.js'
+            '<%= pkg.assets %>js/graphics/pie-chart.js'
             '<%= pkg.assets %>js/top-search.js'
             '<%= pkg.assets %>js/sortable.js'
             '<%= pkg.assets %>js/common/inputs.js'
@@ -127,6 +128,7 @@ module.exports = (grunt) ->
             '<%= pkg.assets %>js/widgets/histogram.js'
             '<%= pkg.assets %>js/widgets/word-cloud.js'
             '<%= pkg.assets %>js/widgets/treemap.js'
+            '<%= pkg.assets %>js/graphics/pie-chart.js'
             '<%= pkg.assets %>js/top-search.js'
             '<%= pkg.assets %>js/sortable.js'
             '<%= pkg.assets %>js/common/inputs.js'
@@ -192,17 +194,13 @@ module.exports = (grunt) ->
         name: 'drilldown/app'
         out: '<%= pkg.assets %>build/js/drilldown/app.js'
 
-      dashboardFile: options:
-        name: 'dashboard/file-app'
-        out: '<%= pkg.assets %>build/js/dashboard/file-app.js'
-
       dashboard: options:
         name: 'dashboard/app'
         out: '<%= pkg.assets %>build/js/dashboard/app.js'
 
-      componentViewer: options:
-        name: 'component-viewer/app'
-        out: '<%= pkg.assets %>build/js/component-viewer/app.js'
+      sourceViewer: options:
+        name: 'source-viewer/app'
+        out: '<%= pkg.assets %>build/js/source-viewer/app.js'
 
       design: options:
         name: 'design/app'
@@ -315,6 +313,13 @@ module.exports = (grunt) ->
           'fail-fast': true
           port: '<%= grunt.option("port") %>'
         src: ['<%= pkg.sources %>js/tests/e2e/tests/<%= grunt.option("spec") %>-spec.js']
+      testfile:
+        options:
+          test: true
+          verbose: true
+          'fail-fast': true
+          port: '<%= grunt.option("port") %>'
+        src: ['<%= grunt.option("file") %>']
 
 
     uglify:
@@ -396,6 +401,9 @@ module.exports = (grunt) ->
   grunt.registerTask 'single',
       ['dev', 'express:test', 'casper:single']
 
+  grunt.registerTask 'testfile',
+      ['dev', 'express:test', 'casper:testfile']
+
   # tasks used by Maven build (see pom.xml)
   grunt.registerTask 'maven-build-skip-tests-true',
       ['build']
diff --git a/server/sonar-web/src/main/coffee/component-viewer/app.coffee b/server/sonar-web/src/main/coffee/component-viewer/app.coffee
deleted file mode 100644 (file)
index 30d4c76..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-requirejs.config
-  baseUrl: "#{baseUrl}/js"
-
-  paths:
-    'backbone': 'third-party/backbone'
-    'backbone.marionette': 'third-party/backbone.marionette'
-    'handlebars': 'third-party/handlebars'
-
-  shim:
-    'backbone.marionette':
-      deps: ['backbone']
-      exports: 'Marionette'
-    'backbone':
-      exports: 'Backbone'
-    'handlebars':
-      exports: 'Handlebars'
-
-
-requirejs [
-  'backbone.marionette'
-  'component-viewer/main'
-], (
-  Marionette
-  ComponentViewer
-) ->
-
-  $ = jQuery
-  API_ISSUE = "#{baseUrl}/api/issues/show"
-  App = new Marionette.Application()
-  el = $('#body')
-
-
-  App.addRegions
-    viewerRegion: '#component-viewer'
-
-
-  App.resizeContainer = ->
-    width = $(window).width()
-    height = $(window).height()
-    el.innerWidth(width).innerHeight(height)
-
-
-  App.requestComponentViewer = (s, currentIssue) ->
-    if s?
-      settings = issues: false, coverage: false, duplications: false, scm: false, workspace: false
-      s.split(',').forEach (d) -> settings[d] = true
-      settings.issues = false if currentIssue?
-    else settings = null
-    unless App.componentViewer?
-      @resizeContainer()
-      $(window).on 'resize', => @resizeContainer()
-      App.componentViewer = new ComponentViewer
-        settings: settings
-        elementToFit: el
-      App.viewerRegion.show App.componentViewer
-    App.componentViewer
-
-
-  App.addInitializer ->
-    # Define parameters
-    paramsHash = location.hash.substr(1)
-    params = {}
-    paramsHash.split('&').forEach (d) ->
-      t = d.split '='
-      params[t[0]] = decodeURIComponent t[1]
-
-    viewer = App.requestComponentViewer params.settings, params.currentIssue
-    if params.component?
-      loadIssue = (key) ->
-        $.get API_ISSUE, key: key, (r) =>
-          viewer.showIssues false, r.issue
-
-      if params.line?
-        viewer.sourceView.highlightedLine = params.line
-        viewer.on 'sized', ->
-          viewer.off 'sized'
-          viewer.scrollToLine params.line
-
-      if params.blocks?
-        blocks = params.blocks.split(';').map (b) ->
-          t = b.split ','
-          from: +t[0], to: +t[1]
-        viewer.on 'resetShowBlocks', ->
-          viewer.off 'resetShowBlocks'
-          viewer.sourceView.showBlocks = blocks
-
-      viewer.open params.component
-
-      viewer.on 'loaded', ->
-        viewer.off 'loaded'
-        if params.tab? && params.item? && params.period?
-          viewer.headerView.enableBar(params.tab).done ->
-            viewer.enablePeriod +params.period, params.item
-        else if params.tab? && params.item?
-          viewer.state.set activeHeaderTab: params.tab, activeHeaderItem: params.item
-          viewer.headerView.render()
-        else if params.tab? && params.period?
-          viewer.headerView.enableBar(params.tab).done ->
-            viewer.enablePeriod params.period
-        else if params.tab? && params.currentIssue?
-          loadIssue(params.currentIssue).done ->
-            viewer.state.set activeHeaderTab: params.tab
-            viewer.headerView.render()
-        else if params.tab?
-          viewer.state.set activeHeaderTab: params.tab
-          viewer.headerView.render()
-          viewer.showAllLines()
-        else if params.currentIssue?
-          loadIssue params.currentIssue
-        else viewer.showAllLines()
-
-
-
-  # Message bundles
-  l10nXHR = window.requestMessages()
-
-
-  $.when(l10nXHR).done ->
-    # Start the application
-    App.start()
diff --git a/server/sonar-web/src/main/coffee/dashboard/file-app.coffee b/server/sonar-web/src/main/coffee/dashboard/file-app.coffee
deleted file mode 100644 (file)
index 0e35c08..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-requirejs.config
-  baseUrl: "#{baseUrl}/js"
-
-  paths:
-    'backbone': 'third-party/backbone'
-    'backbone.marionette': 'third-party/backbone.marionette'
-    'handlebars': 'third-party/handlebars'
-
-  shim:
-    'backbone.marionette':
-      deps: ['backbone']
-      exports: 'Marionette'
-    'backbone':
-      exports: 'Backbone'
-    'handlebars':
-      exports: 'Handlebars'
-
-
-requirejs [
-  'backbone.marionette'
-  'component-viewer/main'
-  'drilldown/conf'
-], (
-  Marionette
-  ComponentViewer
-  MetricConf
-) ->
-
-  $ = jQuery
-
-  App = new Marionette.Application()
-  el = $('#accordion-panel')
-
-
-  App.addRegions
-    viewerRegion: '#accordion-panel'
-
-
-  App.resizeContainer = ->
-    width = $(window).width()
-    height = $(window).height() - el.offset().top - $('#footer').height() - 10
-    el.innerWidth(width).innerHeight(height)
-
-
-  App.requestComponentViewer = ->
-    unless App.componentViewer?
-      @resizeContainer()
-      $(window).on 'resize', => @resizeContainer()
-      App.componentViewer = new ComponentViewer
-        elementToFit: el
-      App.viewerRegion.show App.componentViewer
-    App.componentViewer
-
-
-
-  App.addInitializer ->
-    viewer = App.requestComponentViewer()
-    if window.metric?
-      metricConf = MetricConf[window.metric]
-      if metricConf?
-        activeHeaderTab = metricConf.tab
-        activeHeaderItem = metricConf.item
-    viewer.open window.fileKey
-    viewer.on 'loaded', ->
-      viewer.off 'loaded'
-      if activeHeaderTab? && activeHeaderItem?
-        viewer.state.set activeHeaderTab: activeHeaderTab, activeHeaderItem: activeHeaderItem
-        viewer.headerView.render()
-      else
-        viewer.showAllLines()
-
-
-  # Message bundles
-  l10nXHR = window.requestMessages()
-
-
-  $.when(l10nXHR).done ->
-    # Start the application
-    App.start()
diff --git a/server/sonar-web/src/main/coffee/drilldown/app.coffee b/server/sonar-web/src/main/coffee/drilldown/app.coffee
deleted file mode 100644 (file)
index 860b9b3..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-requirejs.config
-  baseUrl: "#{baseUrl}/js"
-
-  paths:
-    'backbone': 'third-party/backbone'
-    'backbone.marionette': 'third-party/backbone.marionette'
-    'handlebars': 'third-party/handlebars'
-
-  shim:
-    'backbone.marionette':
-      deps: ['backbone']
-      exports: 'Marionette'
-    'backbone':
-      exports: 'Backbone'
-    'handlebars':
-      exports: 'Handlebars'
-
-
-requirejs [
-  'backbone.marionette'
-  'component-viewer/main'
-  'drilldown/conf'
-], (
-  Marionette
-  ComponentViewer
-  MetricConf
-) ->
-
-  $ = jQuery
-  App = new Marionette.Application()
-  el = $('#accordion-panel')
-
-
-  App.addRegions
-    viewerRegion: '#accordion-panel'
-
-
-  App.resizeContainer = ->
-    height = Math.min 780, ($(window).height() - 20)
-    el.innerHeight(height)
-
-
-  App.requestComponentViewer = ->
-    unless App.componentViewer?
-      @resizeContainer()
-      $(window).on 'resize', => @resizeContainer()
-      App.componentViewer = new ComponentViewer
-        elementToFit: el
-      App.viewerRegion.show App.componentViewer
-    App.componentViewer
-
-
-  App.addInitializer ->
-    # Define parameters
-    drilldown = window.drilldown || {}
-    activeHeaderTab = 'issues'
-    activeHeaderItem = '.js-filter-unresolved-issues'
-    if drilldown.metric?
-      metricConf = MetricConf[drilldown.metric]
-      if metricConf?
-        activeHeaderTab = metricConf.tab
-        activeHeaderItem = metricConf.item
-      else
-        activeHeaderTab = 'basic'
-        activeHeaderItem = null
-    else if drilldown.rule?
-      activeHeaderTab = 'issues'
-      activeHeaderItem = ".js-filter-rule[data-rule='#{drilldown.rule}']"
-    else if drilldown.severity?
-      activeHeaderTab = 'issues'
-      activeHeaderItem = ".js-filter-#{drilldown.severity}-issues"
-
-    # Add event listeners
-    $('.js-drilldown-link').on 'click', (e) ->
-      e.preventDefault()
-      key = $(e.currentTarget).data 'key'
-      viewer = App.requestComponentViewer()
-
-      f = ->
-        if drilldown.period?
-          viewer.enablePeriod drilldown.period, activeHeaderItem
-        else if activeHeaderItem?
-          viewer.state.set activeHeaderTab: activeHeaderTab, activeHeaderItem: activeHeaderItem
-          viewer.render()
-        else viewer.showAllLines()
-
-      viewer.open key
-      viewer.on 'loaded', ->
-        viewer.off 'loaded'
-        if activeHeaderTab?
-          viewer.headerView.enableBar(activeHeaderTab).done -> f()
-        else f()
-
-
-
-  # Message bundles
-  l10nXHR = window.requestMessages()
-
-
-  $.when(l10nXHR).done ->
-    # Start the application
-    App.start()
index a747345efd28e8cf94b146114700028b26dcb380..852996908f0b3a96f89a583700b77ee9bb9236e5 100644 (file)
@@ -64,6 +64,7 @@ define [
 
 
     onRender: ->
+      @$el.attr 'data-key', @model.get('key')
 
 
     resetIssue: (options, p) ->
index cf570fefc420b2c43b8fd95f7e1aea3f451c0129..f1945994a1529cc19b28fc9ca0ccd665edfe461c 100644 (file)
@@ -60,6 +60,8 @@ define [
       data = $(e.currentTarget).serialize()
       $.post API_ADD_MANUAL_ISSUE, data
         .done (r) =>
+          r = JSON.parse(r) if typeof r == 'string'
+          console.log r
           @addIssue r.issue.key
         .fail (r) =>
           @hideSpinner()
index 098e878aa454783a3e1457175a3de06b76ab20b9..8101cbd5a933a87efb771dfaeec61d3df65ed0fb 100644 (file)
@@ -25,18 +25,16 @@ define [
     events: ->
       _.extend super,
         'click .js-close-component-viewer': 'closeComponentViewer'
-        'click .sym': 'highlightUsages'
         'click .code-issue': 'selectIssue'
 
 
     initialize: (options) ->
       super
-      @listenTo @, 'loaded', @onLoaded
       @listenTo options.app.state, 'change:selectedIndex', @select
 
 
     onLoaded: ->
-      @bindScrollEvents()
+      super
       @bindShortcuts()
       if @baseIssue?
         @scrollToLine @baseIssue.get 'line'
@@ -166,6 +164,10 @@ define [
         @addIssuesPerLineMeta @issues
 
 
+    renderIssues: ->
+      @issues.forEach @renderIssue, @
+
+
     renderIssue: (issue) ->
       issueView = new IssueView
         el: '#issue-' + issue.get('key')
@@ -189,11 +191,3 @@ define [
 
     closeComponentViewer: ->
       @options.app.controller.closeComponentViewer()
-
-
-    highlightUsages: (e) ->
-      highlighted = $(e.currentTarget).is '.highlighted'
-      key = e.currentTarget.className.split(/\s+/)[0]
-      @$('.sym.highlighted').removeClass 'highlighted'
-      @$(".sym.#{key}").addClass 'highlighted' unless highlighted
-
diff --git a/server/sonar-web/src/main/hbs/source-viewer/source-viewer-header.hbs b/server/sonar-web/src/main/hbs/source-viewer/source-viewer-header.hbs
new file mode 100644 (file)
index 0000000..a010166
--- /dev/null
@@ -0,0 +1,81 @@
+<div class="source-viewer-header-component">
+  {{#unless removed}}
+    {{#if projectName}}
+      <div class="source-viewer-header-component-project">
+        {{qualifierIcon 'TRK'}}&nbsp;<a href="{{dashboardUrl project}}">{{projectName}}</a>
+        {{#if subProjectName}}
+          &nbsp;&nbsp;&nbsp;
+          {{qualifierIcon 'TRK'}}&nbsp;<a href="{{dashboardUrl subProject}}">{{subProjectName}}</a>
+        {{/if}}
+      </div>
+    {{/if}}
+
+    <div class="source-viewer-header-component-name">
+      {{qualifierIcon q}} {{default path longName}}
+
+      {{#if canMarkAsFavourite}}
+        <a class="js-favorite source-viewer-header-favorite"
+           title="{{#if fav}}{{t 'click_to_remove_from_favorites'}}{{else}}{{t 'click_to_add_to_favorites'}}{{/if}}">
+          <i class="{{#if fav}}icon-favorite{{else}}icon-not-favorite{{/if}}"></i>
+        </a>
+      {{/if}}
+    </div>
+  {{else}}
+    <div class="source-viewer-header-component-project removed">{{removedMessage}}</div>
+  {{/unless}}
+</div>
+
+{{#unless removed}}
+  <a class="js-actions source-viewer-header-actions icon-list" title="{{t 'component_viewer.more_actions'}}"></a>
+
+  <div class="source-viewer-header-measures">
+    {{#if isUnitTest}}
+      <div class="source-viewer-header-measure">
+        <span class="source-viewer-header-measure-value">{{measures.fTests}}</span>
+        <span class="source-viewer-header-measure-label">{{t 'metric.tests.name'}}</span>
+      </div>
+    {{/if}}
+
+    {{#unless isUnitTest}}
+      <div class="source-viewer-header-measure">
+        <span class="source-viewer-header-measure-value">{{default measures.fLines '–'}}</span>
+        <span class="source-viewer-header-measure-label">{{t 'metric.lines.name'}}</span>
+      </div>
+    {{/unless}}
+
+    {{#if measures.fSqaleRating}}
+      <div class="source-viewer-header-measure">
+        <span class="rating rating-{{measures.fSqaleRating}}"
+              {{#if measures.fSqaleDebtRatio}}title="{{t 'metric.sqale_debt_ratio.name'}}: {{measures.fSqaleDebtRatio}}"{{/if}}>
+          {{measures.fSqaleRating}}
+        </span>
+      </div>
+    {{/if}}
+
+    <div class="source-viewer-header-measure">
+      <span class="source-viewer-header-measure-value">{{default measures.fDebt '0'}}</span>
+      <span class="source-viewer-header-measure-label">{{t 'component_viewer.header.debt'}}</span>
+    </div>
+    {{#if measures.fIssues}}
+      <div class="source-viewer-header-measure">
+        <span class="source-viewer-header-measure-value">{{measures.fIssues}}</span>
+        <span class="source-viewer-header-measure-label">{{t 'metric.violations.name'}}</span>
+      </div>
+    {{/if}}
+
+    {{#inArray tabs 'coverage'}}
+      <div class="source-viewer-header-measure">
+        <span class="source-viewer-header-measure-value">{{default measures.fCoverage '–'}}</span>
+        <span class="source-viewer-header-measure-label">{{t 'metric.coverage.name'}}</span>
+      </div>
+    {{/inArray}}
+
+    {{#inArray tabs 'duplications'}}
+      <div class="source-viewer-header-measure">
+        <span class="source-viewer-header-measure-value">{{default measures.fDuplicationDensity '–'}}</span>
+        <span class="source-viewer-header-measure-label">{{t 'duplications'}}</span>
+      </div>
+    {{/inArray}}
+
+  </div>
+{{/unless}}
diff --git a/server/sonar-web/src/main/hbs/source-viewer/source-viewer-measures.hbs b/server/sonar-web/src/main/hbs/source-viewer/source-viewer-measures.hbs
new file mode 100644 (file)
index 0000000..6e90cd3
--- /dev/null
@@ -0,0 +1,546 @@
+<table class="source-viewer-measures">
+<tr>
+{{#unless isUnitTest}}
+  <td class="source-viewer-measures-section">
+    <div class="measures">
+      <div class="measures-chart">
+        <span class="js-pie-chart"
+              data-value="{{measures.ncloc}}"
+              data-max="{{measures.lines}}"
+              data-size="70"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure measure-big" data-metric="ncloc">
+          <span class="measure-name">{{t 'metric.ncloc.name'}}</span>
+          <span class="measure-value">{{measures.ncloc}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="lines">
+          <span class="measure-name">{{t 'metric.lines.name'}}</span>
+          <span class="measure-value">{{measures.lines}}</span>
+        </div>
+      </div>
+    </div>
+
+    {{#any measures.generated_ncloc measures.generated_lines}}
+      <div class="measures">
+        <div class="measures-list">
+          {{#if measures.generated_ncloc}}
+            <div class="measure measure-one-line" data-metric="generated_ncloc">
+              <span class="measure-name">{{t 'metric.generated_ncloc.name'}}</span>
+              <span class="measure-value">{{measures.generated_ncloc}}</span>
+            </div>
+          {{/if}}
+          {{#if measures.generated_lines}}
+            <div class="measure measure-one-line" data-metric="generated_lines">
+              <span class="measure-name">{{t 'metric.generated_lines.name'}}</span>
+              <span class="measure-value">{{measures.generated_lines}}</span>
+            </div>
+          {{/if}}
+        </div>
+      </div>
+    {{/any}}
+
+    <div class="measures measures-duplex">
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="classes">
+          <span class="measure-name">{{t 'metric.classes.name'}}</span>
+          <span class="measure-value">{{measures.classes}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="functions">
+          <span class="measure-name">{{t 'metric.functions.name'}}</span>
+          <span class="measure-value">{{measures.functions}}</span>
+        </div>
+      </div>
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="accessors">
+          <span class="measure-name">{{t 'metric.accessors.name'}}</span>
+          <span class="measure-value">{{measures.accessors}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="statements">
+          <span class="measure-name">{{t 'metric.statements.name'}}</span>
+          <span class="measure-value">{{measures.statements}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-chart">
+        <span class="js-pie-chart"
+              data-value="{{measures.comment_lines_density_raw}}"
+              data-max="100"
+              data-size="40"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure-container">
+          <div class="measure measure-one-line" data-metric="comment_lines_density">
+            <span class="measure-name">Comments</span>
+            <span class="measure-value">{{measures.comment_lines_density}}</span>
+          </div>
+          <div class="measure measure-one-line" data-metric="comment_lines">
+            <span class="measure-name">{{t 'metric.comment_lines.name'}}</span>
+            <span class="measure-value">{{measures.comment_lines}}</span>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="public_api">
+          <span class="measure-name">{{t 'metric.public_api.name'}}</span>
+          <span class="measure-value">{{measures.public_api}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="public_documented_api_density">
+          <span class="measure-name">{{t 'metric.public_documented_api_density.name'}}</span>
+          <span class="measure-value">{{measures.public_documented_api_density}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="public_undocumented_api">
+          <span class="measure-name">{{t 'metric.public_undocumented_api.name'}}</span>
+          <span class="measure-value">{{measures.public_undocumented_api}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="complexity">
+          <span class="measure-name">{{t 'metric.complexity.name'}}</span>
+          <span class="measure-value">{{measures.complexity}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="function_complexity">
+          <span class="measure-name">{{t 'metric.function_complexity.name'}}</span>
+          <span class="measure-value">{{measures.function_complexity}}</span>
+        </div>
+      </div>
+    </div>
+  </td>
+{{/unless}}
+
+<td class="source-viewer-measures-section">
+  {{#notNull measures.fDebt}}
+    <div class="measures">
+      {{#notNull measures.fSqaleRating}}
+        <div class="measures-chart" data-metric="sqale_rating">
+          <span class="rating rating-{{measures.sqale_rating}}">{{measures.sqale_rating}}</span>
+        </div>
+      {{/notNull}}
+      <div class="measures-list">
+        <div class="measure measure-big" data-metric="sqale_index">
+          <span class="measure-name">{{t 'metric.sqale_index.short_name'}}</span>
+          <span class="measure-value">{{measures.sqale_index}}</span>
+        </div>
+      </div>
+    </div>
+  {{/notNull}}
+  <div class="measures measures-duplex">
+    <div class="measures-list">
+      <div class="measure measure-one-line" data-metric="violations">
+        <span class="measure-name">Issues</span>
+        <span class="measure-value">{{measures.violations}}</span>
+      </div>
+    </div>
+    {{#notNull measures.fSqaleDebtRatio}}
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="sqale_debt_ratio">
+          <span class="measure-name">{{t 'metric.sqale_debt_ratio.short_name'}}</span>
+          <span class="measure-value">{{measures.sqale_debt_ratio}}</span>
+        </div>
+      </div>
+    {{/notNull}}
+  </div>
+  {{#gt measures.fIssues 0}}
+    <div class="measures measures-duplex">
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="blocker_violations">
+          <span class="measure-name">{{severityIcon 'BLOCKER'}}&nbsp;{{t 'severity.BLOCKER'}}</span>
+          <span class="measure-value">{{default measures.blocker_violations 0}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="critical_violations">
+          <span class="measure-name">{{severityIcon 'CRITICAL'}}&nbsp;{{t 'severity.CRITICAL'}}</span>
+          <span class="measure-value">{{default measures.critical_violations 0}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="major_violations">
+          <span class="measure-name">{{severityIcon 'MAJOR'}}&nbsp;{{t 'severity.MAJOR'}}</span>
+          <span class="measure-value">{{default measures.major_violations 0}}</span>
+        </div>
+      </div>
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="minor_violations">
+          <span class="measure-name">{{severityIcon 'MINOR'}}&nbsp;{{t 'severity.MINOR'}}</span>
+          <span class="measure-value">{{default measures.minor_violations 0}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="info_violations">
+          <span class="measure-name">{{severityIcon 'INFO'}}&nbsp;{{t 'severity.INFO'}}</span>
+          <span class="measure-value">{{default measures.info_violations 0}}</span>
+        </div>
+      </div>
+    </div>
+  {{/gt}}
+</td>
+
+{{#unless isUnitTest}}
+  <td class="source-viewer-measures-section">
+  {{#all measures.coverage measures.it_coverage}}
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-size="70"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure" data-metric="coverage">
+          <span class="measure-name">{{t 'metric.coverage.name'}}</span>
+          <span class="measure-value">{{measures.coverage}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.line_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-base-color="#d4333f"
+                data-size="40"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure" data-metric="line_coverage">
+          <span class="measure-name">{{t 'metric.line_coverage.name'}}</span>
+          <span class="measure-value">{{measures.line_coverage}}</span>
+        </div>
+        <div class="measure" data-metric="lines_to_cover">
+          <span class="measure-name">{{t 'metric.lines_to_cover.name'}}</span>
+          <span class="measure-value">{{measures.lines_to_cover}}</span>
+        </div>
+        <div class="measure" data-metric="uncovered_lines">
+          <span class="measure-name">{{t 'metric.uncovered_lines.name'}}</span>
+          <span class="measure-value">{{measures.uncovered_lines}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.branch_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-base-color="#d4333f"
+                data-size="40"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure" data-metric="branch_coverage">
+          <span class="measure-name">{{t 'metric.branch_coverage.name'}}</span>
+          <span class="measure-value">{{measures.branch_coverage}}</span>
+        </div>
+        <div class="measure" data-metric="conditions_to_cover">
+          <span class="measure-name">{{t 'metric.conditions_to_cover.name'}}</span>
+          <span class="measure-value">{{measures.conditions_to_cover}}</span>
+        </div>
+        <div class="measure" data-metric="uncovered_conditions">
+          <span class="measure-name">{{t 'metric.uncovered_conditions.name'}}</span>
+          <span class="measure-value">{{measures.uncovered_conditions}}</span>
+        </div>
+      </div>
+    </div>
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.it_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-size="70"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure" data-metric="it_coverage">
+          <span class="measure-name">{{t 'metric.coverage.name'}}</span>
+          <span class="measure-value">{{measures.it_coverage}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.it_line_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-base-color="#d4333f"
+                data-size="40"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure" data-metric="it_line_coverage">
+          <span class="measure-name">{{t 'metric.line_coverage.name'}}</span>
+          <span class="measure-value">{{measures.it_line_coverage}}</span>
+        </div>
+        <div class="measure" data-metric="it_lines_to_cover">
+          <span class="measure-name">{{t 'metric.lines_to_cover.name'}}</span>
+          <span class="measure-value">{{measures.it_lines_to_cover}}</span>
+        </div>
+        <div class="measure" data-metric="it_uncovered_lines">
+          <span class="measure-name">{{t 'metric.uncovered_lines.name'}}</span>
+          <span class="measure-value">{{measures.it_uncovered_lines}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.it_branch_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-base-color="#d4333f"
+                data-size="40"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure" data-metric="it_branch_coverage">
+          <span class="measure-name">{{t 'metric.branch_coverage.name'}}</span>
+          <span class="measure-value">{{measures.it_branch_coverage}}</span>
+        </div>
+        <div class="measure" data-metric="it_conditions_to_cover">
+          <span class="measure-name">{{t 'metric.conditions_to_cover.name'}}</span>
+          <span class="measure-value">{{measures.it_conditions_to_cover}}</span>
+        </div>
+        <div class="measure" data-metric="it_uncovered_conditions">
+          <span class="measure-name">{{t 'metric.uncovered_conditions.name'}}</span>
+          <span class="measure-value">{{measures.it_uncovered_conditions}}</span>
+        </div>
+      </div>
+    </div>
+  {{/all}}
+
+  {{#if measures.overall_coverage}}
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.overall_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-size="70"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure measure-big" data-metric="overall_coverage">
+          <span class="measure-name">{{t 'metric.coverage.name'}}</span>
+          <span class="measure-value">{{measures.overall_coverage}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.overall_line_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-base-color="#d4333f"
+                data-size="40"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure-container">
+          <div class="measure" data-metric="overall_line_coverage">
+            <span class="measure-name">{{t 'metric.line_coverage.name'}}</span>
+            <span class="measure-value">{{measures.overall_line_coverage}}</span>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="overall_lines_to_cover">
+          <span class="measure-name">{{t 'metric.lines_to_cover.name'}}</span>
+          <span class="measure-value">{{measures.overall_lines_to_cover}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="overall_uncovered_lines">
+          <span class="measure-name">{{t 'metric.uncovered_lines.name'}}</span>
+          <span class="measure-value">{{measures.overall_uncovered_lines}}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.overall_branch_coverage_raw}}"
+                data-max="100"
+                data-color="#85bb43"
+                data-base-color="#d4333f"
+                data-size="40"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure-container">
+          <div class="measure" data-metric="overall_branch_coverage">
+            <span class="measure-name">{{t 'metric.branch_coverage.name'}}</span>
+            <span class="measure-value">{{measures.overall_branch_coverage}}</span>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="measures">
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="overall_conditions_to_cover">
+          <span class="measure-name">{{t 'metric.conditions_to_cover.name'}}</span>
+          <span class="measure-value">{{measures.overall_conditions_to_cover}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="overall_uncovered_conditions">
+          <span class="measure-name">{{t 'metric.uncovered_conditions.name'}}</span>
+          <span class="measure-value">{{measures.overall_uncovered_conditions}}</span>
+        </div>
+      </div>
+    </div>
+  {{/if}}
+  </td>
+{{/unless}}
+
+{{#if isUnitTest}}
+  <td class="source-viewer-measures-section">
+    <div class="measures">
+      <div class="measures-list">
+        <div class="measure measure-big" data-metric="tests">
+          <span class="measure-name">{{t 'metric.tests.name'}}</span>
+          <span class="measure-value">{{measures.tests}}</span>
+        </div>
+        {{#notNull measures.test_success_density}}
+          <div class="measure measure-one-line" data-metric="test_success_density">
+            <span class="measure-name">{{t 'metric.test_success_density.name'}}</span>
+            <span class="measure-value">{{measures.test_success_density}}</span>
+          </div>
+        {{/notNull}}
+        {{#notNull measures.test_failures}}
+          <div class="measure measure-one-line" data-metric="test_failures">
+            <span class="measure-name">{{t 'metric.test_failures.name'}}</span>
+            <span class="measure-value">{{measures.test_failures}}</span>
+          </div>
+        {{/notNull}}
+        {{#notNull measures.test_errors}}
+          <div class="measure measure-one-line" data-metric="test_errors">
+            <span class="measure-name">{{t 'metric.test_errors.name'}}</span>
+            <span class="measure-value">{{measures.test_errors}}</span>
+          </div>
+        {{/notNull}}
+        {{#notNull measures.skipped_tests}}
+          <div class="measure measure-one-line" data-metric="skipped_tests">
+            <span class="measure-name">{{t 'metric.skipped_tests.name'}}</span>
+            <span class="measure-value">{{measures.skipped_tests}}</span>
+          </div>
+        {{/notNull}}
+        {{#notNull measures.test_execution_time}}
+          <div class="measure measure-one-line" data-metric="test_execution_time">
+            <span class="measure-name">{{t 'metric.test_execution_time.name'}}</span>
+            <span class="measure-value">{{measures.test_execution_time}}</span>
+          </div>
+        {{/notNull}}
+      </div>
+    </div>
+
+    <div class="measures">
+      <table class="source-viewer-tests-list">
+        <tr>
+          <td class="source-viewer-test-status subtitle" colspan="3">
+            {{t 'component_viewer.measure_section.unit_tests'}}<br>
+            {{t 'component_viewer.tests.ordered_by'}}
+            <a class="js-sort-tests-by-duration {{#eq testSorting 'duration'}}active-link{{/eq}}">
+              {{t 'component_viewer.tests.duration'}}</a>
+            /
+            <a class="js-sort-tests-by-name {{#eq testSorting 'name'}}active-link{{/eq}}">
+              {{t 'component_viewer.tests.test_name'}}</a>
+            /
+            <a class="js-sort-tests-by-status {{#eq testSorting 'status'}}active-link{{/eq}}">
+              {{t 'component_viewer.tests.status'}}</a>
+          </td>
+          <td class="source-viewer-test-covered-lines subtitle">{{t 'component_viewer.covered_lines'}}</td>
+        </tr>
+        {{#each tests}}
+          <tr>
+            {{#eq status 'SKIPPED'}}
+              <td class="source-viewer-test-status subtitle">{{testStatusIcon status}}</td>
+              <td class="source-viewer-test-duration subtitle"></td>
+              <td class="source-viewer-test-name">{{name}}</td>
+              <td class="source-viewer-test-covered-lines subtitle"></td>
+            {{else}}
+              {{#ifTestData this}}
+                <td class="source-viewer-test-status subtitle">{{testStatusIcon status}}</td>
+                <td class="source-viewer-test-duration subtitle">{{durationInMs}}ms</td>
+                <td class="source-viewer-test-name"><a class="js-show-test" data-name="{{name}}">{{name}}</a></td>
+                <td class="source-viewer-test-covered-lines subtitle">{{coveredLines}}</td>
+              {{else}}
+                <td class="source-viewer-test-status subtitle">{{testStatusIcon status}}</td>
+                <td class="source-viewer-test-duration subtitle">{{durationInMs}}ms</td>
+                <td class="source-viewer-test-name">{{name}}</td>
+              {{/ifTestData}}
+            {{/eq}}
+          </tr>
+        {{/each}}
+      </table>
+    </div>
+  </td>
+
+  <td class="source-viewer-measures-section">
+    {{#if selectedTest}}
+      {{#notEq selectedTest.status 'ERROR'}}
+        {{#notEq selectedTest.status 'FAILURE'}}
+          <div class="bubble-popup-title">{{t 'component_viewer.transition.covers'}}</div>
+          {{#each coveredFiles}}
+            <div class="bubble-popup-section">
+              <a target="_blank" href="{{dashboardUrl key}}" title="{{longName}}">{{longName}}</a>
+              <span class="subtitle">{{tp 'component_viewer.x_lines_are_covered' coveredLines}}</span>
+            </div>
+          {{else}}
+            {{t 'none'}}
+          {{/each}}
+        {{/notEq}}
+      {{/notEq}}
+
+      {{#notEq selectedTest.status 'OK'}}
+        <div class="bubble-popup-title">{{t 'component_viewer.details'}}</div>
+        {{#if selectedTest.message}}
+          <pre>{{selectedTest.message}}</pre>
+        {{/if}}
+        <pre>{{selectedTest.stackTrace}}</pre>
+      {{/notEq}}
+    {{/if}}
+  </td>
+{{/if}}
+
+{{#unless isUnitTest}}
+  <td class="source-viewer-measures-section">
+    <div class="measures">
+      <div class="measures-chart">
+          <span class="js-pie-chart"
+                data-value="{{measures.duplicated_lines_density_raw}}"
+                data-max="100"
+                data-size="70"
+                data-color="#f3ca8e"></span>
+      </div>
+      <div class="measures-list">
+        <div class="measure measure-big" data-metric="duplicated_lines_density">
+          <span class="measure-name">Duplications</span>
+          <span class="measure-value">{{measures.duplicated_lines_density}}</span>
+        </div>
+      </div>
+    </div>
+    <div class="measures">
+      <div class="measures-list">
+        <div class="measure measure-one-line" data-metric="duplicated_blocks">
+          <span class="measure-name">{{t 'metric.duplicated_blocks.name'}}</span>
+          <span class="measure-value">{{measures.duplicated_blocks}}</span>
+        </div>
+        <div class="measure measure-one-line" data-metric="duplicated_lines">
+          <span class="measure-name">{{t 'metric.duplicated_lines.name'}}</span>
+          <span class="measure-value">{{measures.duplicated_lines}}</span>
+        </div>
+      </div>
+    </div>
+  </td>
+{{/unless}}
+</tr>
+</table>
+
+<div class="modal-foot">
+  <a class="overlay-popup-close" title="{{t 'close'}}">{{t 'close'}}</a>
+</div>
diff --git a/server/sonar-web/src/main/hbs/source-viewer/source-viewer-more-actions.hbs b/server/sonar-web/src/main/hbs/source-viewer/source-viewer-more-actions.hbs
new file mode 100644 (file)
index 0000000..0cd21d7
--- /dev/null
@@ -0,0 +1,8 @@
+<a class="js-measures">{{t 'component_viewer.show_measures'}}</a>
+
+<br>
+<br>
+
+<a class="js-new-window">{{t 'component_viewer.new_window'}}</a>
+<br>
+<a class="js-raw-source">{{t 'component_viewer.show_raw_source'}}</a>
index 51c77b080d702393752085cae0e835dee09a7899..fff1780d65f3a2fd3b2ca450824c7a9f2cab2883 100644 (file)
@@ -1,10 +1,12 @@
+<div class="source-viewer-header"></div>
+
 {{#if hasSourceBefore}}
   <i class="spinner js-component-viewer-source-before"></i>
 {{/if}}
 
 <table class="source-table">
   {{#each source}}
-    <tr class="source-line {{#eq line 0}}{{#empty issues}}hidden{{/empty}}{{/eq}}">
+    <tr class="source-line {{#eq line 0}}{{#empty issues}}hidden{{/empty}}{{/eq}}" {{#if line}}data-line-number="{{line}}"{{/if}}>
       <td class="source-meta source-line-number" {{#if line}}data-line-number="{{line}}"{{/if}}></td>
 
       <td class="source-meta source-line-scm" {{#if line}}data-line-number="{{line}}"{{/if}}>
diff --git a/server/sonar-web/src/main/js/drilldown/app.js b/server/sonar-web/src/main/js/drilldown/app.js
new file mode 100644 (file)
index 0000000..f77a324
--- /dev/null
@@ -0,0 +1,54 @@
+requirejs.config({
+  baseUrl: baseUrl + '/js',
+  paths: {
+    'backbone': 'third-party/backbone',
+    'backbone.marionette': 'third-party/backbone.marionette',
+    'handlebars': 'third-party/handlebars'
+  },
+  shim: {
+    'backbone.marionette': {
+      deps: ['backbone'],
+      exports: 'Marionette'
+    },
+    'backbone': {
+      exports: 'Backbone'
+    },
+    'handlebars': {
+      exports: 'Handlebars'
+    }
+  }
+});
+
+requirejs([
+  'backbone.marionette',
+  'source-viewer/viewer',
+], function (Marionette, SourceViewer) {
+
+  var $ = jQuery,
+      App = new Marionette.Application();
+
+  App.addRegions({
+    viewerRegion: '#source-viewer'
+  });
+
+  App.addInitializer(function () {
+    $('.js-drilldown-link').on('click', function (e) {
+      e.preventDefault();
+      var key = $(e.currentTarget).data('key'),
+          uuid = $(e.currentTarget).data('uuid'),
+          viewer = new SourceViewer();
+      App.viewerRegion.show(viewer);
+      viewer.open(uuid, key);
+      if (typeof window.drilldown.period === 'number') {
+        viewer.on('loaded', function () {
+          viewer.filterLinesByPeriod(window.drilldown.period);
+        });
+      }
+    });
+  });
+
+  var l10nXHR = window.requestMessages();
+  l10nXHR.done(function () {
+    App.start();
+  });
+});
diff --git a/server/sonar-web/src/main/js/graphics/pie-chart.js b/server/sonar-web/src/main/js/graphics/pie-chart.js
new file mode 100644 (file)
index 0000000..241ed87
--- /dev/null
@@ -0,0 +1,52 @@
+(function ($) {
+
+  function trans (left, top) {
+    return 'translate(' + left + ', ' + top + ')';
+  }
+
+  var defaults = {
+    size: 40,
+    thickness: 8,
+    color: '#1f77b4',
+    baseColor: '#e6e6e6'
+  };
+
+  $.fn.pieChart = function () {
+    $(this).each(function () {
+      var data = [
+            $(this).data('value'),
+            $(this).data('max') - $(this).data('value')
+          ],
+          options = _.defaults($(this).data(), defaults),
+          radius = options.size / 2;
+
+      var container = d3.select(this),
+          svg = container.append('svg')
+              .attr('width', options.size)
+              .attr('height', options.size),
+          plot = svg.append('g')
+              .attr('transform', trans(radius, radius)),
+          arc = d3.svg.arc()
+              .innerRadius(radius - options.thickness)
+              .outerRadius(radius),
+          pie = d3.layout.pie()
+              .sort(null)
+              .value(function (d) {
+                return d;
+              }),
+          colors = function (i) {
+            return i === 0 ? options.color : options.baseColor;
+          },
+          sectors = plot.selectAll('path')
+              .data(pie(data));
+
+      sectors.enter()
+          .append('path')
+          .style('fill', function (d, i) {
+            return colors(i);
+          })
+          .attr('d', arc);
+    });
+  };
+
+})(window.jQuery);
diff --git a/server/sonar-web/src/main/js/source-viewer/app.js b/server/sonar-web/src/main/js/source-viewer/app.js
new file mode 100644 (file)
index 0000000..44cd085
--- /dev/null
@@ -0,0 +1,53 @@
+requirejs.config({
+  baseUrl: baseUrl + '/js',
+  paths: {
+    'backbone': 'third-party/backbone',
+    'backbone.marionette': 'third-party/backbone.marionette',
+    'handlebars': 'third-party/handlebars'
+  },
+  shim: {
+    'backbone.marionette': {
+      deps: ['backbone'],
+      exports: 'Marionette'
+    },
+    'backbone': {
+      exports: 'Backbone'
+    },
+    'handlebars': {
+      exports: 'Handlebars'
+    }
+  }
+});
+
+requirejs([
+  'backbone.marionette',
+  'source-viewer/viewer'
+
+], function (Marionette, SourceViewer) {
+
+  var App = new Marionette.Application();
+
+  App.addRegions({
+    viewerRegion: '#source-viewer'
+  });
+
+  App.addInitializer(function () {
+    var viewer = new SourceViewer();
+    App.viewerRegion.show(viewer);
+    viewer.open(window.file.uuid, window.file.key);
+    if (typeof window.file.line === 'number') {
+      viewer.on('loaded', function () {
+        viewer
+            .highlightLine(window.file.line)
+            .scrollToLine(window.file.line);
+      });
+    }
+  });
+
+  var l10nXHR = window.requestMessages();
+
+  l10nXHR.done(function () {
+    App.start();
+  });
+
+});
diff --git a/server/sonar-web/src/main/js/source-viewer/header.js b/server/sonar-web/src/main/js/source-viewer/header.js
new file mode 100644 (file)
index 0000000..8c6a29d
--- /dev/null
@@ -0,0 +1,73 @@
+define([
+  'backbone.marionette',
+  'templates/source-viewer',
+  'source-viewer/more-actions',
+  'source-viewer/measures-overlay'
+], function (Marionette, Templates, MoreActionsView, MeasuresOverlay) {
+
+  var $ = jQuery,
+      API_FAVORITE = baseUrl + '/api/favourites';
+
+  return Marionette.ItemView.extend({
+    template: Templates['source-viewer-header'],
+
+    events: function () {
+      return {
+        'click .js-favorite': 'toggleFavorite',
+        'click .js-actions': 'showMoreActions',
+        'click .js-permalink': 'getPermalink'
+      };
+    },
+
+    toggleFavorite: function () {
+      var that = this;
+      if (this.model.get('fav')) {
+        $.ajax({
+          url: API_FAVORITE + '/' + this.model.get('key'),
+          type: 'DELETE'
+        }).done(function () {
+          that.model.set('fav', false);
+          that.render();
+        });
+      }
+      else {
+        $.ajax({
+          url: API_FAVORITE,
+          type: 'POST',
+          data: {
+            key: this.model.get('key')
+          }
+        }).done(function () {
+          that.model.set('fav', true);
+          that.render();
+        });
+      }
+    },
+
+    showMoreActions: function (e) {
+      e.stopPropagation();
+      $('body').click()
+      var view = new MoreActionsView({ parent: this });
+      view.render().$el.appendTo(this.$el);
+    },
+
+    getPermalink: function () {
+      //TODO Line permalink
+      var query = 'id=' + encodeURIComponent(this.model.get('key')),
+          windowParams = 'resizable=1,scrollbars=1,status=1';
+      window.open(baseUrl + '/component/index?' + query, this.model.get('name'), windowParams);
+    },
+
+    showRawSources: function () {
+      var url = baseUrl + '/api/sources/raw?key=' + encodeURIComponent(this.model.get('key')),
+          windowParams = 'resizable=1,scrollbars=1,status=1';
+      window.open(url, this.model.get('name'), windowParams);
+    },
+
+    showMeasures: function () {
+      var overlay = new MeasuresOverlay({ model: this.model });
+      overlay.show();
+    }
+  });
+
+});
diff --git a/server/sonar-web/src/main/js/source-viewer/measures-overlay.js b/server/sonar-web/src/main/js/source-viewer/measures-overlay.js
new file mode 100644 (file)
index 0000000..c29c832
--- /dev/null
@@ -0,0 +1,190 @@
+define([
+  'common/overlay',
+  'templates/source-viewer'
+], function (Overlay, Templates) {
+
+  var $ = jQuery,
+      SOURCE_METRIC_LIST = [
+        'accessors',
+        'classes',
+        'functions',
+        'statements',
+        'ncloc',
+        'lines',
+        'generated_ncloc',
+        'generated_lines',
+        'complexity',
+        'function_complexity',
+        'comment_lines',
+        'comment_lines_density',
+        'public_api',
+        'public_undocumented_api',
+        'public_documented_api_density'
+      ],
+      COVERAGE_METRIC_LIST = [
+        'coverage',
+        'line_coverage',
+        'lines_to_cover',
+        'uncovered_lines',
+        'branch_coverage',
+        'conditions_to_cover',
+        'uncovered_conditions',
+        'it_coverage',
+        'it_line_coverage',
+        'it_lines_to_cover',
+        'it_uncovered_lines',
+        'it_branch_coverage',
+        'it_conditions_to_cover',
+        'it_uncovered_conditions',
+        'overall_coverage',
+        'overall_line_coverage',
+        'overall_lines_to_cover',
+        'overall_uncovered_lines',
+        'overall_branch_coverage',
+        'overall_conditions_to_cover',
+        'overall_uncovered_conditions'
+      ],
+      ISSUES_METRIC_LIST = [
+        'violations',
+        'sqale_index',
+        'sqale_debt_ratio',
+        'sqale_rating',
+        'blocker_violations',
+        'critical_violations',
+        'major_violations',
+        'minor_violations',
+        'info_violations'
+      ],
+      DUPLICATIONS_METRIC_LIST = [
+        'duplicated_lines_density',
+        'duplicated_blocks',
+        'duplicated_lines'
+      ],
+
+      TESTS_METRIC_LIST = [
+        'tests',
+        'test_success_density',
+        'test_failures',
+        'test_errors',
+        'skipped_tests',
+        'test_execution_time'
+      ];
+
+
+  return Overlay.extend({
+    template: Templates['source-viewer-measures'],
+
+    events: function () {
+      return _.extend(Overlay.prototype.events.apply(this, arguments), {
+        'click .js-sort-tests-by-duration': 'sortTestsByDuration',
+        'click .js-sort-tests-by-name': 'sortTestsByName',
+        'click .js-sort-tests-by-status': 'sortTestsByStatus',
+        'click .js-show-test': 'showTest'
+      });
+    },
+
+    onRender: function () {
+      Overlay.prototype.onRender.apply(this, arguments);
+      this.$('.js-pie-chart').pieChart();
+    },
+
+    show: function () {
+      var that = this,
+          requests = [this.requestMeasures()];
+      if (this.model.get('isUnitTest')) {
+        requests.push(this.requestTests());
+      }
+      $.when.apply($, requests).done(function () {
+        that.render();
+      });
+    },
+
+    requestMeasures: function () {
+      var that = this,
+          p = window.process.addBackgroundProcess(),
+          url = baseUrl + '/api/resources',
+          options = {
+            resource: this.model.key(),
+            metrics: [].concat(
+                SOURCE_METRIC_LIST,
+                COVERAGE_METRIC_LIST,
+                ISSUES_METRIC_LIST,
+                DUPLICATIONS_METRIC_LIST,
+                TESTS_METRIC_LIST
+            ).join()
+          };
+      return $.get(url, options).done(function (data) {
+        var measuresList = data[0].msr || [],
+            measures = that.model.get('measures') || {};
+        measuresList.forEach(function (m) {
+          measures[m.key] = m.frmt_val || m.data;
+          measures[m.key + '_raw'] = m.val;
+        });
+        that.model.set({ measures: measures });
+        window.process.finishBackgroundProcess(p);
+      }).fail(function () {
+        window.process.failBackgroundProcess(p);
+      });
+    },
+
+    requestTests: function () {
+      var that = this,
+          url = baseUrl + '/api/tests/show',
+          options = { key: this.model.key() };
+      return $.get(url, options).done(function (data) {
+        that.model.set({ tests: data.tests });
+        that.sortTests('name');
+        that.testSorting = 'name';
+      });
+    },
+
+    sortTests: function (condition) {
+      var tests = this.model.get('tests');
+      if (_.isArray(tests)) {
+        this.model.set({ tests: _.sortBy(tests, condition) });
+      }
+    },
+
+    sortTestsByDuration: function () {
+      this.sortTests('durationInMs');
+      this.testSorting = 'duration';
+      this.render();
+    },
+
+    sortTestsByName: function () {
+      this.sortTests('name');
+      this.testSorting = 'name';
+      this.render();
+    },
+
+    sortTestsByStatus: function () {
+      this.sortTests('status');
+      this.testSorting = 'status';
+      this.render();
+    },
+
+    showTest: function (e) {
+      var that = this,
+          name = $(e.currentTarget).data('name'),
+          url = baseUrl + '/api/tests/covered_files',
+          options = {
+            key: this.model.key(),
+            test: name
+          };
+      return $.get(url, options).done(function (data) {
+        that.coveredFiles = data.files;
+        that.selectedTest = _.findWhere(that.model.get('tests'), { name: name });
+        that.render();
+      });
+    },
+
+    serializeData: function () {
+      return _.extend(Overlay.prototype.serializeData.apply(this, arguments), {
+        testSorting: this.testSorting,
+        selectedTest: this.selectedTest,
+        coveredFiles: this.coveredFiles || []
+      });
+    }
+  });
+
+});
diff --git a/server/sonar-web/src/main/js/source-viewer/more-actions.js b/server/sonar-web/src/main/js/source-viewer/more-actions.js
new file mode 100644 (file)
index 0000000..b21bfb4
--- /dev/null
@@ -0,0 +1,39 @@
+define([
+  'backbone.marionette',
+  'templates/source-viewer'
+], function (Marionette, Templates) {
+
+  var $ = jQuery;
+
+  return Marionette.ItemView.extend({
+    className: 'source-viewer-header-more-actions',
+    template: Templates['source-viewer-more-actions'],
+
+    events: {
+      'click .js-measures': 'showMeasures',
+      'click .js-new-window': 'openNewWindow',
+      'click .js-raw-source': 'showRawSource'
+    },
+
+    onRender: function () {
+      var that = this;
+      $('body').on('click.component-viewer-more-actions', function () {
+        $('body').off('click.component-viewer-more-actions');
+        that.close();
+      });
+    },
+
+    showMeasures: function () {
+      this.options.parent.showMeasures();
+    },
+
+    openNewWindow: function () {
+      this.options.parent.getPermalink();
+    },
+
+    showRawSource: function () {
+      this.options.parent.showRawSources();
+    }
+  });
+
+});
index 3931272bc7322103000cc99155fef98346b3516e..1a202329ae3093e2e565a2509b27664bf1cb87a9 100644 (file)
@@ -15,7 +15,7 @@ define([
 
     getPermalink: function (e) {
       e.preventDefault();
-      var url = baseUrl + '/component/index#component=' +
+      var url = baseUrl + '/component/index?id=' +
               (encodeURIComponent(this.model.key())) + '&line=' + this.options.line,
           windowParams = 'resizable=1,scrollbars=1,status=1';
       window.open(url, this.model.get('name'), windowParams);
index 7891f1135451974d82b0c650f398fad21d3ef4c0..78cee50f8a31e3f6c9bcf3033e3b6a9955722f4b 100644 (file)
@@ -6,10 +6,12 @@ define([
       'issue/models/issue',
       'issue/collections/issues',
       'issue/issue-view',
+      'source-viewer/header',
       'source-viewer/popups/scm-popup',
       'source-viewer/popups/coverage-popup',
       'source-viewer/popups/duplication-popup',
-      'source-viewer/popups/line-actions-popup'
+      'source-viewer/popups/line-actions-popup',
+      'common/handlebars-extensions'
     ],
     function (Backbone,
               Marionette,
@@ -18,6 +20,7 @@ define([
               Issue,
               Issues,
               IssueView,
+              HeaderView,
               SCMPopupView,
               CoveragePopupView,
               DuplicationPopupView,
@@ -26,14 +29,18 @@ define([
       var $ = jQuery,
           HIGHLIGHTED_ROW_CLASS = 'source-line-highlighted';
 
-      return Marionette.ItemView.extend({
-        className: 'source',
+      return Marionette.Layout.extend({
+        className: 'source-viewer',
         template: Templates['source-viewer'],
 
         ISSUES_LIMIT: 100,
         LINES_LIMIT: 1000,
         LINES_AROUND: 500,
 
+        regions: {
+          headerRegion: '.source-viewer-header'
+        },
+
         ui: {
           sourceBeforeSpinner: '.js-component-viewer-source-before',
           sourceAfterSpinner: '.js-component-viewer-source-after'
@@ -41,13 +48,14 @@ define([
 
         events: function () {
           return {
+            'click .sym': 'highlightUsages',
             'click .source-line-scm': 'showSCMPopup',
             'click .source-line-covered': 'showCoveragePopup',
             'click .source-line-partially-covered': 'showCoveragePopup',
             'click .source-line-uncovered': 'showCoveragePopup',
             'click .source-line-duplications': 'showDuplications',
             'click .source-line-duplications-extra': 'showDuplicationPopup',
-            'click .source-line-number[data-line-number]': 'highlightLine'
+            'click .source-line-number[data-line-number]': 'onLineNumberClick'
           };
         },
 
@@ -60,10 +68,19 @@ define([
           this.loadSourceBeforeThrottled = _.throttle(this.loadSourceBefore, 1000);
           this.loadSourceAfterThrottled = _.throttle(this.loadSourceAfter, 1000);
           this.scrollTimer = null;
+          this.listenTo(this, 'loaded', this.onLoaded);
+        },
+
+        renderHeader: function () {
+          this.headerRegion.show(new HeaderView({ model: this.model }));
         },
 
         onRender: function () {
+          this.renderHeader();
           this.renderIssues();
+          if (this.model.has('filterLinesFunc')) {
+            this.filterLines(this.model.get('filterLinesFunc'));
+          }
         },
 
         onClose: function () {
@@ -73,6 +90,10 @@ define([
           this.issueViews = [];
         },
 
+        onLoaded: function () {
+          this.bindScrollEvents();
+        },
+
         open: function (id, key) {
           var that = this,
               finalize = function () {
@@ -105,6 +126,7 @@ define([
               options = { key: this.model.key() };
           return $.get(url, options).done(function (data) {
             that.model.set(data);
+            that.model.set({ isUnitTest: data.q === 'UTS' });
           });
         },
 
@@ -228,29 +250,26 @@ define([
         },
 
         renderIssues: function () {
-          this.issues.forEach(this.renderIssue, this);
+          this.$('.issue-list').addClass('hidden');
         },
 
         renderIssue: function (issue) {
-          var issueView = new IssueView({
-            el: '#issue-' + issue.get('key'),
-            model: issue
-          });
-          this.issueViews.push(issueView);
-          issueView.render();
+          // do nothing
         },
 
         addIssue: function (issue) {
           var line = issue.get('line') || 0,
-              code = this.$('.source-line-code[data-line-number=' + line + ']'),
-              issueList = code.find('.issue-list');
-          if (issueList.length === 0) {
-            issueList = $('<div class="issue-list"></div>');
-            code.append(issueList);
-            code.addClass('has-issues');
+              code = this.$('.source-line-code[data-line-number=' + line + ']');
+          code.addClass('has-issues');
+        },
+
+        highlightUsages: function (e) {
+          var highlighted = $(e.currentTarget).is('.highlighted'),
+              key = e.currentTarget.className.split(/\s+/)[0];
+          this.$('.sym.highlighted').removeClass('highlighted');
+          if (!highlighted) {
+            this.$('.sym.' + key).addClass('highlighted');
           }
-          issueList.append('<div class="issue" id="issue-' + issue.id + '"></div>');
-          this.renderIssue(issue);
         },
 
         showSCMPopup: function (e) {
@@ -331,16 +350,29 @@ define([
           popup.render();
         },
 
-        highlightLine: function (e) {
+        onLineNumberClick: function (e) {
           var row = $(e.currentTarget).closest('.source-line'),
+              line = row.data('line-number'),
               highlighted = row.is('.' + HIGHLIGHTED_ROW_CLASS);
-          this.$('.' + HIGHLIGHTED_ROW_CLASS).removeClass(HIGHLIGHTED_ROW_CLASS);
           if (!highlighted) {
-            row.addClass(HIGHLIGHTED_ROW_CLASS);
+            this.highlightLine(line);
             this.showLineActionsPopup(e);
+          } else {
+            this.removeHighlighting();
           }
         },
 
+        removeHighlighting: function () {
+          this.$('.' + HIGHLIGHTED_ROW_CLASS).removeClass(HIGHLIGHTED_ROW_CLASS);
+        },
+
+        highlightLine: function (line) {
+          var row = this.$('.source-line[data-line-number=' + line + ']');
+          this.removeHighlighting();
+          row.addClass(HIGHLIGHTED_ROW_CLASS);
+          return this;
+        },
+
         bindScrollEvents: function () {
           var that = this;
           this.$el.scrollParent().on('scroll.source-viewer', function () {
@@ -376,6 +408,21 @@ define([
           }
         },
 
+        scrollToLine: function (line) {
+          var row = this.$('.source-line[data-line-number=' + line + ']');
+          if (row.length > 0) {
+            var p = this.$el.scrollParent();
+            if (p.is(document)) {
+              p = $(window);
+            }
+            var pTopOffset = p.offset() != null ? p.offset().top : 0,
+                pHeight = p.height(),
+                goal = row.offset().top - pHeight / 3 - pTopOffset;
+            p.scrollTop(goal);
+          }
+          return this;
+        },
+
         loadSourceBefore: function () {
           this.unbindScrollEvents();
           var that = this,
@@ -442,6 +489,30 @@ define([
               that.bindScrollEvents();
             }
           });
+        },
+
+        filterLines: function (func) {
+          var lines = this.model.get('source'),
+              $lines = this.$('.source-line');
+          this.model.set('filterLinesFunc', func);
+          lines.forEach(function (line, idx) {
+            var $line = $($lines[idx]);
+            $line.toggleClass('source-line-shadowed', !func(line));
+          });
+        },
+
+        filterLinesByPeriod: function (periodId) {
+          var periods = this.model.get('periods'),
+              period = _.find(periods, function (candidate) {
+                return candidate[0] === periodId;
+              });
+          if (period) {
+            var sinceDate = moment(period[2]).toDate();
+            this.filterLines(function (line) {
+              var scmDate = moment(line.scmDate).toDate();
+              return scmDate >= sinceDate;
+            });
+          }
         }
       });
 
index 0b23b65f8425bb0bf8cd374c61b47cfe44694eba..2f992c14f885b72f5999985834df15d7e21b0c09 100644 (file)
@@ -12,19 +12,15 @@ var BASE_URL = 'http://localhost:' + getPort() + '/pages/',
 exports.initMessages = function () {
   // Dump log messages
   casper.removeAllListeners('remote.message');
-  if (casper.cli.get('verbose')) {
-    casper.on('remote.message', function(message) {
-      this.echo('Log: '+ message, 'LOG');
-    });
-  }
+  casper.on('remote.message', function(message) {
+    this.echo('Log: '+ message, 'LOG');
+  });
 
   // Dump uncaught errors
   casper.removeAllListeners('page.error');
-  if (casper.verbose) {
-    casper.on('page.error', function(msg) {
-      this.echo('Error: ' + msg, 'ERROR');
-    });
-  }
+  casper.on('page.error', function(msg) {
+    this.echo('Error: ' + msg, 'ERROR');
+  });
 };
 
 
@@ -61,7 +57,6 @@ exports.mockRequest = mockRequest;
 
 
 exports.mockRequestFromFile = function (url, fileName, options) {
-  console.log('mock request "' + url + '" from file "' + fs.workingDirectory + fs.separator + fileName + '"');
   var response = fs.read(fileName);
   return mockRequest(url, response, options);
 };
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-coverage-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-coverage-spec.js
deleted file mode 100644 (file)
index bac92d8..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('Coverage Filters'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-coverage');
-        casper.waitForSelector('.js-filter-lines-to-cover');
-      })
-
-      .then(function () {
-        casper.click('.js-filter-lines-to-cover');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 142);
-          test.assertElementCount('.source-line-uncovered', 50);
-          test.assertElementCount('.source-line-partially-covered', 2);
-          test.assertElementCount('.component-viewer-source .source-line', 369);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-uncovered-lines');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 18);
-          test.assertElementCount('.source-line-uncovered', 50);
-          test.assertElementCount('.source-line-partially-covered', 0);
-          test.assertElementCount('.component-viewer-source .source-line', 136);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-branches-to-cover');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 19);
-          test.assertElementCount('.source-line-uncovered', 3);
-          test.assertElementCount('.source-line-partially-covered', 2);
-          test.assertElementCount('.component-viewer-source .source-line', 33);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-uncovered-branches');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 4);
-          test.assertElementCount('.source-line-uncovered', 3);
-          test.assertElementCount('.source-line-partially-covered', 2);
-          test.assertElementCount('.component-viewer-source .source-line', 13);
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Go From Coverage to Test File'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-        lib.mockRequestFromFile('/api/tests/test_cases', 'test-cases.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-toggle-coverage');
-        casper.waitForSelector('.source-line-covered', function () {
-          casper.click('.source-line-covered');
-          casper.waitForSelector('.bubble-popup', function () {
-            test.assertSelectorContains('.bubble-popup', 'src/test/java/org/sonar/batch/issue/IssueCacheTest.java');
-            test.assertSelectorContains('.bubble-popup', 'should_update_existing_issue');
-            test.assertSelectorContains('.bubble-popup li[title="should_update_existing_issue"]', '293');
-
-            lib.clearRequestMocks();
-            lib.mockRequestFromFile('/api/components/app', 'tests/app.json');
-            lib.mockRequestFromFile('/api/sources/show', 'tests/source.json');
-            lib.mockRequestFromFile('/api/resources', 'tests/resources.json');
-            lib.mockRequest('/api/coverage/show', '{}');
-            lib.mockRequestFromFile('/api/tests/show', 'tests/tests.json');
-            casper.click('.component-viewer-popup-test-file[data-key]');
-
-            casper.waitForSelector('.js-unit-test', function () {
-              test.assertElementCount('.js-unit-test', 2);
-            });
-          });
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-duplications-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-duplications-spec.js
deleted file mode 100644 (file)
index fbce585..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer', 'Duplications');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('Filters'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/duplications/show', 'duplications.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-duplications');
-        casper.waitForSelector('.source-line-duplicated', function () {
-          test.assertExists('.js-filter-duplications.active');
-          test.assertElementCount('.component-viewer-source .source-line', 39);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-duplications');
-        test.assertElementCount('.component-viewer-source .source-line', 520);
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-
-
-casper.test.begin(testName('Cross-Project'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/duplications/show', 'cross-project-duplications.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-duplications');
-        casper.waitForSelector('.js-filter-duplications', function () {
-          casper.click('.js-filter-duplications');
-          casper.waitForSelector('.source-line-duplicated', function () {
-            casper.click('.source-line-duplicated');
-            casper.waitForSelector('.bubble-popup', function () {
-              test.assertSelectorContains('.bubble-popup', 'JavaScript');
-              test.assertSelectorContains('.bubble-popup', 'JavaScript :: Sonar Plugin');
-              test.assertExists('a[data-key="org.codehaus.sonar-plugins.javascript:sonar-javascript-plugin:src/main/java/org/sonar/plugins/javascript/core/JavaScript.java"]');
-              test.assertSelectorContains('.bubble-popup', 'src/main/java/org/sonar/plugins/javascript/core/JavaScript.java');
-              test.assertSelectorContains('.bubble-popup', '455'); // Line from
-              test.assertSelectorContains('.bubble-popup', '470'); // Line to
-            });
-          });
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('In Deleted Files'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/duplications/show', 'duplications-in-deleted-files.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-toggle-duplications');
-        casper.waitForSelector('.source-line-duplicated', function () {
-          test.assertExists('.js-duplications-in-deleted-files');
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-favorite-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-favorite-spec.js
deleted file mode 100644 (file)
index b3cce4f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('Mark as Favorite'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequest('/api/favourites', '{}', { type: 'POST' });
-        lib.mockRequest('/api/favourites/*', '{}', { type: 'DELETE' });
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        test.assertExists('.js-favorite');
-        test.assertExists('.icon-not-favorite');
-        casper.click('.js-favorite');
-        casper.waitForSelector('.icon-favorite', function () {
-          test.assertExists('.icon-favorite');
-          casper.click('.js-favorite');
-          casper.waitForSelector('.icon-not-favorite', function () {
-            test.assertExists('.icon-not-favorite');
-          });
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Don\'t Show Favorite If Not Logged In'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app-not-logged-in.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        test.assertDoesntExist('.js-favorite');
-        test.assertDoesntExist('.icon-favorite');
-        test.assertDoesntExist('.icon-not-favorite');
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-issues-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-issues-spec.js
deleted file mode 100644 (file)
index 3ea8cb5..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer', 'Issues');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('Filters'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-issues');
-        casper.waitForSelector('.js-filter-unresolved-issues');
-      })
-
-      .then(function () {
-        casper.click('.js-filter-unresolved-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 6);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-open-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 1);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-fixed-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 11);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-false-positive-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 1);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-MAJOR-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 1);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-MINOR-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 1);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-INFO-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 4);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-rule[data-rule="common-java:DuplicatedBlocks"]');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 1);
-          test.assertSelectorContains('.issue', '2 duplicated blocks of code.');
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-rule[data-rule="squid:S1192"]');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 1);
-          test.assertSelectorContains('.issue', 'Define a constant instead of duplicating this literal');
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-rule[data-rule="squid:S1135"]');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 4);
-          test.assertSelectorContains('.issue', 'Complete the task associated to this TODO comment');
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('On File Level'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-issues');
-        casper.waitForSelector('.js-filter-unresolved-issues');
-      })
-
-      .then(function () {
-        casper.click('.js-filter-unresolved-issues');
-        casper.waitForSelector('.issue');
-      })
-
-      .then(function () {
-        test.assertVisible('.component-viewer-source .source-line[data-line-number="0"]');
-        test.assertExists('#issue-20002ec7-b647-44da-bdf5-4d9fbf4b7c58');
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Bulk Change Link Exists'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-issues');
-        casper.waitForSelector('.js-filter-unresolved-issues');
-      })
-
-      .then(function () {
-        test.assertExists('.js-issues-bulk-change');
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-lines-filters-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-lines-filters-spec.js
deleted file mode 100644 (file)
index 92b0e48..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('Lines Filters'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-basic');
-        casper.waitForSelector('.js-filter-ncloc');
-      })
-
-      .then(function () {
-        casper.click('.js-filter-ncloc');
-        test.assertElementCount('.component-viewer-source .source-line', 451);
-      })
-
-      .then(function () {
-        casper.click('.js-filter-ncloc');
-        test.assertElementCount('.component-viewer-source .source-line', 520);
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Do Not Show Ncloc Filter If No Data'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources-without-ncloc-data.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-basic');
-        casper.waitForSelector('[data-metric="ncloc"]');
-      })
-
-      .then(function () {
-        test.assertDoesntExist('.js-filter-ncloc');
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-link-to-raw-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-link-to-raw-spec.js
deleted file mode 100644 (file)
index 019cdca..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('Link to Raw'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.js-actions', function () {
-          casper.click('.js-actions');
-          casper.waitForSelector('.js-raw-source', function () {
-            casper.click('.js-raw-source');
-          });
-        });
-      })
-
-      .then(function () {
-        test.assertUrlMatch('org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java');
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-select-tab-by-metric-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-select-tab-by-metric-spec.js
deleted file mode 100644 (file)
index f47a365..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer', 'Select Tab by Metric');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('sqale_index'), function (test) {
-  casper
-      .start(lib.buildUrl('file-dashboard'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-        casper.evaluate(function () {
-          window.fileKey = 'some-key';
-          window.metric = 'sqale_index';
-        });
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.issue', function () {
-          test.assertExists('.js-toggle-issues.active');
-          test.assertExists('.component-viewer-header-expanded-bar.active');
-          test.assertExists('.js-filter-unresolved-issues.active');
-          test.assertElementCount('.component-viewer-source .source-line', 56);
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('minor_violations'), function (test) {
-  casper
-      .start(lib.buildUrl('file-dashboard'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-        casper.evaluate(function () {
-          window.fileKey = 'some-key';
-          window.metric = 'minor_violations';
-        });
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.issue', function () {
-          test.assertExists('.js-toggle-issues.active');
-          test.assertExists('.component-viewer-header-expanded-bar.active');
-          test.assertExists('.js-filter-MINOR-issues.active');
-          test.assertElementCount('.component-viewer-source .source-line', 11);
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('line_coverage'), function (test) {
-  casper
-      .start(lib.buildUrl('file-dashboard'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-        casper.evaluate(function () {
-          window.fileKey = 'some-key';
-          window.metric = 'line_coverage';
-        });
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertExists('.js-toggle-coverage.active');
-          test.assertExists('.component-viewer-header-expanded-bar.active');
-          test.assertExists('.js-filter-lines-to-cover.active');
-          test.assertElementCount('.component-viewer-source .source-line', 369);
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('duplicated_lines'), function (test) {
-  casper
-      .start(lib.buildUrl('file-dashboard'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/duplications/show', 'duplications.json');
-        casper.evaluate(function () {
-          window.fileKey = 'some-key';
-          window.metric = 'duplicated_lines';
-        });
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.source-line-duplicated', function () {
-          test.assertExists('.js-toggle-duplications.active');
-          test.assertExists('.component-viewer-header-expanded-bar.active');
-          test.assertExists('.js-filter-duplications.active');
-          test.assertElementCount('.component-viewer-source .source-line', 39);
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec.js
deleted file mode 100644 (file)
index 8aee5a1..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-var lib = require('../lib'),
-    testName = lib.testName('Component Viewer');
-
-lib.initMessages();
-lib.changeWorkingDirectory('component-viewer-spec');
-
-
-casper.test.begin(testName('Base'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line', function () {
-          // Check header elements
-          test.assertExists('.component-viewer-header');
-          test.assertSelectorContains('.component-viewer-header-component-project', 'SonarQube');
-          test.assertSelectorContains('.component-viewer-header-component-project', 'SonarQube :: Batch');
-          test.assertSelectorContains('.component-viewer-header-component-name',
-              'src/main/java/org/sonar/batch/index/Cache.java');
-          test.assertExists('.component-viewer-header-favorite');
-          test.assertExists('.component-viewer-header-actions');
-
-          // Check main measures
-          test.assertSelectorContains('.js-header-tab-basic', '379');
-          test.assertSelectorContains('.js-header-tab-issues', 'A');
-          test.assertSelectorContains('.js-header-tab-issues', '3h 30min');
-          test.assertSelectorContains('.js-header-tab-issues', '6');
-          test.assertSelectorContains('.js-header-tab-coverage', '74.3%');
-          test.assertExists('.js-header-tab-scm');
-
-          // Check source
-          test.assertElementCount('.component-viewer-source .source-line', 520);
-          test.assertSelectorContains('.component-viewer-source', 'public class Cache');
-
-          // Check workspace
-          test.assertExists('.component-viewer-workspace');
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Decoration'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-        lib.mockRequestFromFile('/api/duplications/show', 'duplications.json');
-        lib.mockRequestFromFile('/api/sources/scm', 'scm.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        // Check issues decoration
-        casper.click('.js-toggle-issues');
-        casper.waitForSelector('.issue', function () {
-          test.assertElementCount('.issue', 6);
-          test.assertSelectorContains('.issue', '2 duplicated blocks of code.');
-
-          casper.click('.js-toggle-issues');
-          casper.waitWhileSelector('.issue', function () {
-            test.assertDoesntExist('.issue');
-          });
-        });
-      })
-
-      .then(function () {
-        // Check coverage decoration
-        casper.click('.js-toggle-coverage');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 142);
-          test.assertElementCount('.source-line-uncovered', 50);
-          test.assertElementCount('.source-line-partially-covered', 2);
-
-          casper.click('.js-toggle-coverage');
-          casper.waitWhileSelector('.source-line-covered', function () {
-            test.assertDoesntExist('.source-line-covered');
-          });
-        });
-      })
-
-      .then(function () {
-        // Check duplications decoration
-        casper.click('.js-toggle-duplications');
-        casper.waitForSelector('.source-line-duplicated', function () {
-          test.assertElementCount('.source-line-duplicated', 32);
-
-          casper.click('.js-toggle-duplications');
-          casper.waitWhileSelector('.source-line-duplicated', function () {
-            test.assertDoesntExist('.source-line-duplicated');
-          });
-        });
-      })
-
-      .then(function () {
-        // Check scm decoration
-        casper.click('.js-toggle-scm');
-        casper.waitForSelector('.source-line-scm-inner', function () {
-          test.assertElementCount('.source-line-scm-inner', 182);
-          test.assertExists('.source-line-scm-inner[data-author="simon.brandhof@gmail.com"]');
-          test.assertExists('.source-line-scm-inner[data-author="julien.henry@sonarsource.com"]');
-
-          casper.click('.js-toggle-scm');
-          casper.waitWhileSelector('.source-line-scm-inner', function () {
-            test.assertDoesntExist('.source-line-scm-inner');
-          });
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Header'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-        lib.mockRequestFromFile('/api/duplications/show', 'duplications.json');
-        lib.mockRequestFromFile('/api/sources/scm', 'scm.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        // Check issues header and filters
-        casper.click('.js-header-tab-issues');
-        casper.waitForSelector('.js-filter-unresolved-issues', function () {
-          test.assertExists('.js-filter-open-issues');
-          test.assertExists('.js-filter-fixed-issues');
-          test.assertExists('.js-filter-false-positive-issues');
-          test.assertSelectorContains('.js-filter-MAJOR-issues', '1');
-          test.assertSelectorContains('.js-filter-MINOR-issues', '1');
-          test.assertSelectorContains('.js-filter-INFO-issues', '4');
-          test.assertSelectorContains('.js-filter-rule[data-rule="common-java:DuplicatedBlocks"]', '1');
-          test.assertSelectorContains('.js-filter-rule[data-rule="squid:S1192"]', '1');
-          test.assertSelectorContains('.js-filter-rule[data-rule="squid:S1135"]', '4');
-          test.assertExists('.js-issues-time-changes');
-
-          casper.click('.js-header-tab-issues');
-          casper.waitWhileSelector('.js-filter-unresolved-issues', function () {
-            test.assertDoesntExist('.js-filter-open-issues');
-            test.assertDoesntExist('.js-filter-MAJOR-issues');
-            test.assertDoesntExist('.js-filter-rule');
-          });
-        });
-      })
-
-      .then(function () {
-        // Check coverage header and filters
-        casper.click('.js-header-tab-coverage');
-        casper.waitForSelector('.js-filter-lines-to-cover', function () {
-          test.assertExists('.js-filter-uncovered-lines');
-          test.assertExists('.js-filter-branches-to-cover');
-          test.assertExists('.js-filter-uncovered-branches');
-          test.assertSelectorContains('[data-metric="coverage"]', '74.3%');
-          test.assertSelectorContains('[data-metric="line_coverage"]', '74.2%');
-          test.assertSelectorContains('[data-metric="lines_to_cover"]', '194');
-          test.assertSelectorContains('[data-metric="uncovered_lines"]', '50');
-          test.assertSelectorContains('[data-metric="branch_coverage"]', '75.0%');
-          test.assertSelectorContains('[data-metric="conditions_to_cover"]', '16');
-          test.assertSelectorContains('[data-metric="uncovered_conditions"]', '4');
-          test.assertExists('.js-coverage-time-changes');
-
-          casper.click('.js-header-tab-coverage');
-          casper.waitWhileSelector('.js-filter-lines-to-cover', function () {
-            test.assertDoesntExist('.js-filter-uncovered-lines');
-            test.assertDoesntExist('[data-metric="coverage"]');
-            test.assertDoesntExist('[data-metric="branch_coverage"]');
-          });
-        });
-      })
-
-      .then(function () {
-        // Check duplications header and filters
-        casper.click('.js-header-tab-duplications');
-        casper.waitForSelector('.js-filter-duplications', function () {
-          test.assertSelectorContains('[data-metric="duplicated_blocks"]', '2');
-          test.assertSelectorContains('[data-metric="duplicated_lines"]', '30');
-
-          casper.click('.js-header-tab-duplications');
-          casper.waitWhileSelector('.js-filter-duplications', function () {
-            test.assertDoesntExist('[data-metric="duplicated_blocks"]');
-            test.assertDoesntExist('[data-metric="duplicated_lines"]');
-          });
-        });
-      })
-
-      .then(function () {
-        // Check scm header and filters
-        casper.click('.js-header-tab-scm');
-        casper.waitForSelector('.js-filter-modified-lines', function () {
-          test.assertExists('.js-scm-time-changes');
-
-          casper.click('.js-header-tab-scm');
-          casper.waitWhileSelector('.js-filter-modified-lines', function () {
-            test.assertDoesntExist('.js-scm-time-changes');
-          });
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Test File'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'tests/app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'tests/source.json');
-        lib.mockRequestFromFile('/api/resources', 'tests/resources.json');
-        lib.mockRequestFromFile('/api/tests/show', 'tests/tests.json');
-        lib.mockRequestFromFile('/api/tests/covered_files', 'tests/covered-files.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        // Check coverage header and filters
-        casper.click('.js-header-tab-tests');
-        casper.waitForSelector('.js-unit-test', function () {
-          test.assertSelectorContains('[data-metric="test_execution_time"]', '12');
-          test.assertElementCount('.js-unit-test', 2);
-          test.assertSelectorContains('.js-unit-test[data-name="should_return_i"]', 'should_return_i');
-          test.assertSelectorContains('.js-unit-test[data-name="should_return_i"]', '5');
-          test.assertSelectorContains('.js-unit-test[data-name="should_return_to_string"]', 'should_return_to_string');
-          test.assertSelectorContains('.js-unit-test[data-name="should_return_to_string"]', '4');
-
-          casper.click('.js-unit-test[data-name="should_return_to_string"]');
-          casper.waitForSelector('.bubble-popup', function () {
-            test.assertSelectorContains('.bubble-popup', 'Sample.java');
-            test.assertSelectorContains('.bubble-popup', 'src/main/java/sample');
-          });
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Go From Coverage to Test File'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-        lib.mockRequestFromFile('/api/tests/test_cases', 'test-cases.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-toggle-coverage');
-        casper.waitForSelector('.source-line-covered', function () {
-          casper.click('.source-line-covered');
-          casper.waitForSelector('.bubble-popup', function () {
-            test.assertSelectorContains('.bubble-popup', 'src/test/java/org/sonar/batch/issue/IssueCacheTest.java');
-            test.assertSelectorContains('.bubble-popup', 'should_update_existing_issue');
-            test.assertSelectorContains('.bubble-popup li[title="should_update_existing_issue"]', '293');
-
-            lib.clearRequestMocks();
-            lib.mockRequestFromFile('/api/components/app', 'tests/app.json');
-            lib.mockRequestFromFile('/api/sources/show', 'tests/source.json');
-            lib.mockRequestFromFile('/api/resources', 'tests/resources.json');
-            lib.mockRequest('/api/coverage/show', '{}');
-            lib.mockRequestFromFile('/api/tests/show', 'tests/tests.json');
-            casper.click('.component-viewer-popup-test-file[data-key]');
-
-            casper.waitForSelector('.js-unit-test', function () {
-              test.assertElementCount('.js-unit-test', 2);
-            });
-          });
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Coverage Filters'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-coverage');
-        casper.waitForSelector('.js-filter-lines-to-cover');
-      })
-
-      .then(function () {
-        casper.click('.js-filter-lines-to-cover');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 142);
-          test.assertElementCount('.source-line-uncovered', 50);
-          test.assertElementCount('.source-line-partially-covered', 2);
-          test.assertElementCount('.component-viewer-source .source-line', 369);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-uncovered-lines');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 18);
-          test.assertElementCount('.source-line-uncovered', 50);
-          test.assertElementCount('.source-line-partially-covered', 0);
-          test.assertElementCount('.component-viewer-source .source-line', 136);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-branches-to-cover');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 19);
-          test.assertElementCount('.source-line-uncovered', 3);
-          test.assertElementCount('.source-line-partially-covered', 2);
-          test.assertElementCount('.component-viewer-source .source-line', 33);
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-filter-uncovered-branches');
-        casper.waitForSelector('.source-line-covered', function () {
-          test.assertElementCount('.source-line-covered', 4);
-          test.assertElementCount('.source-line-uncovered', 3);
-          test.assertElementCount('.source-line-partially-covered', 2);
-          test.assertElementCount('.component-viewer-source .source-line', 13);
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
-
-
-casper.test.begin(testName('Ability to Deselect Filters'), function (test) {
-  casper
-      .start(lib.buildUrl('component-viewer#component=component'), function () {
-        lib.setDefaultViewport();
-        lib.mockRequest('/api/l10n/index', '{}');
-        lib.mockRequestFromFile('/api/components/app', 'app.json');
-        lib.mockRequestFromFile('/api/sources/show', 'source.json');
-        lib.mockRequestFromFile('/api/resources', 'resources.json');
-        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
-        lib.mockRequestFromFile('/api/coverage/show', 'coverage.json');
-        lib.mockRequestFromFile('/api/duplications/show', 'duplications.json');
-      })
-
-      .then(function () {
-        casper.waitForSelector('.component-viewer-source .source-line');
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-issues');
-        var testFilter = '.js-filter-unresolved-issues';
-        casper.waitForSelector(testFilter + '.active', function () {
-          lib.waitForElementCount('.component-viewer-source .source-line', 56, function () {
-            casper.click(testFilter);
-            lib.waitForElementCount('.component-viewer-source .source-line', 520, function () {
-              test.assertDoesntExist(testFilter + '.active');
-              casper.click(testFilter);
-              lib.waitForElementCount('.component-viewer-source .source-line', 56, function () {
-                test.assertExists(testFilter + '.active');
-              });
-            });
-          })
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-coverage');
-        var testFilter = '.js-filter-lines-to-cover';
-        casper.waitForSelector(testFilter + '.active', function () {
-          lib.waitForElementCount('.component-viewer-source .source-line', 369, function () {
-            casper.click(testFilter);
-            lib.waitForElementCount('.component-viewer-source .source-line', 520, function () {
-              test.assertDoesntExist(testFilter + '.active');
-              casper.click(testFilter);
-              lib.waitForElementCount('.component-viewer-source .source-line', 369, function () {
-                test.assertExists(testFilter + '.active');
-              });
-            });
-          })
-        });
-      })
-
-      .then(function () {
-        casper.click('.js-header-tab-duplications');
-        var testFilter = '.js-filter-duplications';
-        casper.waitForSelector(testFilter + '.active', function () {
-          lib.waitForElementCount('.component-viewer-source .source-line', 39, function () {
-            casper.click(testFilter);
-            lib.waitForElementCount('.component-viewer-source .source-line', 520, function () {
-              test.assertDoesntExist(testFilter + '.active');
-              casper.click(testFilter);
-              lib.waitForElementCount('.component-viewer-source .source-line', 39, function () {
-                test.assertExists(testFilter + '.active');
-              });
-            });
-          })
-        });
-      })
-
-      .run(function () {
-        test.done();
-      });
-});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/app-not-logged-in.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/app-not-logged-in.json
deleted file mode 100644 (file)
index 3fc5d90..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-  "path": "src/main/java/org/sonar/batch/index/Cache.java",
-  "name": "Cache.java",
-  "longName": "src/main/java/org/sonar/batch/index/Cache.java",
-  "q": "FIL",
-  "subProject": "org.codehaus.sonar:sonar-batch",
-  "subProjectName": "SonarQube :: Batch",
-  "project": "org.codehaus.sonar:sonar",
-  "projectName": "SonarQube",
-  "fav": false,
-  "canMarkAsFavourite": false,
-  "canBulkChange": false,
-  "canCreateManualIssue": false,
-  "periods": [
-    [1, "since previous analysis (2014 Jul 08)", "2014-07-08T23:17:21+0200"],
-    [2, "over 365 days (2013 Jul 10)", "2013-07-10T00:41:28+0200"],
-    [3, "since previous version (4.4 - 2014 Jul 02)", "2014-07-02T15:39:51+0200"]
-  ],
-  "severities": [
-    ["MINOR", "Minor", 1],
-    ["MAJOR", "Major", 1],
-    ["INFO", "Info", 4]
-  ],
-  "rules": [
-    ["common-java:DuplicatedBlocks", "Duplicated blocks", 1],
-    ["squid:S1192", "String literals should not be duplicated", 1],
-    ["squid:S1135", "TODO tags should be handled", 4]
-  ],
-  "measures": {
-    "fNcloc": "379",
-    "fCoverage": "74.3%",
-    "fDuplicationDensity": "5.8%",
-    "fDebt": "3h 30min",
-    "fIssues": "6",
-    "fMinorIssues": "1",
-    "fMajorIssues": "1",
-    "fInfoIssues": "4",
-    "fSqaleRating": "A"
-  },
-  "tabs": ["scm", "coverage", "duplications"],
-  "manual_rules": [
-    {
-      "key": "manual:api",
-      "name": "API"
-    },
-    {
-      "key": "manual:design",
-      "name": "Design"
-    },
-    {
-      "key": "manual:error_handling",
-      "name": "Error handling"
-    },
-    {
-      "key": "manual:performance",
-      "name": "Performance"
-    },
-    {
-      "key": "manual:sql_pitfalls",
-      "name": "SQL Pitfall"
-    }
-  ]
-}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/app.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/app.json
deleted file mode 100644 (file)
index 551719f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-  "path": "src/main/java/org/sonar/batch/index/Cache.java",
-  "name": "Cache.java",
-  "longName": "src/main/java/org/sonar/batch/index/Cache.java",
-  "q": "FIL",
-  "subProject": "org.codehaus.sonar:sonar-batch",
-  "subProjectName": "SonarQube :: Batch",
-  "project": "org.codehaus.sonar:sonar",
-  "projectName": "SonarQube",
-  "fav": false,
-  "canMarkAsFavourite": true,
-  "canBulkChange": true,
-  "canCreateManualIssue": true,
-  "periods": [
-    [1, "since previous analysis (2014 Jul 08)", "2014-07-08T23:17:21+0200"],
-    [2, "over 365 days (2013 Jul 10)", "2013-07-10T00:41:28+0200"],
-    [3, "since previous version (4.4 - 2014 Jul 02)", "2014-07-02T15:39:51+0200"]
-  ],
-  "severities": [
-    ["MINOR", "Minor", 1],
-    ["MAJOR", "Major", 1],
-    ["INFO", "Info", 4]
-  ],
-  "rules": [
-    ["common-java:DuplicatedBlocks", "Duplicated blocks", 1],
-    ["squid:S1192", "String literals should not be duplicated", 1],
-    ["squid:S1135", "TODO tags should be handled", 4]
-  ],
-  "measures": {
-    "fNcloc": "379",
-    "fCoverage": "74.3%",
-    "fDuplicationDensity": "5.8%",
-    "fDebt": "3h 30min",
-    "fIssues": "6",
-    "fMinorIssues": "1",
-    "fMajorIssues": "1",
-    "fInfoIssues": "4",
-    "fSqaleRating": "A"
-  },
-  "tabs": ["scm", "coverage", "duplications"],
-  "manual_rules": [
-    {
-      "key": "manual:api",
-      "name": "API"
-    },
-    {
-      "key": "manual:design",
-      "name": "Design"
-    },
-    {
-      "key": "manual:error_handling",
-      "name": "Error handling"
-    },
-    {
-      "key": "manual:performance",
-      "name": "Performance"
-    },
-    {
-      "key": "manual:sql_pitfalls",
-      "name": "SQL Pitfall"
-    }
-  ]
-}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/coverage.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/coverage.json
deleted file mode 100644 (file)
index ace41da..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-{"coverage": [
-  [46, true, 32, null, null],
-  [47, true, 32, null, null],
-  [48, true, 32, null, null],
-  [49, true, 32, null, null],
-  [52, true, 2, null, null],
-  [53, true, 2, null, null],
-  [57, true, 18, null, null],
-  [58, true, 18, null, null],
-  [62, true, 13, null, null],
-  [63, true, 13, null, null],
-  [67, false, null, null, null],
-  [68, false, null, null, null],
-  [73, true, 27, null, null],
-  [74, true, 27, null, null],
-  [75, true, 27, null, null],
-  [76, true, 1, null, null],
-  [77, true, 1, null, null],
-  [85, true, 5, null, null],
-  [86, true, 5, null, null],
-  [94, true, 10, null, null],
-  [95, true, 10, null, null],
-  [103, true, 11, null, null],
-  [104, true, 11, null, null],
-  [112, false, null, null, null],
-  [113, false, null, null, null],
-  [120, true, 17, null, null],
-  [121, true, 17, 2, 2],
-  [122, true, 8, null, null],
-  [124, true, 13, null, null],
-  [125, false, null, null, null],
-  [127, false, null, null, null],
-  [132, true, 4, null, null],
-  [133, true, 4, null, null],
-  [137, true, 3, null, null],
-  [138, true, 3, null, null],
-  [142, true, 5, null, null],
-  [143, true, 5, null, null],
-  [147, false, null, null, null],
-  [148, false, null, null, null],
-  [153, true, 7, null, null],
-  [154, true, 7, null, null],
-  [155, false, null, null, null],
-  [157, false, null, null, null],
-  [162, true, 3, null, null],
-  [163, true, 3, null, null],
-  [167, true, 3, null, null],
-  [168, true, 3, null, null],
-  [172, true, 2, null, null],
-  [173, true, 2, null, null],
-  [177, false, null, null, null],
-  [178, false, null, null, null],
-  [183, true, 6, null, null],
-  [184, false, null, null, null],
-  [186, false, null, null, null],
-  [196, true, 5, null, null],
-  [197, true, 5, null, null],
-  [201, true, 2, null, null],
-  [202, true, 2, null, null],
-  [206, true, 1, null, null],
-  [207, true, 1, null, null],
-  [211, false, null, null, null],
-  [212, false, null, null, null],
-  [217, true, 5, null, null],
-  [218, true, 5, null, null],
-  [219, true, 5, null, null],
-  [220, true, 5, null, null],
-  [221, false, null, null, null],
-  [222, false, null, null, null],
-  [231, true, 4, null, null],
-  [232, true, 4, null, null],
-  [233, false, null, null, null],
-  [234, false, null, null, null],
-  [235, true, 4, null, null],
-  [236, true, 4, null, null],
-  [248, true, 4, null, null],
-  [249, true, 4, null, null],
-  [250, true, 4, null, null],
-  [251, true, 4, null, null],
-  [252, true, 4, null, null],
-  [253, true, 4, 2, 2],
-  [254, true, 2, null, null],
-  [256, true, 4, null, null],
-  [257, false, null, null, null],
-  [258, false, null, null, null],
-  [265, true, 1, null, null],
-  [266, true, 1, null, null],
-  [267, true, 1, null, null],
-  [268, true, 1, null, null],
-  [269, true, 1, null, null],
-  [270, true, 1, null, null],
-  [271, true, 1, 2, 2],
-  [272, true, 1, null, null],
-  [274, true, 1, null, null],
-  [275, false, null, null, null],
-  [276, false, null, null, null],
-  [287, true, 4, null, null],
-  [288, true, 4, null, null],
-  [289, true, 4, null, null],
-  [290, true, 4, null, null],
-  [291, true, 4, 2, 2],
-  [292, true, 3, null, null],
-  [294, true, 4, null, null],
-  [295, false, null, null, null],
-  [296, false, null, null, null],
-  [305, true, 1, null, null],
-  [306, true, 1, null, null],
-  [307, true, 1, null, null],
-  [308, true, 1, null, null],
-  [309, true, 1, null, null],
-  [310, false, null, null, null],
-  [311, false, null, null, null],
-  [316, false, null, null, null],
-  [324, true, 23, null, null],
-  [325, true, 23, null, null],
-  [326, true, 23, null, null],
-  [327, true, 23, null, null],
-  [328, true, 23, null, null],
-  [329, false, null, null, null],
-  [330, false, null, null, null],
-  [339, true, 16, null, null],
-  [340, true, 16, null, null],
-  [341, true, 16, null, null],
-  [342, true, 16, null, null],
-  [343, false, null, null, null],
-  [344, false, null, null, null],
-  [349, true, 9, null, null],
-  [350, true, 9, null, null],
-  [351, true, 9, null, null],
-  [355, true, 3, null, null],
-  [356, true, 3, null, null],
-  [357, true, 3, null, null],
-  [361, true, 7, null, null],
-  [362, true, 7, null, null],
-  [363, true, 7, null, null],
-  [366, true, 20, null, null],
-  [367, true, 20, null, null],
-  [368, true, 20, null, null],
-  [371, true, 18, null, null],
-  [372, true, 18, null, null],
-  [373, true, 18, null, null],
-  [376, false, null, null, null],
-  [377, false, null, 2, 0],
-  [378, false, null, null, null],
-  [380, false, null, null, null],
-  [389, true, 26, null, null],
-  [390, true, 26, null, null],
-  [391, true, 26, null, null],
-  [395, true, 26, null, null],
-  [403, true, 26, null, null],
-  [404, true, 26, null, null],
-  [405, true, 26, null, null],
-  [406, true, 26, null, null],
-  [411, true, 25, null, null],
-  [412, false, null, null, null],
-  [413, false, null, null, null],
-  [421, true, 23, null, null],
-  [422, false, null, null, null],
-  [423, false, null, null, null],
-  [424, true, 23, null, null],
-  [425, true, 23, 2, 1],
-  [426, true, 23, null, null],
-  [428, false, null, null, null],
-  [433, false, null, null, null],
-  [440, true, 10, null, null],
-  [441, true, 10, null, null],
-  [442, true, 10, null, null],
-  [446, true, 10, null, null],
-  [454, true, 10, null, null],
-  [455, true, 10, null, null],
-  [456, true, 10, null, null],
-  [457, true, 10, null, null],
-  [462, true, 10, null, null],
-  [463, false, null, null, null],
-  [464, false, null, null, null],
-  [472, true, 9, null, null],
-  [473, false, null, null, null],
-  [474, false, null, null, null],
-  [475, true, 9, null, null],
-  [476, true, 9, 2, 1],
-  [477, true, 9, null, null],
-  [478, true, 9, null, null],
-  [479, true, 9, null, null],
-  [480, true, 9, 2, 2],
-  [481, true, 9, null, null],
-  [483, true, 9, null, null],
-  [485, false, null, null, null],
-  [490, false, null, null, null],
-  [498, true, 16, null, null],
-  [499, true, 16, null, null],
-  [500, true, 16, null, null],
-  [501, true, 16, null, null],
-  [504, true, 14, null, null],
-  [509, true, 14, null, null],
-  [514, false, null, null, null]
-]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/cross-project-duplications.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/cross-project-duplications.json
deleted file mode 100644 (file)
index cd445d5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-{"duplications": [
-  {
-    "blocks": [
-      {
-        "from": 404,
-        "size": 15,
-        "_ref": "1"
-      },
-      {
-        "from": 455,
-        "size": 15,
-        "_ref": "2"
-      }
-    ]
-  }
-], "files": {
-  "1": {
-    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "name": "src/main/java/org/sonar/batch/index/Cache.java",
-    "project": "org.codehaus.sonar:sonar",
-    "projectName": "SonarQube",
-    "subProject": "org.codehaus.sonar:sonar-batch",
-    "subProjectName": "SonarQube :: Batch"
-  },
-  "2": {
-    "key": "org.codehaus.sonar-plugins.javascript:sonar-javascript-plugin:src/main/java/org/sonar/plugins/javascript/core/JavaScript.java",
-    "name": "src/main/java/org/sonar/plugins/javascript/core/JavaScript.java",
-    "project": "org.codehaus.sonar-plugins.javascript:javascript",
-    "projectName": "JavaScript",
-    "subProject": "org.codehaus.sonar-plugins.javascript:sonar-javascript-plugin",
-    "subProjectName": "JavaScript :: Sonar Plugin"
-  }
-}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications-in-deleted-files.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications-in-deleted-files.json
deleted file mode 100644 (file)
index 9de23d1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{"duplications": [
-  {
-    "blocks": [
-      {
-        "from": 404,
-        "size": 15,
-        "_ref": "1"
-      },
-      {
-        "from": 455,
-        "size": 15
-      }
-    ]
-  }
-], "files": {
-  "1": {
-    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "name": "src/main/java/org/sonar/batch/index/Cache.java",
-    "project": "org.codehaus.sonar:sonar",
-    "projectName": "SonarQube",
-    "subProject": "org.codehaus.sonar:sonar-batch",
-    "subProjectName": "SonarQube :: Batch"
-  }
-}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications.json
deleted file mode 100644 (file)
index f77e92b..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-{"duplications": [
-  {
-    "blocks": [
-      {
-        "from": 404,
-        "size": 15,
-        "_ref": "1"
-      },
-      {
-        "from": 455,
-        "size": 15,
-        "_ref": "1"
-      }
-    ]
-  }
-], "files": {
-  "1": {
-    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "name": "src/main/java/org/sonar/batch/index/Cache.java",
-    "project": "org.codehaus.sonar:sonar",
-    "projectName": "SonarQube",
-    "subProject": "org.codehaus.sonar:sonar-batch",
-    "subProjectName": "SonarQube :: Batch"
-  }
-}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/issues.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/issues.json
deleted file mode 100644 (file)
index bced9b3..0000000
+++ /dev/null
@@ -1,646 +0,0 @@
-{"maxResultsReached": false, "paging": {
-  "pageIndex": 1,
-  "pageSize": 999999,
-  "total": 27,
-  "fTotal": "27",
-  "pages": 1
-}, "issues": [
-  {
-    "key": "1c88fb97-4e89-4719-895d-fdf027cd9e6d",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "checkstyle:com.puppycrawl.tools.checkstyle.checks.TodoCommentCheck_1296413157",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "INFO",
-    "message": "Comment matches to-do format 'TODO'.",
-    "line": 153,
-    "author": "Simon Brandhof",
-    "creationDate": "2013-04-17T04:05:53+0200",
-    "updateDate": "2013-07-26T12:39:46+0200",
-    "fUpdateAge": "12 months",
-    "closeDate": "2013-07-26T12:39:46+0200"
-  },
-  {
-    "key": "242b8049-33f5-4bb3-b9a8-ff86de5698d1",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1135",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "INFO",
-    "message": "Complete the task associated to this TODO comment.",
-    "line": 151,
-    "author": "Simon Brandhof",
-    "creationDate": "2013-07-26T14:28:10+0200",
-    "updateDate": "2013-08-03T00:02:13+0200",
-    "fUpdateAge": "11 months",
-    "closeDate": "2013-08-03T00:02:13+0200"
-  },
-  {
-    "key": "9942b361-7127-4ee1-950c-bc67cdb21d19",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1135",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "INFO",
-    "message": "Complete the task associated to this TODO comment.",
-    "line": 151,
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-08T00:00:30+0200",
-    "updateDate": "2013-08-09T00:24:41+0200",
-    "fUpdateAge": "11 months",
-    "closeDate": "2013-08-09T00:24:41+0200"
-  },
-  {
-    "key": "987a803e-2dc8-4552-a0ec-e59c7d6bba8e",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1166",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "CRITICAL",
-    "message": "",
-    "line": 322,
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-09T16:04:33+0200",
-    "updateDate": "2013-08-09T17:35:26+0200",
-    "fUpdateAge": "11 months",
-    "closeDate": "2013-08-09T17:35:26+0200"
-  },
-  {
-    "key": "9afae6b5-3328-4867-8263-16ac58589699",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1173",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "MAJOR",
-    "message": "Rename 'it' to a meaningful name of at least 3 characters.",
-    "line": 297,
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-09T16:04:33+0200",
-    "updateDate": "2013-08-09T17:35:26+0200",
-    "fUpdateAge": "11 months",
-    "closeDate": "2013-08-09T17:35:26+0200"
-  },
-  {
-    "key": "cb76411f-7965-4949-bfb8-a7e48b19de1c",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1166",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "CRITICAL",
-    "message": "",
-    "line": 277,
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-09T16:04:33+0200",
-    "updateDate": "2013-08-09T17:35:26+0200",
-    "fUpdateAge": "11 months",
-    "closeDate": "2013-08-09T17:35:26+0200"
-  },
-  {
-    "key": "e4de6481-7bfb-460a-8b3c-24459f9561d3",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1135",
-    "status": "CONFIRMED",
-    "severity": "INFO",
-    "message": "Complete the task associated to this TODO comment.",
-    "line": 240,
-    "debt": "20min",
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-09T16:04:33+0200",
-    "updateDate": "2013-08-20T11:32:56+0200",
-    "fUpdateAge": "11 months"
-  },
-  {
-    "key": "3a64321a-c031-43ff-bdd6-121cefaf332c",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1186",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MAJOR",
-    "message": "Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.",
-    "line": 406,
-    "debt": "5min",
-    "author": "Simon Brandhof",
-    "actionPlan": "eaf2a3b4-e06f-4e8a-92ec-444f1cf68231",
-    "creationDate": "2013-08-22T10:19:41+0200",
-    "updateDate": "2014-02-24T14:51:05+0100",
-    "fUpdateAge": "4 months",
-    "closeDate": "2014-02-24T14:51:05+0100"
-  },
-  {
-    "key": "3c330410-3fb7-474b-a6f3-522fb5468c69",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1166",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MAJOR",
-    "message": "Either log or rethrow this exception along with some contextual information.",
-    "line": 277,
-    "assignee": "simon.brandhof",
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-22T10:19:41+0200",
-    "updateDate": "2013-08-28T12:19:16+0200",
-    "fUpdateAge": "10 months",
-    "closeDate": "2013-08-28T12:19:16+0200"
-  },
-  {
-    "key": "517b0861-bdfd-4b01-a4fc-2fccbf4e1748",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1192",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MINOR",
-    "message": "Define a constant instead of duplicating this literal \"Fail to get element from cache \" 2 times.",
-    "line": 124,
-    "debt": "10min",
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-22T10:19:41+0200",
-    "updateDate": "2014-04-29T11:24:53+0200",
-    "fUpdateAge": "2 months",
-    "closeDate": "2014-04-29T11:24:53+0200",
-    "comments": [
-      {
-        "key": "7b24f4be-bcaa-4896-a5f7-9e1c84648025",
-        "login": "simon.brandhof",
-        "userName": "Simon Brandhof",
-        "htmlText": "Using constants in log messages does not make sense",
-        "markdown": "Using constants in log messages does not make sense",
-        "updatable": false,
-        "createdAt": "2013-09-02T17:04:47+0200"
-      }
-    ]
-  },
-  {
-    "key": "963c67be-0a42-4fe6-837b-755232e4c41b",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1192",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MINOR",
-    "message": "Define a constant instead of duplicating this literal \"Fail to get values from cache \" 3 times.",
-    "line": 306,
-    "debt": "10min",
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-22T10:19:41+0200",
-    "updateDate": "2014-04-29T11:24:53+0200",
-    "fUpdateAge": "2 months",
-    "closeDate": "2014-04-29T11:24:53+0200",
-    "comments": [
-      {
-        "key": "948f7629-4f81-4b5b-8a44-ba9ca05553c4",
-        "login": "simon.brandhof",
-        "userName": "Simon Brandhof",
-        "htmlText": "Using constants in log messages does not make sense",
-        "markdown": "Using constants in log messages does not make sense",
-        "updatable": false,
-        "createdAt": "2013-09-02T17:04:56+0200"
-      }
-    ]
-  },
-  {
-    "key": "bb6cee43-0e33-41a8-b550-6214418b50c1",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1186",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MAJOR",
-    "message": "Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.",
-    "line": 351,
-    "debt": "20min",
-    "author": "Simon Brandhof",
-    "actionPlan": "c3484f53-4bcf-4ae8-ad34-383480070950",
-    "creationDate": "2013-08-22T10:19:41+0200",
-    "updateDate": "2013-12-10T15:55:46+0100",
-    "fUpdateAge": "7 months",
-    "closeDate": "2013-12-10T15:55:46+0100"
-  },
-  {
-    "key": "c86f19ef-cacb-43ab-bc7f-a3bfb00e954b",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1166",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MAJOR",
-    "message": "Either log or rethrow this exception along with some contextual information.",
-    "line": 322,
-    "assignee": "simon.brandhof",
-    "author": "Simon Brandhof",
-    "creationDate": "2013-08-22T10:19:41+0200",
-    "updateDate": "2013-08-28T12:19:16+0200",
-    "fUpdateAge": "10 months",
-    "closeDate": "2013-08-28T12:19:16+0200"
-  },
-  {
-    "key": "26ebfb62-ce60-47e5-86b9-872d8322ddb8",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "findbugs:NP_NULL_PARAM_DEREF",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "CRITICAL",
-    "message": "Null passed for nonnull parameter of new Cache$Entry(String, String, Serializable) in org.sonar.batch.index.Cache$EntryIterator.next()",
-    "line": 334,
-    "author": "Simon Brandhof",
-    "creationDate": "2013-09-16T17:20:55+0200",
-    "updateDate": "2013-09-17T01:55:28+0200",
-    "fUpdateAge": "10 months",
-    "closeDate": "2013-09-17T01:55:28+0200"
-  },
-  {
-    "key": "01461208-6c1e-4cdf-9f27-b7afa78e76ec",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1135",
-    "status": "CONFIRMED",
-    "severity": "INFO",
-    "message": "Complete the task associated to this TODO comment.",
-    "line": 185,
-    "debt": "20min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2013-10-10T23:51:33+0200",
-    "updateDate": "2013-12-10T16:22:53+0100",
-    "fUpdateAge": "7 months"
-  },
-  {
-    "key": "71a26f48-a90d-4a76-a745-4f6e6e8b1773",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1135",
-    "status": "REOPENED",
-    "severity": "INFO",
-    "message": "Complete the task associated to this TODO comment.",
-    "line": 126,
-    "debt": "20min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2013-10-10T23:51:33+0200",
-    "updateDate": "2013-12-10T16:24:57+0100",
-    "fUpdateAge": "7 months"
-  },
-  {
-    "key": "75419c88-0e3c-4311-aa47-fe5731e67558",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1135",
-    "status": "CONFIRMED",
-    "severity": "INFO",
-    "message": "Complete the task associated to this TODO comment.",
-    "line": 156,
-    "debt": "20min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2013-10-10T23:51:33+0200",
-    "updateDate": "2013-12-10T16:25:06+0100",
-    "fUpdateAge": "7 months"
-  },
-  {
-    "key": "59fc17f7-c977-4cb6-8f04-fbe88e4b9186",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1192",
-    "status": "CONFIRMED",
-    "severity": "MINOR",
-    "message": "Define a constant instead of duplicating this literal \"Fail to get keys from cache \" 3 times.",
-    "line": 258,
-    "debt": "10min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2014-02-20T07:48:16+0100",
-    "updateDate": "2014-02-24T16:57:34+0100",
-    "fUpdateAge": "4 months"
-  },
-  {
-    "key": "e30c874a-0cd1-44db-8dd3-c7cfd5d72929",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1192",
-    "status": "CLOSED",
-    "resolution": "FALSE-POSITIVE",
-    "severity": "MINOR",
-    "message": "Define a constant instead of duplicating this literal \"Removing an item is not supported\" 2 times.",
-    "line": 420,
-    "debt": "10min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2014-02-24T14:51:05+0100",
-    "updateDate": "2014-04-29T11:24:53+0200",
-    "fUpdateAge": "2 months",
-    "closeDate": "2014-04-29T11:24:53+0200"
-  },
-  {
-    "key": "7cc2e50d-3afc-4e7e-a562-eae2fbb9b596",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1192",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MINOR",
-    "message": "Define a constant instead of duplicating this literal \"Fail to get values from cache \" 3 times.",
-    "line": 311,
-    "debt": "10min",
-    "assignee": "julien.henry",
-    "author": "julien.henry@sonarsource.com",
-    "actionPlan": "39d06f0c-98c0-4a4f-956b-38ccbc9eb5c9",
-    "creationDate": "2014-04-30T23:37:32+0200",
-    "updateDate": "2014-06-20T14:47:17+0200",
-    "fUpdateAge": "about a month",
-    "closeDate": "2014-06-20T14:47:17+0200"
-  },
-  {
-    "key": "20002ec7-b647-44da-bdf5-4d9fbf4b7c58",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "common-java:DuplicatedBlocks",
-    "status": "CONFIRMED",
-    "severity": "MAJOR",
-    "message": "2 duplicated blocks of code.",
-    "debt": "2h",
-    "creationDate": "2014-05-01T23:38:31+0200",
-    "updateDate": "2014-07-01T17:48:47+0200",
-    "fUpdateAge": "21 days"
-  },
-  {
-    "key": "5cbf3374-cd56-4e16-8434-d47ee541b347",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:HiddenFieldCheck",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MAJOR",
-    "message": "Rename \"exchange\" which hides the field declared at line 46.",
-    "line": 517,
-    "debt": "30min",
-    "creationDate": "2014-05-06T16:36:28+0200",
-    "updateDate": "2014-05-07T23:40:25+0200",
-    "fUpdateAge": "2 months",
-    "closeDate": "2014-05-07T23:40:25+0200"
-  },
-  {
-    "key": "aac25f93-f7e5-4e75-a750-b64d4d621c67",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1166",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "CRITICAL",
-    "message": "Either log or rethrow this exception.",
-    "line": 523,
-    "debt": "10min",
-    "creationDate": "2014-05-06T16:36:28+0200",
-    "updateDate": "2014-05-07T23:40:25+0200",
-    "fUpdateAge": "2 months",
-    "closeDate": "2014-05-07T23:40:25+0200"
-  },
-  {
-    "key": "cdea44e2-a1eb-43dd-a990-662c7cf0b8b9",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "findbugs:REC_CATCH_EXCEPTION",
-    "status": "CLOSED",
-    "resolution": "FIXED",
-    "severity": "MAJOR",
-    "message": "Exception is caught when Exception is not thrown in org.sonar.batch.index.Cache.newExchange(Exchange)",
-    "line": 523,
-    "debt": "1h",
-    "creationDate": "2014-05-06T16:36:28+0200",
-    "updateDate": "2014-05-07T23:40:25+0200",
-    "fUpdateAge": "2 months",
-    "closeDate": "2014-05-07T23:40:25+0200"
-  },
-  {
-    "key": "331984f1-e2ce-49a7-838f-a5e2e00bdb65",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1701",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "MAJOR",
-    "message": "Rename the \"value\" member.",
-    "line": 496,
-    "debt": "10min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2014-06-26T23:17:10+0200",
-    "updateDate": "2014-06-27T23:12:06+0200",
-    "fUpdateAge": "25 days",
-    "closeDate": "2014-06-27T23:12:06+0200"
-  },
-  {
-    "key": "539895b5-bca6-491a-94da-24b0105af28f",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1701",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "MAJOR",
-    "message": "Rename the \"key\" member.",
-    "line": 495,
-    "debt": "10min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2014-06-26T23:17:10+0200",
-    "updateDate": "2014-06-27T23:12:06+0200",
-    "fUpdateAge": "25 days",
-    "closeDate": "2014-06-27T23:12:06+0200"
-  },
-  {
-    "key": "889efbf0-b218-4be7-9ff4-84867b5bc808",
-    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "componentId": 19983,
-    "project": "org.codehaus.sonar:sonar",
-    "rule": "squid:S1701",
-    "status": "CLOSED",
-    "resolution": "REMOVED",
-    "severity": "MAJOR",
-    "message": "Rename the \"iterator\" member.",
-    "line": 387,
-    "debt": "10min",
-    "author": "simon.brandhof@gmail.com",
-    "creationDate": "2014-06-26T23:17:10+0200",
-    "updateDate": "2014-06-27T23:12:06+0200",
-    "fUpdateAge": "25 days",
-    "closeDate": "2014-06-27T23:12:06+0200"
-  }
-], "components": [
-  {
-    "key": "org.codehaus.sonar:sonar",
-    "id": 2865,
-    "qualifier": "TRK",
-    "name": "SonarQube",
-    "longName": "SonarQube"
-  },
-  {
-    "key": "org.codehaus.sonar:sonar-batch",
-    "id": 1624,
-    "qualifier": "BRC",
-    "name": "SonarQube :: Batch",
-    "longName": "SonarQube :: Batch",
-    "path": "sonar-batch",
-    "projectId": 2865,
-    "subProjectId": 2865
-  },
-  {
-    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "id": 19983,
-    "qualifier": "FIL",
-    "name": "Cache.java",
-    "longName": "src/main/java/org/sonar/batch/index/Cache.java",
-    "path": "src/main/java/org/sonar/batch/index/Cache.java",
-    "projectId": 2865,
-    "subProjectId": 1624
-  }
-], "projects": [
-  {
-    "key": "org.codehaus.sonar:sonar",
-    "id": 2865,
-    "qualifier": "TRK",
-    "name": "SonarQube",
-    "longName": "SonarQube"
-  }
-], "rules": [
-  {
-    "key": "squid:S1166",
-    "name": "Exception handlers should preserve the original exception",
-    "desc": "<p>\nWhen handling a caught exception, two mandatory informations should be logged:\n</p>\n\n<ul>\n  <li>Some context to ease the reproduction of the issue.</li>\n  <li>The original's exception, for its message and stack trace.</lu>\n</ul>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre>\n // Noncompliant - exception is lost\ntry { /* ... */ } catch (Exception e) { LOGGER.info(\"context\"); }\n\n// Noncompliant - context is required\ntry { /* ... */ } catch (Exception e) { LOGGER.info(e); }\n\n// Noncompliant - exception is lost (only message is preserved)\ntry { /* ... */ } catch (Exception e) { LOGGER.info(e.getMessage()); }\n\n// Noncompliant - exception is lost\ntry { /* ... */ } catch (Exception e) { throw new RuntimeException(\"context\"); }\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre>\ntry { /* ... */ } catch (Exception e) { LOGGER.info(\"context\", e); }\n\ntry { /* ... */ } catch (Exception e) { throw new RuntimeException(\"context\", e); }\n</pre>\n\n<h2>Exceptions</h2>\n\n<p>It is allowed to let the exception propagate.</p>\n\n<pre>\ntry {\n  /* ... */\n} catch (RuntimeException e) {\n  doSomething();\n  throw e;\n} catch (Exception e) {\n  // Conversion into unchecked exception is also allowed\n  throw new RuntimeException(e);\n}\n</pre>\n\n<p>\n<code>InterruptedException</code>, <code>NumberFormatException</code>, <code>ParseException</code> and <code>MalformedURLException</code> exceptions are arguably used to indicate nonexceptional outcomes.\nAs they are part of Java, developers have no choice but to deal with them. This rule does not verify that those particular exceptions are correctly handled.\n</p>\n\n<pre>\nint myInteger;\ntry {\n  myInteger = Integer.parseInt(myString);\n} catch (NumberFormatException e) {\n  // It is perfectly acceptable to not handle \"e\" here\n  myInteger = 0;\n}\n</pre>",
-    "status": "READY"
-  },
-  {
-    "key": "common-java:DuplicatedBlocks",
-    "name": "Duplicated blocks",
-    "desc": "<p>An issue is created on a file as soon as there is a block of duplicated code on this file. It gives the number of blocks in the file.</p>",
-    "status": "READY"
-  },
-  {
-    "key": "findbugs:REC_CATCH_EXCEPTION",
-    "name": "Dodgy - Exception is caught when Exception is not thrown",
-    "desc": "<p>\n  This method uses a try-catch block that catches Exception objects, but Exception is not\n  thrown within the try block, and RuntimeException is not explicitly caught.  It is a common bug pattern to\n  say try { ... } catch (Exception e) { something } as a shorthand for catching a number of types of exception\n  each of whose catch blocks is identical, but this construct also accidentally catches RuntimeException as well,\n  masking potential bugs.\n  </p>",
-    "status": "READY"
-  },
-  {
-    "key": "squid:S1701",
-    "name": "Fields should not duplicate method names",
-    "desc": "<p>It's confusing to have a class member with the same name as a method in the class.</p>\n\n<p>Typically this situation indicates that the method is poorly named; method names should be action-oriented, and thus contain a verb, which is unlikely in the case where both a method and a member have the same name. However, renaming a public method could be disruptive to callers. Therefore renaming the member is the recommended action.</p>\n\n<h2>Noncompliant Code Sample</h2>\n<pre>\npublic class Foo {\n\n  private string fiz;\n  public String fiz() {\n    // do something...\n  }\n\n  private void doSomething() {\n\n    String tmp = fiz; // is this what was intended? Should this have been a call to fiz()?\n\n  }\n}\n</pre>\n\n<h2>Compliant Solution</h2>\n<pre>\npublic class Foo {\n\n  private string fizbah; // member has been renamed\n  public String fiz() {\n    // do something...\n  }\n\n  private void doSomething() {\n\n    String tmp = fiz; // results in a compile error\n    String tmp2 = fiz(); // no question now what was intended\n  }\n}\n</pre>",
-    "status": "REMOVED"
-  },
-  {
-    "key": "squid:S1192",
-    "name": "String literals should not be duplicated",
-    "desc": "<p>\n  Duplicated string literals make the process of refactoring error-prone, since you must be sure to update all occurrences.\n  On the other hand, constants can be referenced from many places, but only need to be updated in a single place.\n</p>\n\n<h2>Non Compliant Code Example</h2>\n\n<pre>\npublic void run() {\n  prepare(\"action1\");                              // Non-Compliant - \"action1\" is duplicated 3 times\n  execute(\"action1\");\n  release(\"action1\");\n}\n\n@SuppressWarning(\"all\")                            // Compliant - annotations are excluded\nprivate void method1() { /* ... */ }\n@SuppressWarning(\"all\")\nprivate void method2() { /* ... */ }\n\npublic String method3(String a) {\n  System.out.println(\"'\" + a + \"'\");               // Compliant - literal \"'\" has less than 5 characters and is excluded\n  return \"\";                                       // Compliant - literal \"\" has less than 5 characters and is excluded\n}\n</pre>\n\n<h2>Compliant Code Example</h2>\n\n<pre>\nprivate static final String ACTION_1 = \"action1\";  // Compliant\n\npublic void run() {\n  prepare(ACTION_1);                               // Compliant\n  execute(ACTION_1);\n  release(ACTION_1);\n}\n</pre>\n\n<h2>Exceptions</h2>\n<p>To prevent generating some false-positives, literals having less than 5 characters are excluded.</p>",
-    "status": "READY"
-  },
-  {
-    "key": "squid:HiddenFieldCheck",
-    "name": "Local variables should not shadow class fields",
-    "desc": "<p>\nShadowing fields with a local variable is a bad practice reducing code readability: It makes it confusing to know whether the field or the variable is and should be accessed.\n</p>\n\n<p>\nThe following code illustrates this rule:\n</p>\n\n<pre>\nclass Foo {\n  public int myField;\n\n  public Foo(int myField) {                   // Compliant - method parameters are not checked\n    this.myField = myField;\n  }\n\n  @Override\n  public String toString() {\n    int myField = 0;                          // Non-Compliant - should be renamed\n    return \"Foo{MyField: \" + myField + \"}\";\n  }\n}\n</pre>",
-    "status": "READY"
-  },
-  {
-    "key": "squid:S1135",
-    "name": "TODO tags should be handled",
-    "desc": "<p>\n<code>TODO</code> tags are commonly used to mark places where some more code is required, but which the developer wants to implement later.\nSometimes the developer will not have the time or will simply forget to get back to that tag.\nThis rule is meant to track those tags, and ensure that they do not go unnoticed.\n</p>\n\n<p>The following code illustrates this rule:</p>\n\n<pre>\nvoid doSomething() {\n  // TODO\n}\n</pre>",
-    "status": "READY"
-  },
-  {
-    "key": "findbugs:NP_NULL_PARAM_DEREF",
-    "name": "Correctness - Method call passes null for nonnull parameter",
-    "desc": "<p>\n      This method call passes a null value for a nonnull method parameter.\n\tEither the parameter is annotated as a parameter that should\n\talways be nonnull, or analysis has shown that it will always be \n\tdereferenced.\n      </p>",
-    "status": "READY"
-  },
-  {
-    "key": "squid:S1173",
-    "name": "S1173",
-    "desc": "S1173",
-    "status": "REMOVED"
-  },
-  {
-    "key": "squid:S1186",
-    "name": "Methods should not be empty",
-    "desc": "<p>There are three reasons for a method not to have a method body:</p>\n\n<ul>\n  <li>It is an unintentional omission, and should be fixed.</li>\n  <li>It is not yet, or never will be, supported. In this case an <code>UnsupportedOperationException</code> should be thrown.</li>\n  <li>The method is an intentionally-blank override. In this case a nested comment should explain the reason for the blank override.</li>\n</ul>\n\n<p>The following code snippet:</p>\n\n<pre>\n// Non-Compliant\npublic void doSomething() {\n}\n</pre>\n\nshould be refactored into:\n\n<pre>\n// Compliant\n@Override\npublic void doSomethingElse() {\n  // Do nothing because of X and Y.\n}\n</pre>\n\nor:\n\n<pre>\n// Compliant\n@Override\npublic void doSomethingElse() {\n  throw new UnsupportedOperationException();\n}\n</pre>\n\n<p>Empty methods not having any nested comments are tolerated in Abstract classes as those empty methods are usual when implementing the visitor pattern.</p>",
-    "status": "READY"
-  }
-], "users": [
-  {
-    "login": "julien.henry",
-    "name": "Julien Henry",
-    "active": true,
-    "email": "julien.henry@sonarsource.com"
-  },
-  {
-    "login": "simon.brandhof",
-    "name": "Simon Brandhof",
-    "active": true,
-    "email": "simon.brandhof@sonarsource.com"
-  }
-], "actionPlans": [
-  {
-    "key": "eaf2a3b4-e06f-4e8a-92ec-444f1cf68231",
-    "name": "4.2",
-    "status": "CLOSED",
-    "project": "org.codehaus.sonar:sonar",
-    "userLogin": "fabrice.bellingard",
-    "deadLine": "2014-01-31T00:00:00+0100",
-    "fDeadLine": "Jan 31, 2014 12:00 AM",
-    "createdAt": "2013-12-11T08:35:23+0100",
-    "fCreatedAt": "Dec 11, 2013 8:35 AM",
-    "updatedAt": "2014-04-14T11:55:03+0200",
-    "fUpdatedAt": "Apr 14, 2014 11:55 AM"
-  },
-  {
-    "key": "39d06f0c-98c0-4a4f-956b-38ccbc9eb5c9",
-    "name": "4.4",
-    "status": "CLOSED",
-    "project": "org.codehaus.sonar:sonar",
-    "userLogin": "fabrice.bellingard",
-    "deadLine": "2014-06-27T00:00:00+0200",
-    "fDeadLine": "Jun 27, 2014 12:00 AM",
-    "createdAt": "2014-04-14T10:23:34+0200",
-    "fCreatedAt": "Apr 14, 2014 10:23 AM",
-    "updatedAt": "2014-07-11T16:56:06+0200",
-    "fUpdatedAt": "Jul 11, 2014 4:56 PM"
-  },
-  {
-    "key": "c3484f53-4bcf-4ae8-ad34-383480070950",
-    "name": "SonarQube 4.1",
-    "status": "CLOSED",
-    "project": "org.codehaus.sonar:sonar",
-    "userLogin": "freddy.mallet",
-    "deadLine": "2013-11-05T00:00:00+0100",
-    "fDeadLine": "Nov 5, 2013 12:00 AM",
-    "createdAt": "2013-10-22T12:39:01+0200",
-    "fCreatedAt": "Oct 22, 2013 12:39 PM",
-    "updatedAt": "2013-12-12T14:22:07+0100",
-    "fUpdatedAt": "Dec 12, 2013 2:22 PM"
-  }
-]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/resources-without-ncloc-data.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/resources-without-ncloc-data.json
deleted file mode 100644 (file)
index dfbacdf..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-[
-  {
-    "id": 19983,
-    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "name": "Cache.java",
-    "scope": "FIL",
-    "qualifier": "FIL",
-    "date": "2014-07-21T23:18:51+0200",
-    "creationDate": "2013-04-17T04:06:45+0200",
-    "lname": "src/main/java/org/sonar/batch/index/Cache.java",
-    "lang": "java",
-    "msr": [
-      {
-        "key": "lines",
-        "val": 519.0,
-        "frmt_val": "519"
-      },
-      {
-        "key": "ncloc",
-        "val": 379.0,
-        "frmt_val": "379"
-      },
-      {
-        "key": "classes",
-        "val": 6.0,
-        "frmt_val": "6"
-      },
-      {
-        "key": "functions",
-        "val": 56.0,
-        "frmt_val": "56"
-      },
-      {
-        "key": "accessors",
-        "val": 0.0,
-        "frmt_val": "0"
-      },
-      {
-        "key": "statements",
-        "val": 174.0,
-        "frmt_val": "174"
-      },
-      {
-        "key": "public_api",
-        "val": 33.0,
-        "frmt_val": "33"
-      },
-      {
-        "key": "comment_lines",
-        "val": 23.0,
-        "frmt_val": "23"
-      },
-      {
-        "key": "comment_lines_density",
-        "val": 5.7,
-        "frmt_val": "5.7%"
-      },
-      {
-        "key": "public_documented_api_density",
-        "val": 36.4,
-        "frmt_val": "36.4%"
-      },
-      {
-        "key": "public_undocumented_api",
-        "val": 21.0,
-        "frmt_val": "21"
-      },
-      {
-        "key": "complexity",
-        "val": 116.0,
-        "frmt_val": "116"
-      },
-      {
-        "key": "function_complexity",
-        "val": 2.1,
-        "frmt_val": "2.1"
-      },
-      {
-        "key": "coverage",
-        "val": 74.3,
-        "frmt_val": "74.3%"
-      },
-      {
-        "key": "lines_to_cover",
-        "val": 194.0,
-        "frmt_val": "194"
-      },
-      {
-        "key": "uncovered_lines",
-        "val": 50.0,
-        "frmt_val": "50"
-      },
-      {
-        "key": "line_coverage",
-        "val": 74.2,
-        "frmt_val": "74.2%"
-      },
-      {
-        "key": "conditions_to_cover",
-        "val": 16.0,
-        "frmt_val": "16"
-      },
-      {
-        "key": "uncovered_conditions",
-        "val": 4.0,
-        "frmt_val": "4"
-      },
-      {
-        "key": "branch_coverage",
-        "val": 75.0,
-        "frmt_val": "75.0%"
-      },
-      {
-        "key": "duplicated_lines",
-        "val": 30.0,
-        "frmt_val": "30"
-      },
-      {
-        "key": "duplicated_blocks",
-        "val": 2.0,
-        "frmt_val": "2"
-      },
-      {
-        "key": "duplicated_files",
-        "val": 1.0,
-        "frmt_val": "1"
-      },
-      {
-        "key": "duplicated_lines_density",
-        "val": 5.8,
-        "frmt_val": "5.8%"
-      },
-      {
-        "key": "major_violations",
-        "val": 1.0,
-        "frmt_val": "1"
-      },
-      {
-        "key": "minor_violations",
-        "val": 1.0,
-        "frmt_val": "1"
-      },
-      {
-        "key": "info_violations",
-        "val": 4.0,
-        "frmt_val": "4"
-      }
-    ]
-  }
-]
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/resources.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/resources.json
deleted file mode 100644 (file)
index 415718c..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-[
-  {
-    "id": 19983,
-    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
-    "name": "Cache.java",
-    "scope": "FIL",
-    "qualifier": "FIL",
-    "date": "2014-07-21T23:18:51+0200",
-    "creationDate": "2013-04-17T04:06:45+0200",
-    "lname": "src/main/java/org/sonar/batch/index/Cache.java",
-    "lang": "java",
-    "msr": [
-      {
-        "key": "lines",
-        "val": 519.0,
-        "frmt_val": "519"
-      },
-      {
-        "key": "ncloc",
-        "val": 379.0,
-        "frmt_val": "379"
-      },
-      {
-        "key": "classes",
-        "val": 6.0,
-        "frmt_val": "6"
-      },
-      {
-        "key": "functions",
-        "val": 56.0,
-        "frmt_val": "56"
-      },
-      {
-        "key": "accessors",
-        "val": 0.0,
-        "frmt_val": "0"
-      },
-      {
-        "key": "statements",
-        "val": 174.0,
-        "frmt_val": "174"
-      },
-      {
-        "key": "public_api",
-        "val": 33.0,
-        "frmt_val": "33"
-      },
-      {
-        "key": "comment_lines",
-        "val": 23.0,
-        "frmt_val": "23"
-      },
-      {
-        "key": "comment_lines_density",
-        "val": 5.7,
-        "frmt_val": "5.7%"
-      },
-      {
-        "key": "public_documented_api_density",
-        "val": 36.4,
-        "frmt_val": "36.4%"
-      },
-      {
-        "key": "public_undocumented_api",
-        "val": 21.0,
-        "frmt_val": "21"
-      },
-      {
-        "key": "complexity",
-        "val": 116.0,
-        "frmt_val": "116"
-      },
-      {
-        "key": "function_complexity",
-        "val": 2.1,
-        "frmt_val": "2.1"
-      },
-      {
-        "key": "coverage",
-        "val": 74.3,
-        "frmt_val": "74.3%"
-      },
-      {
-        "key": "lines_to_cover",
-        "val": 194.0,
-        "frmt_val": "194"
-      },
-      {
-        "key": "uncovered_lines",
-        "val": 50.0,
-        "frmt_val": "50"
-      },
-      {
-        "key": "line_coverage",
-        "val": 74.2,
-        "frmt_val": "74.2%"
-      },
-      {
-        "key": "conditions_to_cover",
-        "val": 16.0,
-        "frmt_val": "16"
-      },
-      {
-        "key": "uncovered_conditions",
-        "val": 4.0,
-        "frmt_val": "4"
-      },
-      {
-        "key": "branch_coverage",
-        "val": 75.0,
-        "frmt_val": "75.0%"
-      },
-      {
-        "key": "duplicated_lines",
-        "val": 30.0,
-        "frmt_val": "30"
-      },
-      {
-        "key": "duplicated_blocks",
-        "val": 2.0,
-        "frmt_val": "2"
-      },
-      {
-        "key": "duplicated_files",
-        "val": 1.0,
-        "frmt_val": "1"
-      },
-      {
-        "key": "duplicated_lines_density",
-        "val": 5.8,
-        "frmt_val": "5.8%"
-      },
-      {
-        "key": "major_violations",
-        "val": 1.0,
-        "frmt_val": "1"
-      },
-      {
-        "key": "minor_violations",
-        "val": 1.0,
-        "frmt_val": "1"
-      },
-      {
-        "key": "info_violations",
-        "val": 4.0,
-        "frmt_val": "4"
-      },
-      {
-        "key": "ncloc_data",
-        "data": "1=0;2=0;3=0;4=0;5=0;6=0;7=0;8=0;9=0;10=0;11=0;12=0;13=0;14=0;15=0;17=0;16=0;19=0;18=0;21=0;20=1;23=1;22=1;25=1;24=1;27=1;26=1;29=1;28=0;31=1;30=0;34=1;35=0;32=1;33=1;38=0;39=0;36=0;37=0;42=0;43=1;40=0;41=1;46=1;47=1;44=1;45=0;51=1;50=0;49=1;48=1;55=0;54=1;53=1;52=1;59=1;58=1;57=1;56=1;63=1;62=1;61=1;60=0;68=1;69=1;70=0;71=1;64=1;65=0;66=1;67=1;76=1;77=1;78=1;79=1;72=1;73=1;74=1;75=1;85=1;84=1;87=1;86=1;81=0;80=0;83=0;82=0;93=1;92=1;95=1;94=1;89=0;88=0;91=0;90=0;102=1;103=1;100=0;101=1;98=0;99=0;96=1;97=0;110=1;111=1;108=0;109=0;106=0;107=0;104=1;105=1;119=1;118=1;117=1;116=1;115=0;114=1;113=1;112=1;127=1;126=0;125=1;124=1;123=1;122=1;121=1;120=1;137=1;136=1;139=1;138=1;141=1;140=0;143=1;142=1;129=1;128=1;131=1;130=0;133=1;132=1;135=0;134=1;152=1;153=1;154=1;155=1;156=0;157=1;158=1;159=1;144=1;145=0;146=1;147=1;148=1;149=1;150=0;151=1;171=1;170=0;169=1;168=1;175=0;174=1;173=1;172=1;163=1;162=1;161=1;160=0;167=1;166=1;165=0;164=1;186=1;187=1;184=1;185=0;190=0;191=0;188=1;189=0;178=1;179=1;176=1;177=1;182=1;183=1;180=0;181=1;205=1;204=0;207=1;206=1;201=1;200=1;203=1;202=1;197=1;196=1;199=0;198=1;193=0;192=0;195=1;194=0;220=1;221=1;222=1;223=1;216=1;217=1;218=1;219=1;212=1;213=1;214=0;215=1;208=1;209=0;210=1;211=1;239=0;238=0;237=0;236=1;235=1;234=1;233=1;232=1;231=1;230=1;229=1;228=0;227=0;226=0;225=0;224=1;254=1;255=1;252=1;253=1;250=1;251=1;248=1;249=1;246=1;247=1;244=0;245=1;242=0;243=0;240=0;241=0;275=1;274=1;273=1;272=1;279=0;278=1;277=1;276=1;283=0;282=0;281=0;280=0;287=1;286=1;285=1;284=0;258=1;259=1;256=1;257=1;262=1;263=1;260=1;261=0;266=1;267=1;264=1;265=1;270=1;271=1;268=1;269=1;305=1;304=1;307=1;306=1;309=1;308=1;311=1;310=1;313=1;312=1;315=1;314=0;317=1;316=1;319=0;318=0;288=1;289=1;290=1;291=1;292=1;293=1;294=1;295=1;296=1;297=1;298=1;299=0;300=0;301=0;302=0;303=1;343=1;342=1;341=1;340=1;339=1;338=1;337=1;336=0;351=1;350=1;349=1;348=1;347=0;346=1;345=1;344=1;326=1;327=1;324=1;325=1;322=1;323=1;320=0;321=0;334=0;335=0;332=1;333=0;330=1;331=1;328=1;329=1;373=1;372=1;375=1;374=0;369=0;368=1;371=1;370=1;381=0;380=1;383=0;382=0;377=1;376=1;379=1;378=1;356=1;357=1;358=1;359=0;352=1;353=0;354=1;355=1;364=0;365=1;366=1;367=1;360=1;361=1;362=1;363=1;410=1;411=1;408=1;409=1;414=1;415=1;412=1;413=1;402=0;403=1;400=1;401=1;406=1;407=0;404=1;405=1;395=1;394=1;393=1;392=0;399=1;398=0;397=1;396=1;387=1;386=1;385=0;384=0;391=1;390=1;389=1;388=0;440=1;441=1;442=1;443=0;444=1;445=1;446=1;447=1;432=1;433=1;434=1;435=1;436=0;437=1;438=1;439=0;425=1;424=1;427=1;426=1;429=1;428=1;431=1;430=0;417=1;416=0;419=1;418=1;421=1;420=1;423=1;422=1;478=1;479=1;476=1;477=1;474=1;475=1;472=1;473=1;470=1;471=1;468=1;469=1;466=1;467=0;464=1;465=1;463=1;462=1;461=1;460=1;459=1;458=0;457=1;456=1;455=1;454=1;453=0;452=1;451=1;450=1;449=0;448=1;508=1;509=1;510=1;511=0;504=1;505=1;506=0;507=1;500=1;501=1;502=0;503=1;496=1;497=0;498=1;499=1;493=0;492=1;495=1;494=1;489=1;488=1;491=1;490=1;485=1;484=1;487=0;486=1;481=1;480=1;483=1;482=1;516=1;517=0;518=1;512=1;513=1;514=1;515=1"
-      }
-    ]
-  }
-]
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/scm.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/scm.json
deleted file mode 100644 (file)
index ff89c98..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-{"scm": [
-  [1, "simon.brandhof@gmail.com", "2013-04-16"],
-  [2, "simon.brandhof@gmail.com", "2013-04-21"],
-  [3, "simon.brandhof@gmail.com", "2014-03-11"],
-  [4, "simon.brandhof@gmail.com", "2013-04-16"],
-  [6, "simon.brandhof@gmail.com", "2013-04-21"],
-  [7, "simon.brandhof@gmail.com", "2013-04-16"],
-  [11, "simon.brandhof@gmail.com", "2013-04-21"],
-  [12, "simon.brandhof@gmail.com", "2013-04-16"],
-  [16, "simon.brandhof@gmail.com", "2013-04-22"],
-  [19, "simon.brandhof@gmail.com", "2013-04-16"],
-  [25, "julien.henry@sonarsource.com", "2014-05-01"],
-  [26, "simon.brandhof@gmail.com", "2013-04-17"],
-  [30, "julien.henry@sonarsource.com", "2014-04-30"],
-  [31, "simon.brandhof@gmail.com", "2013-04-16"],
-  [32, "simon.brandhof@gmail.com", "2013-04-17"],
-  [33, "julien.henry@sonarsource.com", "2014-05-01"],
-  [34, "simon.brandhof@gmail.com", "2013-04-16"],
-  [37, "simon.brandhof@gmail.com", "2013-04-17"],
-  [38, "simon.brandhof@gmail.com", "2013-04-16"],
-  [39, "simon.brandhof@gmail.com", "2013-04-17"],
-  [40, "simon.brandhof@gmail.com", "2013-04-16"],
-  [41, "simon.brandhof@gmail.com", "2014-02-20"],
-  [42, "simon.brandhof@gmail.com", "2013-04-16"],
-  [51, "julien.henry@sonarsource.com", "2014-05-01"],
-  [52, "simon.brandhof@gmail.com", "2014-02-20"],
-  [54, "simon.brandhof@gmail.com", "2013-04-16"],
-  [56, "julien.henry@sonarsource.com", "2014-05-01"],
-  [57, "simon.brandhof@gmail.com", "2014-02-20"],
-  [61, "julien.henry@sonarsource.com", "2014-05-01"],
-  [62, "simon.brandhof@gmail.com", "2014-02-20"],
-  [66, "julien.henry@sonarsource.com", "2014-05-01"],
-  [67, "simon.brandhof@gmail.com", "2014-02-20"],
-  [71, "julien.henry@sonarsource.com", "2014-05-01"],
-  [72, "simon.brandhof@gmail.com", "2013-04-16"],
-  [77, "simon.brandhof@gmail.com", "2013-05-29"],
-  [78, "simon.brandhof@gmail.com", "2013-04-16"],
-  [82, "simon.brandhof@gmail.com", "2014-02-20"],
-  [83, "simon.brandhof@gmail.com", "2013-04-16"],
-  [84, "simon.brandhof@gmail.com", "2014-02-20"],
-  [116, "julien.henry@sonarsource.com", "2014-05-01"],
-  [117, "simon.brandhof@gmail.com", "2014-02-20"],
-  [119, "simon.brandhof@gmail.com", "2013-04-16"],
-  [126, "simon.brandhof@gmail.com", "2013-10-10"],
-  [127, "simon.brandhof@gmail.com", "2013-05-29"],
-  [128, "simon.brandhof@gmail.com", "2013-04-16"],
-  [131, "simon.brandhof@gmail.com", "2014-02-20"],
-  [144, "simon.brandhof@gmail.com", "2013-04-16"],
-  [146, "simon.brandhof@gmail.com", "2014-02-20"],
-  [152, "simon.brandhof@gmail.com", "2013-10-10"],
-  [161, "simon.brandhof@gmail.com", "2014-02-20"],
-  [182, "simon.brandhof@gmail.com", "2013-04-16"],
-  [183, "simon.brandhof@gmail.com", "2013-04-26"],
-  [184, "simon.brandhof@gmail.com", "2013-04-16"],
-  [185, "simon.brandhof@gmail.com", "2013-10-10"],
-  [186, "simon.brandhof@gmail.com", "2013-05-29"],
-  [187, "simon.brandhof@gmail.com", "2013-04-16"],
-  [195, "julien.henry@sonarsource.com", "2014-05-01"],
-  [196, "simon.brandhof@gmail.com", "2014-02-20"],
-  [200, "julien.henry@sonarsource.com", "2014-05-01"],
-  [201, "simon.brandhof@gmail.com", "2014-02-20"],
-  [205, "julien.henry@sonarsource.com", "2014-05-01"],
-  [206, "simon.brandhof@gmail.com", "2014-02-20"],
-  [210, "julien.henry@sonarsource.com", "2014-05-01"],
-  [211, "simon.brandhof@gmail.com", "2014-02-20"],
-  [215, "julien.henry@sonarsource.com", "2014-05-01"],
-  [216, "simon.brandhof@gmail.com", "2013-04-16"],
-  [217, "simon.brandhof@gmail.com", "2014-02-20"],
-  [220, "simon.brandhof@gmail.com", "2013-04-16"],
-  [222, "simon.brandhof@gmail.com", "2014-02-20"],
-  [223, "simon.brandhof@gmail.com", "2013-04-16"],
-  [229, "simon.brandhof@gmail.com", "2014-02-20"],
-  [230, "simon.brandhof@gmail.com", "2013-04-16"],
-  [245, "julien.henry@sonarsource.com", "2014-05-01"],
-  [246, "simon.brandhof@gmail.com", "2014-02-20"],
-  [247, "simon.brandhof@gmail.com", "2013-04-16"],
-  [248, "simon.brandhof@gmail.com", "2014-02-20"],
-  [249, "simon.brandhof@gmail.com", "2013-04-16"],
-  [251, "simon.brandhof@gmail.com", "2014-02-20"],
-  [252, "simon.brandhof@gmail.com", "2013-04-16"],
-  [254, "simon.brandhof@gmail.com", "2014-02-20"],
-  [255, "simon.brandhof@gmail.com", "2013-04-16"],
-  [258, "simon.brandhof@gmail.com", "2013-05-29"],
-  [259, "simon.brandhof@gmail.com", "2013-04-16"],
-  [262, "julien.henry@sonarsource.com", "2014-05-01"],
-  [263, "simon.brandhof@gmail.com", "2014-02-20"],
-  [279, "simon.brandhof@gmail.com", "2013-04-16"],
-  [285, "simon.brandhof@gmail.com", "2014-02-20"],
-  [298, "simon.brandhof@gmail.com", "2013-04-16"],
-  [300, "simon.brandhof@gmail.com", "2013-05-29"],
-  [301, "julien.henry@sonarsource.com", "2014-04-30"],
-  [308, "julien.henry@sonarsource.com", "2014-05-01"],
-  [310, "julien.henry@sonarsource.com", "2014-04-30"],
-  [311, "julien.henry@sonarsource.com", "2014-06-20"],
-  [312, "julien.henry@sonarsource.com", "2014-04-30"],
-  [315, "julien.henry@sonarsource.com", "2014-06-20"],
-  [319, "julien.henry@sonarsource.com", "2014-04-30"],
-  [320, "simon.brandhof@gmail.com", "2014-02-20"],
-  [321, "simon.brandhof@gmail.com", "2013-05-29"],
-  [322, "julien.henry@sonarsource.com", "2014-05-01"],
-  [323, "simon.brandhof@gmail.com", "2013-04-16"],
-  [325, "julien.henry@sonarsource.com", "2014-05-01"],
-  [326, "simon.brandhof@gmail.com", "2013-04-16"],
-  [327, "julien.henry@sonarsource.com", "2014-05-01"],
-  [329, "simon.brandhof@gmail.com", "2013-04-16"],
-  [330, "julien.henry@sonarsource.com", "2014-06-20"],
-  [331, "simon.brandhof@gmail.com", "2013-04-16"],
-  [334, "simon.brandhof@gmail.com", "2013-05-29"],
-  [337, "simon.brandhof@gmail.com", "2013-04-16"],
-  [339, "simon.brandhof@gmail.com", "2014-02-20"],
-  [340, "simon.brandhof@gmail.com", "2013-04-16"],
-  [341, "julien.henry@sonarsource.com", "2014-05-01"],
-  [343, "simon.brandhof@gmail.com", "2013-04-16"],
-  [344, "julien.henry@sonarsource.com", "2014-06-20"],
-  [345, "simon.brandhof@gmail.com", "2013-04-16"],
-  [347, "simon.brandhof@gmail.com", "2013-04-17"],
-  [348, "simon.brandhof@gmail.com", "2014-02-20"],
-  [350, "julien.henry@sonarsource.com", "2014-05-01"],
-  [352, "simon.brandhof@gmail.com", "2013-04-17"],
-  [353, "simon.brandhof@gmail.com", "2014-02-20"],
-  [354, "julien.henry@sonarsource.com", "2014-05-01"],
-  [358, "simon.brandhof@gmail.com", "2013-04-17"],
-  [359, "simon.brandhof@gmail.com", "2014-02-20"],
-  [363, "simon.brandhof@gmail.com", "2013-04-17"],
-  [365, "simon.brandhof@gmail.com", "2014-02-20"],
-  [368, "simon.brandhof@gmail.com", "2013-04-17"],
-  [370, "simon.brandhof@gmail.com", "2014-02-20"],
-  [380, "simon.brandhof@gmail.com", "2013-04-17"],
-  [382, "simon.brandhof@gmail.com", "2013-05-29"],
-  [389, "julien.henry@sonarsource.com", "2014-05-01"],
-  [391, "simon.brandhof@gmail.com", "2013-05-29"],
-  [401, "julien.henry@sonarsource.com", "2014-05-01"],
-  [402, "simon.brandhof@gmail.com", "2013-05-29"],
-  [403, "julien.henry@sonarsource.com", "2014-05-01"],
-  [404, "simon.brandhof@gmail.com", "2013-05-29"],
-  [405, "julien.henry@sonarsource.com", "2014-05-01"],
-  [406, "simon.brandhof@gmail.com", "2013-05-29"],
-  [411, "julien.henry@sonarsource.com", "2014-05-01"],
-  [412, "simon.brandhof@gmail.com", "2013-05-29"],
-  [417, "julien.henry@sonarsource.com", "2014-05-01"],
-  [418, "simon.brandhof@gmail.com", "2013-05-29"],
-  [420, "simon.brandhof@gmail.com", "2014-02-20"],
-  [421, "julien.henry@sonarsource.com", "2014-05-01"],
-  [422, "simon.brandhof@gmail.com", "2014-02-20"],
-  [425, "simon.brandhof@gmail.com", "2013-05-29"],
-  [426, "julien.henry@sonarsource.com", "2014-05-01"],
-  [427, "simon.brandhof@gmail.com", "2013-05-29"],
-  [428, "julien.henry@sonarsource.com", "2014-05-01"],
-  [429, "simon.brandhof@gmail.com", "2013-05-29"],
-  [433, "simon.brandhof@gmail.com", "2014-02-24"],
-  [434, "simon.brandhof@gmail.com", "2013-05-29"],
-  [437, "simon.brandhof@gmail.com", "2013-04-17"],
-  [440, "julien.henry@sonarsource.com", "2014-05-01"],
-  [442, "simon.brandhof@gmail.com", "2013-04-17"],
-  [452, "julien.henry@sonarsource.com", "2014-05-01"],
-  [453, "simon.brandhof@gmail.com", "2013-04-17"],
-  [454, "julien.henry@sonarsource.com", "2014-05-01"],
-  [455, "simon.brandhof@gmail.com", "2013-04-17"],
-  [456, "julien.henry@sonarsource.com", "2014-05-01"],
-  [457, "simon.brandhof@gmail.com", "2013-04-17"],
-  [462, "julien.henry@sonarsource.com", "2014-05-01"],
-  [463, "simon.brandhof@gmail.com", "2013-04-17"],
-  [468, "julien.henry@sonarsource.com", "2014-05-01"],
-  [469, "simon.brandhof@gmail.com", "2013-04-17"],
-  [470, "julien.henry@sonarsource.com", "2014-05-01"],
-  [475, "simon.brandhof@gmail.com", "2013-04-17"],
-  [476, "julien.henry@sonarsource.com", "2014-05-01"],
-  [478, "simon.brandhof@gmail.com", "2013-04-17"],
-  [479, "simon.brandhof@gmail.com", "2014-02-20"],
-  [483, "julien.henry@sonarsource.com", "2014-05-01"],
-  [486, "simon.brandhof@gmail.com", "2013-04-17"],
-  [490, "simon.brandhof@gmail.com", "2014-02-24"],
-  [491, "simon.brandhof@gmail.com", "2013-04-17"],
-  [494, "simon.brandhof@gmail.com", "2014-02-20"],
-  [497, "simon.brandhof@gmail.com", "2013-04-17"],
-  [498, "simon.brandhof@gmail.com", "2014-02-20"],
-  [499, "simon.brandhof@gmail.com", "2013-04-17"],
-  [503, "simon.brandhof@gmail.com", "2014-02-20"],
-  [504, "simon.brandhof@gmail.com", "2013-04-17"],
-  [508, "simon.brandhof@gmail.com", "2014-02-20"],
-  [509, "simon.brandhof@gmail.com", "2013-04-17"],
-  [517, "julien.henry@sonarsource.com", "2014-05-06"],
-  [518, "simon.brandhof@gmail.com", "2013-04-16"]
-]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/source.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/source.json
deleted file mode 100644 (file)
index 1b32224..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-{"sources": [
-  [1, "<span class=\"cppd\">/*</span>"],
-  [2, "<span class=\"cppd\"> * SonarQube, open source software quality management tool.</span>"],
-  [3, "<span class=\"cppd\"> * Copyright (C) 2008-2014 SonarSource</span>"],
-  [4, "<span class=\"cppd\"> * mailto:contact AT sonarsource DOT com</span>"],
-  [5, "<span class=\"cppd\"> *</span>"],
-  [6, "<span class=\"cppd\"> * SonarQube is free software; you can redistribute it and/or</span>"],
-  [7, "<span class=\"cppd\"> * modify it under the terms of the GNU Lesser General Public</span>"],
-  [8, "<span class=\"cppd\"> * License as published by the Free Software Foundation; either</span>"],
-  [9, "<span class=\"cppd\"> * version 3 of the License, or (at your option) any later version.</span>"],
-  [10, "<span class=\"cppd\"> *</span>"],
-  [11, "<span class=\"cppd\"> * SonarQube is distributed in the hope that it will be useful,</span>"],
-  [12, "<span class=\"cppd\"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>"],
-  [13, "<span class=\"cppd\"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>"],
-  [14, "<span class=\"cppd\"> * Lesser General Public License for more details.</span>"],
-  [15, "<span class=\"cppd\"> *</span>"],
-  [16, "<span class=\"cppd\"> * You should have received a copy of the GNU Lesser General Public License</span>"],
-  [17, "<span class=\"cppd\"> * along with this program; if not, write to the Free Software Foundation,</span>"],
-  [18, "<span class=\"cppd\"> * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span>"],
-  [19, "<span class=\"cppd\"> */</span>"],
-  [20, "<span class=\"k\">package </span>org.sonar.batch.index;"],
-  [21, ""],
-  [22, "<span class=\"k\">import </span>com.google.common.collect.<span class=\"sym-949 sym\">Sets</span>;"],
-  [23, "<span class=\"k\">import </span>com.persistit.<span class=\"sym-976 sym\">Exchange</span>;"],
-  [24, "<span class=\"k\">import </span>com.persistit.<span class=\"sym-1007 sym\">Key</span>;"],
-  [25, "<span class=\"k\">import </span>com.persistit.<span class=\"sym-1033 sym\">KeyFilter</span>;"],
-  [26, "<span class=\"k\">import </span>com.persistit.exception.<span class=\"sym-1075 sym\">PersistitException</span>;"],
-  [27, "<span class=\"k\">import </span>org.apache.commons.lang.builder.<span class=\"sym-1134 sym\">ToStringBuilder</span>;"],
-  [28, ""],
-  [29, "<span class=\"k\">import </span>javax.annotation.<span class=\"sym-1176 sym\">CheckForNull</span>;"],
-  [30, ""],
-  [31, "<span class=\"k\">import </span>java.io.<span class=\"sym-1206 sym\">Serializable</span>;"],
-  [32, "<span class=\"k\">import </span>java.util.<span class=\"sym-1237 sym\">Iterator</span>;"],
-  [33, "<span class=\"k\">import </span>java.util.<span class=\"sym-1264 sym\">NoSuchElementException</span>;"],
-  [34, "<span class=\"k\">import </span>java.util.<span class=\"sym-1305 sym\">Set</span>;"],
-  [35, ""],
-  [36, "<span class=\"cppd\">/**</span>"],
-  [37, "<span class=\"cppd\"> * &lt;p&gt;</span>"],
-  [38, "<span class=\"cppd\"> * This cache is not thread-safe, due to direct usage of {@link com.persistit.Exchange}</span>"],
-  [39, "<span class=\"cppd\"> * &lt;/p&gt;</span>"],
-  [40, "<span class=\"cppd\"> */</span>"],
-  [41, "<span class=\"k\">public </span><span class=\"k\">class </span><span class=\"sym-1435 sym\">Cache</span>&lt;V <span class=\"k\">extends </span>Serializable&gt; {"],
-  [42, ""],
-  [43, "  <span class=\"k\">private </span><span class=\"k\">final </span>String <span class=\"sym-1491 sym\">name</span>;"],
-  [44, "  <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-1522 sym\">exchange</span>;"],
-  [45, ""],
-  [46, "  <span class=\"sym-1535 sym\">Cache</span>(String <span class=\"sym-1548 sym\">name</span>, <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-1563 sym\">exchange</span>) {"],
-  [47, "    <span class=\"k\">this</span>.<span class=\"sym-1491 sym\">name</span> = <span class=\"sym-1548 sym\">name</span>;"],
-  [48, "    <span class=\"k\">this</span>.<span class=\"sym-1522 sym\">exchange</span> = <span class=\"sym-1563 sym\">exchange</span>;"],
-  [49, "  }"],
-  [50, ""],
-  [51, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-1650 sym\">put</span>(Object <span class=\"sym-1661 sym\">key</span>, V <span class=\"sym-1668 sym\">value</span>) {"],
-  [52, "    resetKey(<span class=\"sym-1661 sym\">key</span>);"],
-  [53, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-1668 sym\">value</span>);"],
-  [54, "  }"],
-  [55, ""],
-  [56, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-1744 sym\">put</span>(Object <span class=\"sym-1755 sym\">firstKey</span>, Object <span class=\"sym-1772 sym\">secondKey</span>, V <span class=\"sym-1785 sym\">value</span>) {"],
-  [57, "    resetKey(<span class=\"sym-1755 sym\">firstKey</span>, <span class=\"sym-1772 sym\">secondKey</span>);"],
-  [58, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-1785 sym\">value</span>);"],
-  [59, "  }"],
-  [60, ""],
-  [61, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-1877 sym\">put</span>(Object <span class=\"sym-1888 sym\">firstKey</span>, Object <span class=\"sym-1905 sym\">secondKey</span>, Object <span class=\"sym-1923 sym\">thirdKey</span>, V <span class=\"sym-1935 sym\">value</span>) {"],
-  [62, "    resetKey(<span class=\"sym-1888 sym\">firstKey</span>, <span class=\"sym-1905 sym\">secondKey</span>, <span class=\"sym-1923 sym\">thirdKey</span>);"],
-  [63, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-1935 sym\">value</span>);"],
-  [64, "  }"],
-  [65, ""],
-  [66, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-2037 sym\">put</span>(Object[] <span class=\"sym-2050 sym\">key</span>, V <span class=\"sym-2057 sym\">value</span>) {"],
-  [67, "    resetKey(<span class=\"sym-2050 sym\">key</span>);"],
-  [68, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-2057 sym\">value</span>);"],
-  [69, "  }"],
-  [70, ""],
-  [71, "  <span class=\"k\">private </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-2134 sym\">doPut</span>(V <span class=\"sym-2142 sym\">value</span>) {"],
-  [72, "    <span class=\"k\">try </span>{"],
-  [73, "      <span class=\"sym-1522 sym\">exchange</span>.getValue().put(<span class=\"sym-2142 sym\">value</span>);"],
-  [74, "      <span class=\"sym-1522 sym\">exchange</span>.store();"],
-  [75, "      <span class=\"k\">return </span><span class=\"k\">this</span>;"],
-  [76, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-2265 sym\">e</span>) {"],
-  [77, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to put element in the cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-2265 sym\">e</span>);"],
-  [78, "    }"],
-  [79, "  }"],
-  [80, ""],
-  [81, "  <span class=\"cppd\">/**</span>"],
-  [82, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
-  [83, "<span class=\"cppd\">   */</span>"],
-  [84, "  <span class=\"k\">public </span>V <span class=\"sym-2464 sym\">get</span>(Object <span class=\"sym-2475 sym\">key</span>) {"],
-  [85, "    resetKey(<span class=\"sym-2475 sym\">key</span>);"],
-  [86, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
-  [87, "  }"],
-  [88, ""],
-  [89, "  <span class=\"cppd\">/**</span>"],
-  [90, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
-  [91, "<span class=\"cppd\">   */</span>"],
-  [92, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
-  [93, "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-2639 sym\">get</span>(Object <span class=\"sym-2650 sym\">firstKey</span>, Object <span class=\"sym-2667 sym\">secondKey</span>) {"],
-  [94, "    resetKey(<span class=\"sym-2650 sym\">firstKey</span>, <span class=\"sym-2667 sym\">secondKey</span>);"],
-  [95, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
-  [96, "  }"],
-  [97, ""],
-  [98, "  <span class=\"cppd\">/**</span>"],
-  [99, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
-  [100, "<span class=\"cppd\">   */</span>"],
-  [101, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
-  [102, "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-2853 sym\">get</span>(Object <span class=\"sym-2864 sym\">firstKey</span>, Object <span class=\"sym-2881 sym\">secondKey</span>, Object <span class=\"sym-2899 sym\">thirdKey</span>) {"],
-  [103, "    resetKey(<span class=\"sym-2864 sym\">firstKey</span>, <span class=\"sym-2881 sym\">secondKey</span>, <span class=\"sym-2899 sym\">thirdKey</span>);"],
-  [104, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
-  [105, "  }"],
-  [106, ""],
-  [107, "  <span class=\"cppd\">/**</span>"],
-  [108, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
-  [109, "<span class=\"cppd\">   */</span>"],
-  [110, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
-  [111, "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-3094 sym\">get</span>(Object[] <span class=\"sym-3107 sym\">key</span>) {"],
-  [112, "    resetKey(<span class=\"sym-3107 sym\">key</span>);"],
-  [113, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
-  [114, "  }"],
-  [115, ""],
-  [116, "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)"],
-  [117, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
-  [118, "<span class=\"a\">  </span><span class=\"k\">private </span>V <span class=\"sym-3219 sym\">doGet</span>() {"],
-  [119, "    <span class=\"k\">try </span>{"],
-  [120, "      <span class=\"sym-1522 sym\">exchange</span>.fetch();"],
-  [121, "      <span class=\"k\">if </span>(!<span class=\"sym-1522 sym\">exchange</span>.getValue().isDefined()) {"],
-  [122, "        <span class=\"k\">return </span><span class=\"k\">null</span>;"],
-  [123, "      }"],
-  [124, "      <span class=\"k\">return </span>(V) <span class=\"sym-1522 sym\">exchange</span>.getValue().get();"],
-  [125, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-3405 sym\">e</span>) {"],
-  [126, "      <span class=\"cppd\">// TODO add parameters to message</span>"],
-  [127, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get element from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-3405 sym\">e</span>);"],
-  [128, "    }"],
-  [129, "  }"],
-  [130, ""],
-  [131, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3562 sym\">containsKey</span>(Object <span class=\"sym-3581 sym\">key</span>) {"],
-  [132, "    resetKey(<span class=\"sym-3581 sym\">key</span>);"],
-  [133, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
-  [134, "  }"],
-  [135, ""],
-  [136, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3657 sym\">containsKey</span>(Object <span class=\"sym-3676 sym\">firstKey</span>, Object <span class=\"sym-3693 sym\">secondKey</span>) {"],
-  [137, "    resetKey(<span class=\"sym-3676 sym\">firstKey</span>, <span class=\"sym-3693 sym\">secondKey</span>);"],
-  [138, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
-  [139, "  }"],
-  [140, ""],
-  [141, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3791 sym\">containsKey</span>(Object <span class=\"sym-3810 sym\">firstKey</span>, Object <span class=\"sym-3827 sym\">secondKey</span>, Object <span class=\"sym-3845 sym\">thirdKey</span>) {"],
-  [142, "    resetKey(<span class=\"sym-3810 sym\">firstKey</span>, <span class=\"sym-3827 sym\">secondKey</span>, <span class=\"sym-3845 sym\">thirdKey</span>);"],
-  [143, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
-  [144, "  }"],
-  [145, ""],
-  [146, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3952 sym\">containsKey</span>(Object[] <span class=\"sym-3973 sym\">key</span>) {"],
-  [147, "    resetKey(<span class=\"sym-3973 sym\">key</span>);"],
-  [148, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
-  [149, "  }"],
-  [150, ""],
-  [151, "  <span class=\"k\">private </span><span class=\"k\">boolean </span><span class=\"sym-4050 sym\">doContainsKey</span>() {"],
-  [152, "    <span class=\"k\">try </span>{"],
-  [153, "      <span class=\"sym-1522 sym\">exchange</span>.fetch();"],
-  [154, "      <span class=\"k\">return </span><span class=\"sym-1522 sym\">exchange</span>.isValueDefined();"],
-  [155, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-4165 sym\">e</span>) {"],
-  [156, "      <span class=\"cppd\">// TODO add parameters to message</span>"],
-  [157, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to check if element is in cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-4165 sym\">e</span>);"],
-  [158, "    }"],
-  [159, "  }"],
-  [160, ""],
-  [161, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4328 sym\">remove</span>(Object <span class=\"sym-4342 sym\">key</span>) {"],
-  [162, "    resetKey(<span class=\"sym-4342 sym\">key</span>);"],
-  [163, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
-  [164, "  }"],
-  [165, ""],
-  [166, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4413 sym\">remove</span>(Object <span class=\"sym-4427 sym\">firstKey</span>, Object <span class=\"sym-4444 sym\">secondKey</span>) {"],
-  [167, "    resetKey(<span class=\"sym-4427 sym\">firstKey</span>, <span class=\"sym-4444 sym\">secondKey</span>);"],
-  [168, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
-  [169, "  }"],
-  [170, ""],
-  [171, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4537 sym\">remove</span>(Object <span class=\"sym-4551 sym\">firstKey</span>, Object <span class=\"sym-4568 sym\">secondKey</span>, Object <span class=\"sym-4586 sym\">thirdKey</span>) {"],
-  [172, "    resetKey(<span class=\"sym-4551 sym\">firstKey</span>, <span class=\"sym-4568 sym\">secondKey</span>, <span class=\"sym-4586 sym\">thirdKey</span>);"],
-  [173, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
-  [174, "  }"],
-  [175, ""],
-  [176, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4688 sym\">remove</span>(Object[] <span class=\"sym-4704 sym\">key</span>) {"],
-  [177, "    resetKey(<span class=\"sym-4704 sym\">key</span>);"],
-  [178, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
-  [179, "  }"],
-  [180, ""],
-  [181, "  <span class=\"k\">private </span><span class=\"k\">boolean </span><span class=\"sym-4776 sym\">doRemove</span>() {"],
-  [182, "    <span class=\"k\">try </span>{"],
-  [183, "      <span class=\"k\">return </span><span class=\"sym-1522 sym\">exchange</span>.remove();"],
-  [184, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-4854 sym\">e</span>) {"],
-  [185, "      <span class=\"cppd\">// TODO add parameters to message</span>"],
-  [186, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get element from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-4854 sym\">e</span>);"],
-  [187, "    }"],
-  [188, "  }"],
-  [189, ""],
-  [190, "  <span class=\"cppd\">/**</span>"],
-  [191, "<span class=\"cppd\">   * Removes everything in the specified group.</span>"],
-  [192, "<span class=\"cppd\">   *</span>"],
-  [193, "<span class=\"cppd\">   * @param group The group name.</span>"],
-  [194, "<span class=\"cppd\">   */</span>"],
-  [195, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5111 sym\">clear</span>(Object <span class=\"sym-5124 sym\">key</span>) {"],
-  [196, "    resetKey(<span class=\"sym-5124 sym\">key</span>);"],
-  [197, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
-  [198, "  }"],
-  [199, ""],
-  [200, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5195 sym\">clear</span>(Object <span class=\"sym-5208 sym\">firstKey</span>, Object <span class=\"sym-5225 sym\">secondKey</span>) {"],
-  [201, "    resetKey(<span class=\"sym-5208 sym\">firstKey</span>, <span class=\"sym-5225 sym\">secondKey</span>);"],
-  [202, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
-  [203, "  }"],
-  [204, ""],
-  [205, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5318 sym\">clear</span>(Object <span class=\"sym-5331 sym\">firstKey</span>, Object <span class=\"sym-5348 sym\">secondKey</span>, Object <span class=\"sym-5366 sym\">thirdKey</span>) {"],
-  [206, "    resetKey(<span class=\"sym-5331 sym\">firstKey</span>, <span class=\"sym-5348 sym\">secondKey</span>, <span class=\"sym-5366 sym\">thirdKey</span>);"],
-  [207, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
-  [208, "  }"],
-  [209, ""],
-  [210, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5468 sym\">clear</span>(Object[] <span class=\"sym-5483 sym\">key</span>) {"],
-  [211, "    resetKey(<span class=\"sym-5483 sym\">key</span>);"],
-  [212, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
-  [213, "  }"],
-  [214, ""],
-  [215, "  <span class=\"k\">private </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5555 sym\">doClear</span>() {"],
-  [216, "    <span class=\"k\">try </span>{"],
-  [217, "      <span class=\"sym-1007 sym\">Key</span> <span class=\"sym-5587 sym\">to</span> = <span class=\"k\">new </span><span class=\"sym-1007 sym\">Key</span>(<span class=\"sym-1522 sym\">exchange</span>.getKey());"],
-  [218, "      <span class=\"sym-5587 sym\">to</span>.append(<span class=\"sym-1007 sym\">Key</span>.AFTER);"],
-  [219, "      <span class=\"sym-1522 sym\">exchange</span>.removeKeyRange(<span class=\"sym-1522 sym\">exchange</span>.getKey(), <span class=\"sym-5587 sym\">to</span>);"],
-  [220, "      <span class=\"k\">return </span><span class=\"k\">this</span>;"],
-  [221, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-5744 sym\">e</span>) {"],
-  [222, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to clear values from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-5744 sym\">e</span>);"],
-  [223, "    }"],
-  [224, "  }"],
-  [225, ""],
-  [226, "  <span class=\"cppd\">/**</span>"],
-  [227, "<span class=\"cppd\">   * Clears the default as well as all group caches.</span>"],
-  [228, "<span class=\"cppd\">   */</span>"],
-  [229, "  <span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-5924 sym\">clear</span>() {"],
-  [230, "    <span class=\"k\">try </span>{"],
-  [231, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [232, "      <span class=\"sym-1522 sym\">exchange</span>.removeAll();"],
-  [233, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-6019 sym\">e</span>) {"],
-  [234, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to clear cache\"</span>, <span class=\"sym-6019 sym\">e</span>);"],
-  [235, "    }"],
-  [236, "  }"],
-  [237, ""],
-  [238, "  <span class=\"cppd\">/**</span>"],
-  [239, "<span class=\"cppd\">   * Returns the set of cache keys associated with this group.</span>"],
-  [240, "<span class=\"cppd\">   * TODO implement a lazy-loading equivalent with Iterator/Iterable</span>"],
-  [241, "<span class=\"cppd\">   *</span>"],
-  [242, "<span class=\"cppd\">   * @param group The group.</span>"],
-  [243, "<span class=\"cppd\">   * @return The set of cache keys for this group.</span>"],
-  [244, "<span class=\"cppd\">   */</span>"],
-  [245, "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"rawtypes\"</span>)"],
-  [246, "  <span class=\"k\">public </span><span class=\"sym-1305 sym\">Set</span> <span class=\"sym-6374 sym\">keySet</span>(Object <span class=\"sym-6388 sym\">key</span>) {"],
-  [247, "    <span class=\"k\">try </span>{"],
-  [248, "      <span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-6423 sym\">keys</span> = <span class=\"sym-949 sym\">Sets</span>.newLinkedHashSet();"],
-  [249, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [250, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-6494 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
-  [251, "      <span class=\"sym-6494 sym\">iteratorExchange</span>.append(<span class=\"sym-6388 sym\">key</span>);"],
-  [252, "      <span class=\"sym-6494 sym\">iteratorExchange</span>.append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [253, "      <span class=\"k\">while </span>(<span class=\"sym-6494 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {"],
-  [254, "        <span class=\"sym-6423 sym\">keys</span>.add(<span class=\"sym-6494 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());"],
-  [255, "      }"],
-  [256, "      <span class=\"k\">return </span><span class=\"sym-6423 sym\">keys</span>;"],
-  [257, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-6777 sym\">e</span>) {"],
-  [258, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-6777 sym\">e</span>);"],
-  [259, "    }"],
-  [260, "  }"],
-  [261, ""],
-  [262, "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"rawtypes\"</span>)"],
-  [263, "  <span class=\"k\">public </span><span class=\"sym-1305 sym\">Set</span> <span class=\"sym-6919 sym\">keySet</span>(Object <span class=\"sym-6933 sym\">firstKey</span>, Object <span class=\"sym-6950 sym\">secondKey</span>) {"],
-  [264, "    <span class=\"k\">try </span>{"],
-  [265, "      <span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-6991 sym\">keys</span> = <span class=\"sym-949 sym\">Sets</span>.newLinkedHashSet();"],
-  [266, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [267, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-7062 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
-  [268, "      <span class=\"sym-7062 sym\">iteratorExchange</span>.append(<span class=\"sym-6933 sym\">firstKey</span>);"],
-  [269, "      <span class=\"sym-7062 sym\">iteratorExchange</span>.append(<span class=\"sym-6950 sym\">secondKey</span>);"],
-  [270, "      <span class=\"sym-7062 sym\">iteratorExchange</span>.append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [271, "      <span class=\"k\">while </span>(<span class=\"sym-7062 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {"],
-  [272, "        <span class=\"sym-6991 sym\">keys</span>.add(<span class=\"sym-7062 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());"],
-  [273, "      }"],
-  [274, "      <span class=\"k\">return </span><span class=\"sym-6991 sym\">keys</span>;"],
-  [275, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-7392 sym\">e</span>) {"],
-  [276, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-7392 sym\">e</span>);"],
-  [277, "    }"],
-  [278, "  }"],
-  [279, ""],
-  [280, "  <span class=\"cppd\">/**</span>"],
-  [281, "<span class=\"cppd\">   * Returns the set of keys associated with this cache.</span>"],
-  [282, "<span class=\"cppd\">   *</span>"],
-  [283, "<span class=\"cppd\">   * @return The set containing the keys for this cache.</span>"],
-  [284, "<span class=\"cppd\">   */</span>"],
-  [285, "  <span class=\"k\">public </span><span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-7641 sym\">keySet</span>() {"],
-  [286, "    <span class=\"k\">try </span>{"],
-  [287, "      <span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-7680 sym\">keys</span> = <span class=\"sym-949 sym\">Sets</span>.newLinkedHashSet();"],
-  [288, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [289, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-7751 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
-  [290, "      <span class=\"sym-7751 sym\">iteratorExchange</span>.append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [291, "      <span class=\"k\">while </span>(<span class=\"sym-7751 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {"],
-  [292, "        <span class=\"sym-7680 sym\">keys</span>.add(<span class=\"sym-7751 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());"],
-  [293, "      }"],
-  [294, "      <span class=\"k\">return </span><span class=\"sym-7680 sym\">keys</span>;"],
-  [295, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-7998 sym\">e</span>) {"],
-  [296, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-7998 sym\">e</span>);"],
-  [297, "    }"],
-  [298, "  }"],
-  [299, ""],
-  [300, "  <span class=\"cppd\">/**</span>"],
-  [301, "<span class=\"cppd\">   * Lazy-loading values for given keys</span>"],
-  [302, "<span class=\"cppd\">   */</span>"],
-  [303, "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-8168 sym\">values</span>(Object <span class=\"sym-8182 sym\">firstKey</span>, Object <span class=\"sym-8199 sym\">secondKey</span>) {"],
-  [304, "    <span class=\"k\">try </span>{"],
-  [305, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [306, "      <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-8182 sym\">firstKey</span>).append(<span class=\"sym-8199 sym\">secondKey</span>).append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [307, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-8331 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
-  [308, "      <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-8390 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-8182 sym\">firstKey</span>)).append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-8199 sym\">secondKey</span>));"],
-  [309, "      <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-8331 sym\">iteratorExchange</span>, <span class=\"sym-8390 sym\">filter</span>);"],
-  [310, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-8579 sym\">e</span>) {"],
-  [311, "      <span class=\"k\">throw </span><span class=\"sym-8659 sym\">failToGetValues</span>(<span class=\"sym-8579 sym\">e</span>);"],
-  [312, "    }"],
-  [313, "  }"],
-  [314, ""],
-  [315, "  <span class=\"k\">private </span>IllegalStateException <span class=\"sym-8659 sym\">failToGetValues</span>(Exception <span class=\"sym-8685 sym\">e</span>) {"],
-  [316, "    <span class=\"k\">return </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get values from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-8685 sym\">e</span>);"],
-  [317, "  }"],
-  [318, ""],
-  [319, "  <span class=\"cppd\">/**</span>"],
-  [320, "<span class=\"cppd\">   * Lazy-loading values for a given key</span>"],
-  [321, "<span class=\"cppd\">   */</span>"],
-  [322, "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-8851 sym\">values</span>(Object <span class=\"sym-8865 sym\">firstKey</span>) {"],
-  [323, "    <span class=\"k\">try </span>{"],
-  [324, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [325, "      <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-8865 sym\">firstKey</span>).append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [326, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-8978 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
-  [327, "      <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9037 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-8865 sym\">firstKey</span>));"],
-  [328, "      <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-8978 sym\">iteratorExchange</span>, <span class=\"sym-9037 sym\">filter</span>);"],
-  [329, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-9186 sym\">e</span>) {"],
-  [330, "      <span class=\"k\">throw </span><span class=\"sym-8659 sym\">failToGetValues</span>(<span class=\"sym-9186 sym\">e</span>);"],
-  [331, "    }"],
-  [332, "  }"],
-  [333, ""],
-  [334, "  <span class=\"cppd\">/**</span>"],
-  [335, "<span class=\"cppd\">   * Lazy-loading values</span>"],
-  [336, "<span class=\"cppd\">   */</span>"],
-  [337, "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-9292 sym\">values</span>() {"],
-  [338, "    <span class=\"k\">try </span>{"],
-  [339, "      <span class=\"sym-1522 sym\">exchange</span>.clear().append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [340, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-9371 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
-  [341, "      <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9430 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.ALL);"],
-  [342, "      <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-9371 sym\">iteratorExchange</span>, <span class=\"sym-9430 sym\">filter</span>);"],
-  [343, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-9562 sym\">e</span>) {"],
-  [344, "      <span class=\"k\">throw </span><span class=\"sym-8659 sym\">failToGetValues</span>(<span class=\"sym-9562 sym\">e</span>);"],
-  [345, "    }"],
-  [346, "  }"],
-  [347, ""],
-  [348, "  <span class=\"k\">public </span>Iterable&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;V&gt;&gt; <span class=\"sym-9638 sym\">entries</span>() {"],
-  [349, "    <span class=\"sym-1522 sym\">exchange</span>.clear().to(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [350, "    <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9701 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.ALL);"],
-  [351, "    <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-11992 sym\">EntryIterable</span>&lt;V&gt;(<span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>), <span class=\"sym-9701 sym\">filter</span>);"],
-  [352, "  }"],
-  [353, ""],
-  [354, "  <span class=\"k\">public </span>Iterable&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;V&gt;&gt; <span class=\"sym-9847 sym\">entries</span>(Object <span class=\"sym-9862 sym\">firstKey</span>) {"],
-  [355, "    <span class=\"sym-1522 sym\">exchange</span>.clear().append(<span class=\"sym-9862 sym\">firstKey</span>).append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
-  [356, "    <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9946 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-9862 sym\">firstKey</span>));"],
-  [357, "    <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-11992 sym\">EntryIterable</span>&lt;V&gt;(<span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>), <span class=\"sym-9946 sym\">filter</span>);"],
-  [358, "  }"],
-  [359, ""],
-  [360, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10096 sym\">resetKey</span>(Object <span class=\"sym-10112 sym\">key</span>) {"],
-  [361, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [362, "    <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10112 sym\">key</span>);"],
-  [363, "  }"],
-  [364, ""],
-  [365, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10187 sym\">resetKey</span>(Object <span class=\"sym-10203 sym\">first</span>, Object <span class=\"sym-10217 sym\">second</span>) {"],
-  [366, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [367, "    <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10203 sym\">first</span>).append(<span class=\"sym-10217 sym\">second</span>);"],
-  [368, "  }"],
-  [369, ""],
-  [370, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10312 sym\">resetKey</span>(Object <span class=\"sym-10328 sym\">first</span>, Object <span class=\"sym-10342 sym\">second</span>, Object <span class=\"sym-10357 sym\">third</span>) {"],
-  [371, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [372, "    <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10328 sym\">first</span>).append(<span class=\"sym-10342 sym\">second</span>).append(<span class=\"sym-10357 sym\">third</span>);"],
-  [373, "  }"],
-  [374, ""],
-  [375, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10465 sym\">resetKey</span>(Object[] <span class=\"sym-10483 sym\">keys</span>) {"],
-  [376, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
-  [377, "    <span class=\"k\">for </span>(Object <span class=\"sym-10529 sym\">o</span> : <span class=\"sym-10483 sym\">keys</span>) {"],
-  [378, "      <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10529 sym\">o</span>);"],
-  [379, "    }"],
-  [380, "  }"],
-  [381, ""],
-  [382, "  <span class=\"cppd\">//</span>"],
-  [383, "  <span class=\"cppd\">// LAZY ITERATORS AND ITERABLES</span>"],
-  [384, "  <span class=\"cppd\">//</span>"],
-  [385, ""],
-  [386, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span>Iterable&lt;T&gt; {"],
-  [387, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-1237 sym\">Iterator</span>&lt;T&gt; <span class=\"sym-10739 sym\">iterator</span>;"],
-  [388, ""],
-  [389, "    <span class=\"k\">private </span><span class=\"sym-10762 sym\">ValueIterable</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-10785 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-10805 sym\">keyFilter</span>) {"],
-  [390, "      <span class=\"k\">this</span>.<span class=\"sym-10739 sym\">iterator</span> = <span class=\"k\">new </span><span class=\"sym-10997 sym\">ValueIterator</span>&lt;T&gt;(<span class=\"sym-10785 sym\">exchange</span>, <span class=\"sym-10805 sym\">keyFilter</span>);"],
-  [391, "    }"],
-  [392, ""],
-  [393, "    <span class=\"a\">@Override</span>"],
-  [394, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-1237 sym\">Iterator</span>&lt;T&gt; <span class=\"sym-10927 sym\">iterator</span>() {"],
-  [395, "      <span class=\"k\">return </span><span class=\"sym-10739 sym\">iterator</span>;"],
-  [396, "    }"],
-  [397, "  }"],
-  [398, ""],
-  [399, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-10997 sym\">ValueIterator</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span><span class=\"sym-1237 sym\">Iterator</span>&lt;T&gt; {"],
-  [400, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-11087 sym\">exchange</span>;"],
-  [401, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-11125 sym\">keyFilter</span>;"],
-  [402, ""],
-  [403, "    <span class=\"k\">private </span><span class=\"sym-11149 sym\">ValueIterator</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-11172 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-11192 sym\">keyFilter</span>) {"],
-  [404, "      <span class=\"k\">this</span>.<span class=\"sym-11087 sym\">exchange</span> = <span class=\"sym-11172 sym\">exchange</span>;"],
-  [405, "      <span class=\"k\">this</span>.<span class=\"sym-11125 sym\">keyFilter</span> = <span class=\"sym-11192 sym\">keyFilter</span>;"],
-  [406, "    }"],
-  [407, ""],
-  [408, "    <span class=\"a\">@Override</span>"],
-  [409, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-11311 sym\">hasNext</span>() {"],
-  [410, "      <span class=\"k\">try </span>{"],
-  [411, "        <span class=\"k\">return </span><span class=\"sym-11087 sym\">exchange</span>.hasNext(<span class=\"sym-11125 sym\">keyFilter</span>);"],
-  [412, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-11413 sym\">e</span>) {"],
-  [413, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-11413 sym\">e</span>);"],
-  [414, "      }"],
-  [415, "    }"],
-  [416, ""],
-  [417, "    <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)"],
-  [418, "    <span class=\"a\">@Override</span>"],
-  [419, "<span class=\"a\">    </span><span class=\"k\">public </span>T <span class=\"sym-11539 sym\">next</span>() {"],
-  [420, "      <span class=\"k\">try </span>{"],
-  [421, "        <span class=\"sym-11087 sym\">exchange</span>.next(<span class=\"sym-11125 sym\">keyFilter</span>);"],
-  [422, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-11628 sym\">e</span>) {"],
-  [423, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-11628 sym\">e</span>);"],
-  [424, "      }"],
-  [425, "      <span class=\"k\">if </span>(<span class=\"sym-11087 sym\">exchange</span>.getValue().isDefined()) {"],
-  [426, "        <span class=\"k\">return </span>(T) <span class=\"sym-11087 sym\">exchange</span>.getValue().get();"],
-  [427, "      }"],
-  [428, "      <span class=\"k\">throw </span><span class=\"k\">new </span><span class=\"sym-1264 sym\">NoSuchElementException</span>();"],
-  [429, "    }"],
-  [430, ""],
-  [431, "    <span class=\"a\">@Override</span>"],
-  [432, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-11863 sym\">remove</span>() {"],
-  [433, "      <span class=\"k\">throw </span><span class=\"k\">new </span>UnsupportedOperationException(<span class=\"s\">\"Removing an item is not supported\"</span>);"],
-  [434, "    }"],
-  [435, "  }"],
-  [436, ""],
-  [437, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-11992 sym\">EntryIterable</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span>Iterable&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;&gt; {"],
-  [438, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-12339 sym\">EntryIterator</span>&lt;T&gt; <span class=\"sym-12097 sym\">it</span>;"],
-  [439, ""],
-  [440, "    <span class=\"k\">private </span><span class=\"sym-12114 sym\">EntryIterable</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-12137 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-12157 sym\">keyFilter</span>) {"],
-  [441, "      <span class=\"sym-12097 sym\">it</span> = <span class=\"k\">new </span><span class=\"sym-12339 sym\">EntryIterator</span>&lt;T&gt;(<span class=\"sym-12137 sym\">exchange</span>, <span class=\"sym-12157 sym\">keyFilter</span>);"],
-  [442, "    }"],
-  [443, ""],
-  [444, "    <span class=\"a\">@Override</span>"],
-  [445, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-1237 sym\">Iterator</span>&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;&gt; <span class=\"sym-12275 sym\">iterator</span>() {"],
-  [446, "      <span class=\"k\">return </span><span class=\"sym-12097 sym\">it</span>;"],
-  [447, "    }"],
-  [448, "  }"],
-  [449, ""],
-  [450, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-12339 sym\">EntryIterator</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span><span class=\"sym-1237 sym\">Iterator</span>&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;&gt; {"],
-  [451, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-12436 sym\">exchange</span>;"],
-  [452, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-12474 sym\">keyFilter</span>;"],
-  [453, ""],
-  [454, "    <span class=\"k\">private </span><span class=\"sym-12498 sym\">EntryIterator</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-12521 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-12541 sym\">keyFilter</span>) {"],
-  [455, "      <span class=\"k\">this</span>.<span class=\"sym-12436 sym\">exchange</span> = <span class=\"sym-12521 sym\">exchange</span>;"],
-  [456, "      <span class=\"k\">this</span>.<span class=\"sym-12474 sym\">keyFilter</span> = <span class=\"sym-12541 sym\">keyFilter</span>;"],
-  [457, "    }"],
-  [458, ""],
-  [459, "    <span class=\"a\">@Override</span>"],
-  [460, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-12660 sym\">hasNext</span>() {"],
-  [461, "      <span class=\"k\">try </span>{"],
-  [462, "        <span class=\"k\">return </span><span class=\"sym-12436 sym\">exchange</span>.hasNext(<span class=\"sym-12474 sym\">keyFilter</span>);"],
-  [463, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-12762 sym\">e</span>) {"],
-  [464, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-12762 sym\">e</span>);"],
-  [465, "      }"],
-  [466, "    }"],
-  [467, ""],
-  [468, "    <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)"],
-  [469, "    <span class=\"a\">@Override</span>"],
-  [470, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-13607 sym\">Entry</span>&lt;T&gt; <span class=\"sym-12895 sym\">next</span>() {"],
-  [471, "      <span class=\"k\">try </span>{"],
-  [472, "        <span class=\"sym-12436 sym\">exchange</span>.next(<span class=\"sym-12474 sym\">keyFilter</span>);"],
-  [473, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-12984 sym\">e</span>) {"],
-  [474, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-12984 sym\">e</span>);"],
-  [475, "      }"],
-  [476, "      <span class=\"k\">if </span>(<span class=\"sym-12436 sym\">exchange</span>.getValue().isDefined()) {"],
-  [477, "        T <span class=\"sym-13096 sym\">value</span> = (T) <span class=\"sym-12436 sym\">exchange</span>.getValue().get();"],
-  [478, "        <span class=\"sym-1007 sym\">Key</span> <span class=\"sym-13147 sym\">key</span> = <span class=\"sym-12436 sym\">exchange</span>.getKey();"],
-  [479, "        Object[] <span class=\"sym-13189 sym\">array</span> = <span class=\"k\">new </span>Object[<span class=\"sym-13147 sym\">key</span>.getDepth()];"],
-  [480, "        <span class=\"k\">for </span>(<span class=\"k\">int </span><span class=\"sym-13242 sym\">i</span> = <span class=\"c\">0</span>; <span class=\"sym-13242 sym\">i</span> &lt; <span class=\"sym-13147 sym\">key</span>.getDepth(); <span class=\"sym-13242 sym\">i</span>++) {"],
-  [481, "          <span class=\"sym-13189 sym\">array</span>[<span class=\"sym-13242 sym\">i</span>] = <span class=\"sym-13147 sym\">key</span>.indexTo(<span class=\"sym-13242 sym\">i</span> - <span class=\"sym-13147 sym\">key</span>.getDepth()).decode();"],
-  [482, "        }"],
-  [483, "        <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;(<span class=\"sym-13189 sym\">array</span>, <span class=\"sym-13096 sym\">value</span>);"],
-  [484, "      }"],
-  [485, "      <span class=\"k\">throw </span><span class=\"k\">new </span><span class=\"sym-1264 sym\">NoSuchElementException</span>();"],
-  [486, "    }"],
-  [487, ""],
-  [488, "    <span class=\"a\">@Override</span>"],
-  [489, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-13479 sym\">remove</span>() {"],
-  [490, "      <span class=\"k\">throw </span><span class=\"k\">new </span>UnsupportedOperationException(<span class=\"s\">\"Removing an item is not supported\"</span>);"],
-  [491, "    }"],
-  [492, "  }"],
-  [493, ""],
-  [494, "  <span class=\"k\">public </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-13607 sym\">Entry</span>&lt;V <span class=\"k\">extends </span>Serializable&gt; {"],
-  [495, "    <span class=\"k\">private </span><span class=\"k\">final </span>Object[] <span class=\"sym-13666 sym\">key</span>;"],
-  [496, "    <span class=\"k\">private </span><span class=\"k\">final </span>V <span class=\"sym-13691 sym\">value</span>;"],
-  [497, ""],
-  [498, "    <span class=\"sym-13703 sym\">Entry</span>(Object[] <span class=\"sym-13718 sym\">key</span>, V <span class=\"sym-13725 sym\">value</span>) {"],
-  [499, "      <span class=\"k\">this</span>.<span class=\"sym-13666 sym\">key</span> = <span class=\"sym-13718 sym\">key</span>;"],
-  [500, "      <span class=\"k\">this</span>.<span class=\"sym-13691 sym\">value</span> = <span class=\"sym-13725 sym\">value</span>;"],
-  [501, "    }"],
-  [502, ""],
-  [503, "    <span class=\"k\">public </span>Object[] <span class=\"sym-13809 sym\">key</span>() {"],
-  [504, "      <span class=\"k\">return </span><span class=\"sym-13666 sym\">key</span>;"],
-  [505, "    }"],
-  [506, ""],
-  [507, "    <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
-  [508, "<span class=\"a\">    </span><span class=\"k\">public </span>V <span class=\"sym-13873 sym\">value</span>() {"],
-  [509, "      <span class=\"k\">return </span><span class=\"sym-13691 sym\">value</span>;"],
-  [510, "    }"],
-  [511, ""],
-  [512, "    <span class=\"a\">@Override</span>"],
-  [513, "<span class=\"a\">    </span><span class=\"k\">public </span>String <span class=\"sym-13942 sym\">toString</span>() {"],
-  [514, "      <span class=\"k\">return </span><span class=\"sym-1134 sym\">ToStringBuilder</span>.reflectionToString(<span class=\"k\">this</span>);"],
-  [515, "    }"],
-  [516, "  }"],
-  [517, ""],
-  [518, "}"],
-  [519, ""]
-]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/test-cases.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/test-cases.json
deleted file mode 100644 (file)
index 233229a..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-{"tests": [
-  {
-    "name": "should_update_existing_issue",
-    "status": "OK",
-    "durationInMs": 293,
-    "_ref": "1"
-  },
-  {
-    "name": "testDistributionMeasure",
-    "status": "OK",
-    "durationInMs": 148,
-    "_ref": "2"
-  },
-  {
-    "name": "one_part_key",
-    "status": "OK",
-    "durationInMs": 96,
-    "_ref": "3"
-  },
-  {
-    "name": "testIssueExclusion",
-    "status": "OK",
-    "durationInMs": 305,
-    "_ref": "4"
-  },
-  {
-    "name": "should_add_measure_with_same_metric",
-    "status": "OK",
-    "durationInMs": 141,
-    "_ref": "5"
-  },
-  {
-    "name": "should_create_cache",
-    "status": "OK",
-    "durationInMs": 81,
-    "_ref": "6"
-  },
-  {
-    "name": "scanProjectWithMixedSourcesAndTests",
-    "status": "OK",
-    "durationInMs": 239,
-    "_ref": "7"
-  },
-  {
-    "name": "remove_versus_clear",
-    "status": "OK",
-    "durationInMs": 111,
-    "_ref": "3"
-  },
-  {
-    "name": "should_persist_component_data",
-    "status": "OK",
-    "durationInMs": 132,
-    "_ref": "8"
-  },
-  {
-    "name": "scanProjectWithSourceDir",
-    "status": "OK",
-    "durationInMs": 212,
-    "_ref": "7"
-  },
-  {
-    "name": "should_add_measure_with_too_big_data_for_persistit",
-    "status": "OK",
-    "durationInMs": 336,
-    "_ref": "5"
-  },
-  {
-    "name": "failForDuplicateInputFile",
-    "status": "OK",
-    "durationInMs": 127,
-    "_ref": "7"
-  },
-  {
-    "name": "should_not_create_cache_twice",
-    "status": "OK",
-    "durationInMs": 101,
-    "_ref": "6"
-  },
-  {
-    "name": "should_get_and_set_data",
-    "status": "OK",
-    "durationInMs": 190,
-    "_ref": "9"
-  },
-  {
-    "name": "should_add_input_file",
-    "status": "OK",
-    "durationInMs": 122,
-    "_ref": "10"
-  },
-  {
-    "name": "scanTempProject",
-    "status": "OK",
-    "durationInMs": 345,
-    "_ref": "4"
-  },
-  {
-    "name": "should_get_measures",
-    "status": "OK",
-    "durationInMs": 114,
-    "_ref": "5"
-  },
-  {
-    "name": "test_key_being_prefix_of_another_key",
-    "status": "OK",
-    "durationInMs": 94,
-    "_ref": "3"
-  },
-  {
-    "name": "should_add_measure_with_big_data",
-    "status": "OK",
-    "durationInMs": 242,
-    "_ref": "5"
-  },
-  {
-    "name": "should_get_all_issues",
-    "status": "OK",
-    "durationInMs": 104,
-    "_ref": "1"
-  },
-  {
-    "name": "should_add_measure",
-    "status": "OK",
-    "durationInMs": 117,
-    "_ref": "5"
-  },
-  {
-    "name": "computeMeasuresOnSampleProject",
-    "status": "OK",
-    "durationInMs": 315,
-    "_ref": "2"
-  },
-  {
-    "name": "test_measure_coder",
-    "status": "OK",
-    "durationInMs": 110,
-    "_ref": "5"
-  },
-  {
-    "name": "should_add_measure_with_too_big_data_for_persistit_pre_patch",
-    "status": "OK",
-    "durationInMs": 821,
-    "_ref": "5"
-  },
-  {
-    "name": "three_parts_key",
-    "status": "OK",
-    "durationInMs": 122,
-    "_ref": "3"
-  },
-  {
-    "name": "two_parts_key",
-    "status": "OK",
-    "durationInMs": 118,
-    "_ref": "3"
-  },
-  {
-    "name": "should_add_new_issue",
-    "status": "OK",
-    "durationInMs": 95,
-    "_ref": "1"
-  },
-  {
-    "name": "empty_cache",
-    "status": "OK",
-    "durationInMs": 104,
-    "_ref": "3"
-  },
-  {
-    "name": "scanProjectWithTestDir",
-    "status": "OK",
-    "durationInMs": 322,
-    "_ref": "7"
-  },
-  {
-    "name": "scanSampleProject",
-    "status": "OK",
-    "durationInMs": 184,
-    "_ref": "4"
-  },
-  {
-    "name": "computeMeasuresOnTempProject",
-    "status": "OK",
-    "durationInMs": 274,
-    "_ref": "2"
-  },
-  {
-    "name": "should_get_and_set_string_data",
-    "status": "OK",
-    "durationInMs": 95,
-    "_ref": "9"
-  }
-], "files": {
-  "3": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/CacheTest.java",
-    "longName": "src/test/java/org/sonar/batch/index/CacheTest.java"
-  },
-  "1": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/issue/IssueCacheTest.java",
-    "longName": "src/test/java/org/sonar/batch/issue/IssueCacheTest.java"
-  },
-  "4": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java",
-    "longName": "src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java"
-  },
-  "2": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java",
-    "longName": "src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java"
-  },
-  "8": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/ComponentDataPersisterTest.java",
-    "longName": "src/test/java/org/sonar/batch/index/ComponentDataPersisterTest.java"
-  },
-  "9": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/ComponentDataCacheTest.java",
-    "longName": "src/test/java/org/sonar/batch/index/ComponentDataCacheTest.java"
-  },
-  "10": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java",
-    "longName": "src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java"
-  },
-  "7": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/mediumtest/fs/FileSystemMediumTest.java",
-    "longName": "src/test/java/org/sonar/batch/mediumtest/fs/FileSystemMediumTest.java"
-  },
-  "5": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/scan/measure/MeasureCacheTest.java",
-    "longName": "src/test/java/org/sonar/batch/scan/measure/MeasureCacheTest.java"
-  },
-  "6": {
-    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/CachesTest.java",
-    "longName": "src/test/java/org/sonar/batch/index/CachesTest.java"
-  }
-}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/app.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/app.json
deleted file mode 100644 (file)
index d279396..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-{"key": "com.sonarsource.it.samples:sample-with-tests:src/test/java/sample/SampleTest.java", "path": "src/test/java/sample/SampleTest.java", "name": "SampleTest.java", "longName": "src/test/java/sample/SampleTest.java", "q": "UTS", "project": "com.sonarsource.it.samples:sample-with-tests", "projectName": "Sonar :: Integration Tests :: Sample with tests", "fav": false, "canMarkAsFavourite": false, "canBulkChange": false, "canCreateManualIssue": false, "periods": [], "severities": [], "rules": [], "measures": {
-  "fTests": "2",
-  "fIssues": "0"
-}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/covered-files.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/covered-files.json
deleted file mode 100644 (file)
index 73f2e04..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-{"files": [
-  {
-    "key": "com.sonarsource.it.samples:sample-with-tests:src/main/java/sample/Sample.java",
-    "longName": "src/main/java/sample/Sample.java",
-    "coveredLines": 5
-  }
-]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/resources.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/resources.json
deleted file mode 100644 (file)
index 3490bce..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-[
-  {
-    "id": 5,
-    "key": "com.sonarsource.it.samples:sample-with-tests:src/test/java/sample/SampleTest.java",
-    "name": "SampleTest.java",
-    "scope": "FIL",
-    "qualifier": "UTS",
-    "date": "2014-07-24T10:57:16+0200",
-    "creationDate": "2014-07-24T10:57:17+0200",
-    "lname": "src/test/java/sample/SampleTest.java",
-    "lang": "java",
-    "msr": [
-      {
-        "key": "tests",
-        "val": 2.0,
-        "frmt_val": "2"
-      },
-      {
-        "key": "test_execution_time",
-        "val": 12.0,
-        "frmt_val": "12 ms"
-      }
-    ]
-  }
-]
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/source.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/source.json
deleted file mode 100644 (file)
index 02e9da7..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{"sources": [
-  [1, "<span class=\"k\">package</span> sample;"],
-  [2, ""],
-  [3, "<span class=\"k\">import</span> org.hamcrest.CoreMatchers;"],
-  [4, "<span class=\"k\">import</span> org.junit.Test;"],
-  [5, ""],
-  [6, "<span class=\"k\">import</span> <span class=\"k\">static</span> org.junit.Assert.assertThat;"],
-  [7, ""],
-  [8, "<span class=\"k\">public</span> <span class=\"k\">class</span> SampleTest {"],
-  [9, ""],
-  [10, "  <span class=\"a\">@Test</span>"],
-  [11, "  <span class=\"k\">public</span> <span class=\"k\">void</span> should_return_i() {"],
-  [12, "    Sample sample = <span class=\"k\">new</span> Sample(1);"],
-  [13, "    assertThat(sample.getI(), CoreMatchers.is(1));"],
-  [14, "  }"],
-  [15, ""],
-  [16, "  <span class=\"a\">@Test</span>"],
-  [17, "  <span class=\"k\">public</span> <span class=\"k\">void</span> should_return_to_string() {"],
-  [18, "    assertThat(<span class=\"k\">new</span> Sample(1).toString(), CoreMatchers.is(<span class=\"s\">\"1\"</span>));"],
-  [19, "  }"],
-  [20, ""],
-  [21, "}"],
-  [22, ""]
-]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/tests.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/tests/tests.json
deleted file mode 100644 (file)
index f1ef789..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{"tests": [
-  {
-    "name": "should_return_to_string",
-    "status": "OK",
-    "durationInMs": 1,
-    "coveredLines": 4
-  },
-  {
-    "name": "should_return_i",
-    "status": "OK",
-    "durationInMs": 11,
-    "coveredLines": 5
-  }
-]}
index 771279d4781604aa3d476c96703da94be52f7fa4..9e764d9e66d6b7d7ed84f0bda88f3fa44576a5bf 100644 (file)
@@ -1,3 +1,5 @@
+/* globals casper: false */
+
 var lib = require('../lib'),
     testName = lib.testName('Issues');
 
@@ -161,3 +163,96 @@ casper.test.begin(testName('Issue Box', 'Transitions'), function (test) {
         test.done();
       });
 });
+
+
+casper.test.begin(testName('File-Level Issues'), function (test) {
+  var issueKey = '200d4a8b-9666-4e70-9953-7bab57933f97',
+      issueSelector = '.issue[data-key="' + issueKey + '"]';
+
+  casper
+      .start(lib.buildUrl('issues'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/issue_filters/app', 'app.json');
+        lib.mockRequestFromFile('/api/issues/search', 'file-level/search.json');
+        lib.mockRequestFromFile('/api/components/app', 'file-level/components-app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'file-level/lines.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector(issueSelector, function () {
+          casper.click(issueSelector + ' .js-issue-navigate');
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-viewer ' + issueSelector, function () {
+          test.assertSelectorContains('.source-viewer ' + issueSelector, '1 duplicated blocks of code');
+        });
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Status Facet'), function (test) {
+  casper
+      .start(lib.buildUrl('issues'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/issue_filters/app', 'app.json');
+        lib.mockRequestFromFile('/api/issues/search', 'search-reopened.json', { data: { statuses: 'REOPENED' } });
+        lib.mockRequestFromFile('/api/issues/search', 'search.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.facet[data-value=REOPENED]', function () {
+          casper.click('.facet[data-value=REOPENED]');
+        });
+      })
+
+      .then(function () {
+        lib.waitForElementCount('.issue', 4, function () {
+          test.assertElementCount('.issue .icon-status-reopened', 4);
+        });
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Bulk Change'), function (test) {
+  casper
+      .start(lib.buildUrl('issues'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/issue_filters/app', 'app.json');
+        lib.mockRequestFromFile('/api/issues/search', 'search.json');
+        lib.mockRequest('/issues/bulk_change_form?resolved=false',
+            '<div id="bulk-change-form">bulk change form</div>', { contentType: 'text/plain' });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.issue', function () {
+          casper.waitForSelector('#issues-bulk-change');
+        });
+      })
+
+      .then(function () {
+        casper.click('#issues-bulk-change');
+        casper.waitForSelector('#bulk-change-form', function () {
+          test.assertSelectorContains('#bulk-change-form', 'bulk change form');
+        });
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/components-app.json b/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/components-app.json
new file mode 100644 (file)
index 0000000..537dd07
--- /dev/null
@@ -0,0 +1,124 @@
+{
+  "key": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+  "path": "src/main/java/org/sonar/api/measures/Measure.java",
+  "name": "Measure.java",
+  "longName": "src/main/java/org/sonar/api/measures/Measure.java",
+  "q": "FIL",
+  "subProject": "org.codehaus.sonar:sonar-plugin-api",
+  "subProjectName": "SonarQube :: Plugin API",
+  "project": "org.codehaus.sonar:sonar",
+  "projectName": "SonarQube",
+  "fav": false,
+  "canMarkAsFavourite": false,
+  "canBulkChange": false,
+  "canCreateManualIssue": false,
+  "periods": [
+    [
+      1,
+      "since previous analysis (2014 Dec 01)",
+      "2014-12-01T18:51:13+0100"
+    ],
+    [
+      2,
+      "over 365 days (2013 Dec 01)",
+      "2013-12-01T00:40:31+0100"
+    ],
+    [
+      3,
+      "since previous version (4.5 - 2014 Sep 03)",
+      "2014-09-03T23:16:52+0200"
+    ]
+  ],
+  "severities": [
+    [
+      "MAJOR",
+      "Major",
+      10
+    ],
+    [
+      "INFO",
+      "Info",
+      3
+    ]
+  ],
+  "rules": [
+    [
+      "common-java:DuplicatedBlocks",
+      "Duplicated blocks",
+      1
+    ],
+    [
+      "squid:S1698",
+      "Objects should be compared with \"equals()\"",
+      1
+    ],
+    [
+      "squid:MethodCyclomaticComplexity",
+      "Methods should not be too complex",
+      3
+    ],
+    [
+      "squid:S1142",
+      "Methods should not contain too many return statements",
+      2
+    ],
+    [
+      "squid:S1067",
+      "Expressions should not be too complex",
+      1
+    ],
+    [
+      "squid:S1151",
+      "Switch cases should not have too many lines",
+      1
+    ],
+    [
+      "common-java:InsufficientBranchCoverage",
+      "Insufficient branch coverage by unit tests",
+      1
+    ],
+    [
+      "squid:S1133",
+      "Deprecated code should be removed eventually",
+      3
+    ]
+  ],
+  "measures": {
+    "fNcloc": "396",
+    "fCoverage": "65.0%",
+    "fDuplicationDensity": "2.6%",
+    "fDebt": "5h 42min",
+    "fSqaleRating": "A",
+    "fSqaleDebtRatio": "2.9%",
+    "fIssues": "13",
+    "fMajorIssues": "10",
+    "fInfoIssues": "3"
+  },
+  "tabs": [
+    "scm",
+    "coverage",
+    "duplications"
+  ],
+  "manual_rules": [
+    {
+      "key": "manual:api",
+      "name": "API"
+    },
+    {
+      "key": "manual:design",
+      "name": "Design"
+    },
+    {
+      "key": "manual:error_handling",
+      "name": "Error handling"
+    },
+    {
+      "key": "manual:performance",
+      "name": "Performance"
+    },
+    {
+      "key": "manual:sql_pitfalls",
+      "name": "SQL Pitfall"
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/lines.json b/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/lines.json
new file mode 100644 (file)
index 0000000..18a670b
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "sources": [
+    {
+      "line": 1,
+      "code": "<span class=\"cppd\">/*</span>",
+      "scmAuthor": "simon.brandhof@gmail.com",
+      "scmRevision": "aeadc1f9129274949daaa57738c7c4550bdfbc7b",
+      "scmDate": "2010-09-06T16:08:06+0200"
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/search.json b/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/file-level/search.json
new file mode 100644 (file)
index 0000000..5ea06f0
--- /dev/null
@@ -0,0 +1,494 @@
+{
+  "total": 10,
+  "p": 1,
+  "ps": 50,
+  "projects": [
+    {
+      "uuid": "69e57151-be0d-4157-adff-c06741d88879",
+      "key": "org.codehaus.sonar:sonar",
+      "id": 2865,
+      "qualifier": "TRK",
+      "name": "SonarQube",
+      "longName": "SonarQube"
+    }
+  ],
+  "components": [
+    {
+      "uuid": "7feef7c3-11b9-4175-b5a7-527ca3c75cb7",
+      "key": "org.codehaus.sonar:sonar-plugin-api",
+      "id": 16,
+      "enabled": true,
+      "qualifier": "BRC",
+      "name": "SonarQube :: Plugin API",
+      "longName": "SonarQube :: Plugin API",
+      "path": "sonar-plugin-api",
+      "projectId": 2865,
+      "subProjectId": 2865
+    },
+    {
+      "uuid": "e1b3c47e-e9a2-42ea-9cac-439ce2345d7e",
+      "key": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Metric.java",
+      "id": 3543,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "Metric.java",
+      "longName": "src/main/java/org/sonar/api/measures/Metric.java",
+      "path": "src/main/java/org/sonar/api/measures/Metric.java",
+      "projectId": 2865,
+      "subProjectId": 16
+    },
+    {
+      "uuid": "69e57151-be0d-4157-adff-c06741d88879",
+      "key": "org.codehaus.sonar:sonar",
+      "id": 2865,
+      "enabled": true,
+      "qualifier": "TRK",
+      "name": "SonarQube",
+      "longName": "SonarQube"
+    },
+    {
+      "uuid": "e2550527-3f86-4082-a9ae-e345f5a735aa",
+      "key": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "id": 3538,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "Measure.java",
+      "longName": "src/main/java/org/sonar/api/measures/Measure.java",
+      "path": "src/main/java/org/sonar/api/measures/Measure.java",
+      "projectId": 2865,
+      "subProjectId": 16
+    },
+    {
+      "uuid": "97606f40-f3ef-4922-aa37-f67485917e67",
+      "key": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/resources/File.java",
+      "id": 3592,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "File.java",
+      "longName": "src/main/java/org/sonar/api/resources/File.java",
+      "path": "src/main/java/org/sonar/api/resources/File.java",
+      "projectId": 2865,
+      "subProjectId": 16
+    },
+    {
+      "uuid": "69949290-cfe6-45b6-9dd0-53f1e467b810",
+      "key": "org.codehaus.sonar:sonar-duplications",
+      "id": 20,
+      "enabled": true,
+      "qualifier": "BRC",
+      "name": "SonarQube :: Duplications",
+      "longName": "SonarQube :: Duplications",
+      "path": "sonar-duplications",
+      "projectId": 2865,
+      "subProjectId": 2865
+    },
+    {
+      "uuid": "90dd5fda-5fce-4d76-bebf-132922abad95",
+      "key": "org.codehaus.sonar:sonar-duplications:src/main/java/org/sonar/duplications/index/PackedMemoryCloneIndex.java",
+      "id": 3308,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "PackedMemoryCloneIndex.java",
+      "longName": "src/main/java/org/sonar/duplications/index/PackedMemoryCloneIndex.java",
+      "path": "src/main/java/org/sonar/duplications/index/PackedMemoryCloneIndex.java",
+      "projectId": 2865,
+      "subProjectId": 20
+    },
+    {
+      "uuid": "1b915447-5aa8-4f59-9134-346a4e88c7b7",
+      "key": "org.codehaus.sonar.plugins:sonar-core-plugin",
+      "id": 2873,
+      "enabled": true,
+      "qualifier": "BRC",
+      "name": "SonarQube :: Plugins :: Core",
+      "longName": "SonarQube :: Plugins :: Core",
+      "path": "plugins/sonar-core-plugin",
+      "projectId": 2865,
+      "subProjectId": 2865
+    },
+    {
+      "uuid": "6c9c1986-59b3-4839-8dec-9499488f64d1",
+      "key": "org.codehaus.sonar.plugins:sonar-core-plugin:src/main/java/org/sonar/plugins/core/issue/tracking/StringTextComparator.java",
+      "id": 20777,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "StringTextComparator.java",
+      "longName": "src/main/java/org/sonar/plugins/core/issue/tracking/StringTextComparator.java",
+      "path": "src/main/java/org/sonar/plugins/core/issue/tracking/StringTextComparator.java",
+      "projectId": 2865,
+      "subProjectId": 2873
+    }
+  ],
+  "issues": [
+    {
+      "key": "200d4a8b-9666-4e70-9953-7bab57933f97",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "common-java:DuplicatedBlocks",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "1 duplicated blocks of code.",
+      "debt": "1h",
+      "creationDate": "2014-06-06T23:38:06+0200",
+      "updateDate": "2014-07-01T17:51:37+0200",
+      "fUpdateAge": "5 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "23c5a022-ab5b-4892-b676-a7fd58540f79",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "common-java:InsufficientBranchCoverage",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "1 more branches need to be covered by unit tests to reach the minimum threshold of 65.0% branch coverage.",
+      "debt": "10min",
+      "creationDate": "2014-09-02T09:25:36+0200",
+      "updateDate": "2014-10-09T16:21:48+0200",
+      "fUpdateAge": "about a month",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "23d6cd5e-83ba-4e65-abef-ff8592195638",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:S1142",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "Reduce the number of returns of this method 7, down to the maximum allowed 5.",
+      "line": 248,
+      "debt": "20min",
+      "author": "julien.henry@sonarsource.com",
+      "creationDate": "2014-06-16T23:38:20+0200",
+      "updateDate": "2014-07-01T18:26:25+0200",
+      "fUpdateAge": "5 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "8c5a4fca-57c9-44ad-89c0-6673c483e357",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:MethodCyclomaticComplexity",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "The Cyclomatic Complexity of this method \"value\" is 22 which is greater than 10 authorized.",
+      "line": 248,
+      "debt": "10min",
+      "author": "julien.henry@sonarsource.com",
+      "creationDate": "2014-06-16T23:38:20+0200",
+      "updateDate": "2014-07-01T16:20:08+0200",
+      "fUpdateAge": "5 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "57303136-93b5-4d96-b1ca-654160aa5bdb",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:S1151",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "Reduce this switch case number of lines from 8 to at most 5, for example by extracting code into methods.",
+      "line": 266,
+      "debt": "10min",
+      "author": "julien.henry@sonarsource.com",
+      "creationDate": "2014-06-16T23:38:20+0200",
+      "updateDate": "2014-06-30T16:41:24+0200",
+      "fUpdateAge": "5 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "dbf052eb-f991-44db-a829-029d47b7fe2d",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:MethodCyclomaticComplexity",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "The Cyclomatic Complexity of this method \"getVariation\" is 12 which is greater than 10 authorized.",
+      "line": 562,
+      "debt": "10min",
+      "author": "Simon Brandhof",
+      "creationDate": "2011-10-25T12:27:40+0200",
+      "updateDate": "2013-12-18T23:54:49+0100",
+      "fUpdateAge": "11 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "50db1415-bd3c-4c24-ab0a-763177059770",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:S1698",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "Change this comparison to use the equals method.",
+      "line": 684,
+      "debt": "2min",
+      "author": "david@gageot.net",
+      "creationDate": "2014-06-26T23:17:10+0200",
+      "updateDate": "2014-07-01T16:13:48+0200",
+      "fUpdateAge": "5 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "5fbdc597-0d83-4ea2-9d9d-ac192ec1eec1",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:S1067",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "Reduce the number of conditional operators (5) used in the expression (maximum allowed 3).",
+      "line": 684,
+      "debt": "10min",
+      "author": "david@gageot.net",
+      "creationDate": "2013-08-28T12:19:16+0200",
+      "updateDate": "2013-12-10T14:28:37+0100",
+      "fUpdateAge": "12 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "186d1419-f5e9-412f-8a8e-f8cd81920359",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:MethodCyclomaticComplexity",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "The Cyclomatic Complexity of this method \"equals\" is 15 which is greater than 10 authorized.",
+      "line": 724,
+      "debt": "10min",
+      "author": "Simon Brandhof",
+      "creationDate": "2011-10-25T12:27:40+0200",
+      "updateDate": "2014-03-12T10:43:19+0100",
+      "fUpdateAge": "9 months",
+      "actions": [],
+      "transitions": []
+    },
+    {
+      "key": "225d3b74-8b61-46a1-aac2-68221d6cd933",
+      "component": "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/measures/Measure_2.java",
+      "componentId": 3538,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-plugin-api",
+      "rule": "squid:S1142",
+      "status": "CONFIRMED",
+      "severity": "MAJOR",
+      "message": "Reduce the number of returns of this method 6, down to the maximum allowed 5.",
+      "line": 724,
+      "debt": "20min",
+      "author": "simon.brandhof@gmail.com",
+      "creationDate": "2013-08-09T16:04:33+0200",
+      "updateDate": "2014-03-12T10:43:19+0100",
+      "fUpdateAge": "9 months",
+      "actions": [],
+      "transitions": []
+    }
+  ],
+  "rules": [
+    {
+      "key": "squid:S1698",
+      "name": "Objects should be compared with \"equals()\"",
+      "lang": "java",
+      "desc": "<p>Using the equality (<code>==</code>) and inequality (<code>!=</code>) operators to compare two objects does not check to see if they have the same values. Rather it checks to see if both object references point to exactly the same object in memory. The vast majority of the time, this is not what you want to do. Use the .equals() method to compare the values of two objects or to compare a string object to a string literal.</p>\n\n<h2>Noncompliant Code Sample</h2>\n<pre>\nString str1 = \"blue\";\nString str2 = \"blue\";\nString str3 = str1;\n\nif (str1 == str2)\n{\n  System.out.println(\"they're both 'blue'\"); // this doesn't print because the objects are different\n}\n\nif (str1 == \"blue\")\n{\n  System.out.println(\"they're both 'blue'\"); // this doesn't print because the objects are different\n}\n\nif (str1 == str3)\n{\n  System.out.println(\"they're the same object\"); // this prints\n}\n</pre>\n\n<h2>Compliant Solution</h2>\n<pre>\nString str1 = \"blue\";\nString str2 = \"blue\";\nString str3 = str1;\n\nif (str1.equals(str2))\n{\n  System.out.println(\"they're both 'blue'\"); // this prints\n}\n\nif (str1.equals(\"blue\"))\n{\n  System.out.println(\"they're both 'blue'\"); // this prints\n}\n\nif (str1 == str3)\n{\n  System.out.println(\"they're the same object\"); // this still prints, but it's probably not what you meant to do\n}\n</pre>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "common-java:DuplicatedBlocks",
+      "name": "Duplicated blocks",
+      "lang": "java",
+      "desc": "<p>An issue is created on a file as soon as there is a block of duplicated code on this file. It gives the number of blocks in the file.</p>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:MethodCyclomaticComplexity",
+      "name": "Methods should not be too complex",
+      "lang": "java",
+      "desc": "<p>The Cyclomatic Complexity is measured by the number of\n\t(&amp;&amp;, ||) operators and (if, while, do, for, ?:, catch, switch,\n\tcase, return, throw) statements in the body of a class plus one for\n\teach constructor, method (but not getter/setter), static initializer,\n\tor instance initializer in the class. The last return stament in\n\tmethod, if exists, is not taken into account.</p>\n<p>\n\tEven when the Cyclomatic Complexity of a class is very high, this\n\tcomplexity might be well distributed among all methods. Nevertheless,\n\tmost of the time, a very complex class is a class which breaks the <a\n\t\thref=\"http://en.wikipedia.org/wiki/Single_responsibility_principle\">Single\n\t\tResponsibility Principle</a> and which should be re-factored to be split\n\tin several classes.\n</p>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:S1142",
+      "name": "Methods should not contain too many return statements",
+      "lang": "java",
+      "desc": "<p>\nHaving too many return statements in a method increases the method's essential complexity because the flow of execution is broken each time a return statement is encountered.\nThis makes it harder to read and understand the logic of the method.\n</p>\n\n<p>\nThe following code snippet illustrates this rule with the default threshold of 3:\n</p>\n\n<pre>\npublic boolean myMethod() { // Non-Compliant as there are 4 return statements\n  if (condition1) {\n    return true;\n  } else {\n    if (condition2) {\n      return false;\n    } else {\n      return true;\n    }\n  }\n  return false;\n}\n</pre>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:S1067",
+      "name": "Expressions should not be too complex",
+      "lang": "java",
+      "desc": "<p>\nThe complexity of an expression is defined by the number of <code>&&</code>, <code>||</code> and <code>condition ? ifTrue : ifFalse</code> operators it contains.\nA single expression's complexity should not become too high to keep the code readable.\n</p>\n\n<p>The following code, with a maximum complexity of 3:</p>\n\n<pre>\nif (condition1 && condition2 && condition3 && condition4) { /* ... */ }  // Non-Compliant\n</pre>\n\n<p>could be refactored into something like:</p>\n\n<pre>\nif (relevantMethodName1() && relevantMethodName2()) { /* ... */ }        // Compliant\n\n/* ... */\n\nprivate boolean relevantMethodName1() {\n  return condition1 && condition2;\n}\n\nprivate boolean relevantMethodName2() {\n  return condition3 && condition4;\n}\n</pre>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:S1151",
+      "name": "Switch cases should not have too many lines",
+      "lang": "java",
+      "desc": "<p>Switch cases should remain small to keep the overall switch compact and readable.</p>\n\n<p>The following code snippet illustrates this rule with the default threshold of 5:</p>\n\n<pre>\nswitch (myVariable) {\n  case 0:                     // Compliant - 5 lines till following case\n    System.out.println(\"\");\n    System.out.println(\"\");\n    System.out.println(\"\");\n    break;\n  default:                    // Non-Compliant - 6 lines till switch end\n    System.out.println(\"\");\n    System.out.println(\"\");\n    System.out.println(\"\");\n    System.out.println(\"\");\n    break;\n}\n</pre>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "common-java:InsufficientBranchCoverage",
+      "name": "Insufficient branch coverage by unit tests",
+      "lang": "java",
+      "desc": "<p>An issue is created on a file as soon as the branch coverage on this file is less than the required threshold.It gives the number of branches to be covered in order to reach the required threshold.</p>",
+      "status": "READY",
+      "langName": "Java"
+    }
+  ],
+  "users": [],
+  "languages": [
+    {
+      "key": "js",
+      "name": "JavaScript"
+    },
+    {
+      "key": "java",
+      "name": "Java"
+    }
+  ],
+  "maxResultsReached": false,
+  "paging": {
+    "pageIndex": 1,
+    "pageSize": 50,
+    "total": 10,
+    "fTotal": "10",
+    "pages": 1
+  },
+  "facets": [
+    {
+      "property": "severities",
+      "values": [
+        {
+          "val": "MAJOR",
+          "count": 10
+        },
+        {
+          "val": "INFO",
+          "count": 3
+        },
+        {
+          "val": "MINOR",
+          "count": 0
+        },
+        {
+          "val": "CRITICAL",
+          "count": 0
+        },
+        {
+          "val": "BLOCKER",
+          "count": 0
+        }
+      ]
+    },
+    {
+      "property": "statuses",
+      "values": [
+        {
+          "val": "CONFIRMED",
+          "count": 10
+        },
+        {
+          "val": "OPEN",
+          "count": 0
+        },
+        {
+          "val": "REOPENED",
+          "count": 0
+        },
+        {
+          "val": "RESOLVED",
+          "count": 0
+        },
+        {
+          "val": "CLOSED",
+          "count": 0
+        }
+      ]
+    },
+    {
+      "property": "resolutions",
+      "values": [
+        {
+          "val": "REMOVED",
+          "count": 43
+        },
+        {
+          "val": "FIXED",
+          "count": 4
+        },
+        {
+          "val": "",
+          "count": 10
+        },
+        {
+          "val": "FALSE-POSITIVE",
+          "count": 0
+        }
+      ]
+    },
+    {
+      "property": "projectUuids",
+      "values": [
+        {
+          "val": "69e57151-be0d-4157-adff-c06741d88879",
+          "count": 10
+        }
+      ]
+    },
+    {
+      "property": "componentUuids",
+      "values": [
+        {
+          "val": "90dd5fda-5fce-4d76-bebf-132922abad95",
+          "count": 20
+        },
+        {
+          "val": "e2550527-3f86-4082-a9ae-e345f5a735aa",
+          "count": 10
+        },
+        {
+          "val": "97606f40-f3ef-4922-aa37-f67485917e67",
+          "count": 8
+        },
+        {
+          "val": "6c9c1986-59b3-4839-8dec-9499488f64d1",
+          "count": 7
+        },
+        {
+          "val": "e1b3c47e-e9a2-42ea-9cac-439ce2345d7e",
+          "count": 6
+        }
+      ]
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/search-reopened.json b/server/sonar-web/src/main/js/tests/e2e/tests/issues-spec/search-reopened.json
new file mode 100644 (file)
index 0000000..efd73bc
--- /dev/null
@@ -0,0 +1,485 @@
+{
+  "total": 4,
+  "p": 1,
+  "ps": 50,
+  "projects": [
+    {
+      "uuid": "06a742ea-5c55-4c7e-a2b4-8747c163cb40",
+      "key": "org.codehaus.sonar-plugins:sonar-issues-report-plugin",
+      "id": 17637,
+      "qualifier": "TRK",
+      "name": "Sonar :: Issues Report :: Plugin",
+      "longName": "Sonar :: Issues Report :: Plugin"
+    },
+    {
+      "uuid": "69e57151-be0d-4157-adff-c06741d88879",
+      "key": "org.codehaus.sonar:sonar",
+      "id": 2865,
+      "qualifier": "TRK",
+      "name": "SonarQube",
+      "longName": "SonarQube"
+    },
+    {
+      "uuid": "963cefe8-9128-475f-8d39-636685195e43",
+      "key": "com.sonarsource.rpg:rpg",
+      "id": 27165,
+      "qualifier": "TRK",
+      "name": "SonarSource :: RPG",
+      "longName": "SonarSource :: RPG"
+    }
+  ],
+  "components": [
+    {
+      "uuid": "f62c3080-6e75-4940-ae95-7dae743bcac3",
+      "key": "org.codehaus.sonar:sonar-server:src/main/java/org/sonar/server/search/request/ProxySearchScrollRequestBuilder.java",
+      "id": 35659,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "ProxySearchScrollRequestBuilder.java",
+      "longName": "src/main/java/org/sonar/server/search/request/ProxySearchScrollRequestBuilder.java",
+      "path": "src/main/java/org/sonar/server/search/request/ProxySearchScrollRequestBuilder.java",
+      "projectId": 2865,
+      "subProjectId": 2872
+    },
+    {
+      "uuid": "69e57151-be0d-4157-adff-c06741d88879",
+      "key": "org.codehaus.sonar:sonar",
+      "id": 2865,
+      "enabled": true,
+      "qualifier": "TRK",
+      "name": "SonarQube",
+      "longName": "SonarQube"
+    },
+    {
+      "uuid": "0160edec-b7ca-49a1-93ca-a6ea2c38ed21",
+      "key": "org.codehaus.sonar-plugins:sonar-issues-report-plugin:src/main/java/org/sonar/issuesreport/IssuesReportPlugin.java",
+      "id": 17639,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "IssuesReportPlugin.java",
+      "longName": "src/main/java/org/sonar/issuesreport/IssuesReportPlugin.java",
+      "path": "src/main/java/org/sonar/issuesreport/IssuesReportPlugin.java",
+      "projectId": 17637,
+      "subProjectId": 17637
+    },
+    {
+      "uuid": "6acccd14-18f8-436e-9a20-1d2d1f91295b",
+      "key": "com.sonarsource.rpg:rpg-analyzer:src/main/java/com/sonar/rpg/parser/Parser.java",
+      "id": 27173,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "Parser.java",
+      "longName": "src/main/java/com/sonar/rpg/parser/Parser.java",
+      "path": "src/main/java/com/sonar/rpg/parser/Parser.java",
+      "projectId": 27165,
+      "subProjectId": 27166
+    },
+    {
+      "uuid": "06a742ea-5c55-4c7e-a2b4-8747c163cb40",
+      "key": "org.codehaus.sonar-plugins:sonar-issues-report-plugin",
+      "id": 17637,
+      "enabled": true,
+      "qualifier": "TRK",
+      "name": "Sonar :: Issues Report :: Plugin",
+      "longName": "Sonar :: Issues Report :: Plugin"
+    },
+    {
+      "uuid": "98662175-0f52-4f83-b0e9-1e9444320b5b",
+      "key": "org.codehaus.sonar-plugins:sonar-issues-report-plugin:src/main/java/org/sonar/issuesreport/ReportJob.java",
+      "id": 17640,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "ReportJob.java",
+      "longName": "src/main/java/org/sonar/issuesreport/ReportJob.java",
+      "path": "src/main/java/org/sonar/issuesreport/ReportJob.java",
+      "projectId": 17637,
+      "subProjectId": 17637
+    },
+    {
+      "uuid": "a6b74bc6-94b9-431f-b7fd-524553d42405",
+      "key": "com.sonarsource.rpg:rpg-analyzer",
+      "id": 27166,
+      "enabled": true,
+      "qualifier": "BRC",
+      "name": "SonarSource :: RPG :: Analyzer",
+      "longName": "SonarSource :: RPG :: Analyzer",
+      "path": "rpg-analyzer",
+      "projectId": 27165,
+      "subProjectId": 27165
+    },
+    {
+      "uuid": "e1f6f8bd-6b5f-4e2d-b936-4abffc9e4264",
+      "key": "org.codehaus.sonar:sonar-server",
+      "id": 2872,
+      "enabled": true,
+      "qualifier": "BRC",
+      "name": "SonarQube :: Server",
+      "longName": "SonarQube :: Server",
+      "path": "sonar-server",
+      "projectId": 2865,
+      "subProjectId": 2865
+    },
+    {
+      "uuid": "963cefe8-9128-475f-8d39-636685195e43",
+      "key": "com.sonarsource.rpg:rpg",
+      "id": 27165,
+      "enabled": true,
+      "qualifier": "TRK",
+      "name": "SonarSource :: RPG",
+      "longName": "SonarSource :: RPG"
+    }
+  ],
+  "issues": [
+    {
+      "key": "80f1562f-9f64-48a9-a6bb-1dcd2ebf444a",
+      "component": "org.codehaus.sonar-plugins:sonar-issues-report-plugin:src/main/java/org/sonar/issuesreport/IssuesReportPlugin.java",
+      "componentId": 17639,
+      "project": "org.codehaus.sonar-plugins:sonar-issues-report-plugin",
+      "rule": "squid:S1161",
+      "status": "REOPENED",
+      "severity": "MINOR",
+      "message": "Add the \"@Override\" annotation above this method signature",
+      "line": 61,
+      "debt": "5min",
+      "assignee": "julien.henry",
+      "author": "julien.henry@sonarsource.com",
+      "creationDate": "2014-10-09T23:03:12+0200",
+      "updateDate": "2014-11-24T08:11:19+0100",
+      "fUpdateAge": "14 days",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ],
+      "assigneeName": "Julien Henry"
+    },
+    {
+      "key": "9eae5201-96c7-4e78-a407-8d58479c98a3",
+      "component": "org.codehaus.sonar-plugins:sonar-issues-report-plugin:src/main/java/org/sonar/issuesreport/ReportJob.java",
+      "componentId": 17640,
+      "project": "org.codehaus.sonar-plugins:sonar-issues-report-plugin",
+      "rule": "squid:S1161",
+      "status": "REOPENED",
+      "severity": "MAJOR",
+      "message": "Add the \"@Override\" annotation above this method signature",
+      "line": 39,
+      "debt": "5min",
+      "assignee": "julien.henry",
+      "author": "julien.henry@sonarsource.com",
+      "creationDate": "2014-10-09T23:03:12+0200",
+      "updateDate": "2014-11-18T08:25:31+0100",
+      "fUpdateAge": "20 days",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ],
+      "assigneeName": "Julien Henry"
+    },
+    {
+      "key": "50bfc04f-6137-457a-a967-f6b1b7345365",
+      "component": "org.codehaus.sonar:sonar-server:src/main/java/org/sonar/server/search/request/ProxySearchScrollRequestBuilder.java",
+      "componentId": 35659,
+      "project": "org.codehaus.sonar:sonar",
+      "subProject": "org.codehaus.sonar:sonar-server",
+      "rule": "common-java:InsufficientBranchCoverage",
+      "status": "REOPENED",
+      "severity": "MAJOR",
+      "message": "1 more branches need to be covered by unit tests to reach the minimum threshold of 65.0% branch coverage.",
+      "debt": "10min",
+      "assignee": "julien.lancelot",
+      "creationDate": "2014-11-04T14:51:27+0100",
+      "updateDate": "2014-11-10T23:29:27+0100",
+      "fUpdateAge": "27 days",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ],
+      "assigneeName": "Julien Lancelot"
+    },
+    {
+      "key": "7012d6fc-e663-4032-aba6-70c4522453b4",
+      "component": "com.sonarsource.rpg:rpg-analyzer:src/main/java/com/sonar/rpg/parser/Parser.java",
+      "componentId": 27173,
+      "project": "com.sonarsource.rpg:rpg",
+      "subProject": "com.sonarsource.rpg:rpg-analyzer",
+      "rule": "squid:S1994",
+      "status": "REOPENED",
+      "severity": "MAJOR",
+      "message": "This loop's stop condition tests \"isEndOfFile()\" but the incrementer updates \"lineNumber\".",
+      "line": 69,
+      "debt": "20min",
+      "assignee": "pierre-yves.nicolas",
+      "author": "pierre-yves.nicolas@sonarsource.com",
+      "creationDate": "2014-10-09T23:05:10+0200",
+      "updateDate": "2014-10-31T10:33:08+0100",
+      "fUpdateAge": "about a month",
+      "comments": [
+        {
+          "key": "9d2b1d6e-9c9c-4ff2-bc55-af622922c4f0",
+          "login": "evgeny.mandrikov",
+          "userName": "Evgeny Mandrikov",
+          "htmlText": "Severity changed from &quot;critical&quot; to &quot;major&quot;, because this is a new Java rule.<br/>Also message looks suspicious. Nico, could you please take a look?",
+          "markdown": "Severity changed from \"critical\" to \"major\", because this is a new Java rule.\nAlso message looks suspicious. Nico, could you please take a look?",
+          "updatable": false,
+          "createdAt": "2014-10-10T15:49:23+0200"
+        },
+        {
+          "key": "583033bd-c0be-4865-ba86-f1773c712bba",
+          "login": "nicolas.peru",
+          "userName": "Nicolas Peru",
+          "htmlText": "message has been improved in <a href=\"https://github.com/SonarSource/sonar-java/commit/d1e4fa74ada69039958dbff8a94c776fd6be6639\" target=\"_blank\">https://github.com/SonarSource/sonar-java/commit/d1e4fa74ada69039958dbff8a94c776fd6be6639</a>",
+          "markdown": "message has been improved in https://github.com/SonarSource/sonar-java/commit/d1e4fa74ada69039958dbff8a94c776fd6be6639",
+          "updatable": false,
+          "createdAt": "2014-10-13T17:38:52+0200"
+        }
+      ],
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ],
+      "assigneeName": "Pierre-Yves Nicolas"
+    }
+  ],
+  "rules": [
+    {
+      "key": "squid:S1994",
+      "name": "\"for\" loop incrementers should modify the variable being tested in the loop's stop condition",
+      "lang": "java",
+      "desc": "<p>It is almost always an error when a <code>for</code> loop's stop condition and incrementer don't act on the same variable. Even when it is not, it could confuse future maintainers of the code, and should be avoided.</p>\n\n<h2>Noncompliant Code Example</h2>\n<pre>\nfor (i = 0; i < 10; j++) {  // Noncompliant\n  // ...\n}\n</pre>\n\n<h2>Compliant Solution</h2>\n<pre>\nfor (i = 0; i < 10; i++) {\n  // ...\n}\n</pre>",
+      "status": "REMOVED",
+      "langName": "Java"
+    },
+    {
+      "key": "common-java:InsufficientBranchCoverage",
+      "name": "Insufficient branch coverage by unit tests",
+      "lang": "java",
+      "desc": "<p>An issue is created on a file as soon as the branch coverage on this file is less than the required threshold.It gives the number of branches to be covered in order to reach the required threshold.</p>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:S1161",
+      "name": "\"@Override\" annotation should be used on any method overriding (since Java 5) or implementing (since Java 6) another one",
+      "lang": "java",
+      "desc": "<p>Using the <code>@Override</code> annotation is useful for two reasons :</p>\n<ul>\n  <li>It elicits a warning from the compiler if the annotated method doesn't actually override anything, as in the case of a misspelling.</li>\n  <li>It improves the readability of the source code by making it obvious that methods are overridden.</li>\n</ul>\n<h2>Noncompliant Code Example</h2>\n<pre>\nclass ParentClass {\n  public boolean doSomething(){...}\n}\nclass FirstChildClass extends ParentClass {\n  public boolean doSomething(){...}  //Non-Compliant\n}\n</pre>\n\n<h2>Compliant Solution</h2>\n<pre>\nclass ParentClass {\n  public boolean doSomething(){...}\n}\nclass FirstChildClass extends ParentClass {\n  @Override\n  public boolean doSomething(){...}  //Compliant\n}\n</pre>",
+      "status": "REMOVED",
+      "langName": "Java"
+    }
+  ],
+  "users": [
+    {
+      "login": "julien.lancelot",
+      "name": "Julien Lancelot",
+      "active": true,
+      "email": "julien.lancelot@sonarsource.com"
+    },
+    {
+      "login": "pierre-yves.nicolas",
+      "name": "Pierre-Yves Nicolas",
+      "active": true,
+      "email": "pierre-yves.nicolas@sonarsource.com"
+    },
+    {
+      "login": "admin",
+      "name": "Admin Admin",
+      "active": true,
+      "email": "admin@sonarsource.com"
+    },
+    {
+      "login": "nicolas.peru",
+      "name": "Nicolas Peru",
+      "active": true,
+      "email": "nicolas.peru@sonarsource.com"
+    },
+    {
+      "login": "julien.henry",
+      "name": "Julien Henry",
+      "active": true,
+      "email": "julien.henry@sonarsource.com"
+    },
+    {
+      "login": "evgeny.mandrikov",
+      "name": "Evgeny Mandrikov",
+      "active": true,
+      "email": "evgeny.mandrikov@sonarsource.com"
+    }
+  ],
+  "actionPlans": [
+    {
+      "key": "1b9e7e52-ff58-40c1-80bf-f68429a3275e",
+      "name": "5.0",
+      "status": "OPEN",
+      "project": "org.codehaus.sonar:sonar",
+      "userLogin": "fabrice.bellingard",
+      "createdAt": "2014-09-01T17:14:55+0200",
+      "fCreatedAt": "Sep 1, 2014 5:14 PM",
+      "updatedAt": "2014-09-01T17:14:55+0200",
+      "fUpdatedAt": "Sep 1, 2014 5:14 PM"
+    },
+    {
+      "key": "151b796f-c5e1-40c9-89c0-ca391e8a31c0",
+      "name": "CPP 3.3",
+      "status": "OPEN",
+      "project": "com.sonarsource.cpp:cpp",
+      "userLogin": "eric.hartmann",
+      "createdAt": "2014-10-27T15:15:34+0100",
+      "fCreatedAt": "Oct 27, 2014 3:15 PM",
+      "updatedAt": "2014-10-27T15:15:34+0100",
+      "fUpdatedAt": "Oct 27, 2014 3:15 PM"
+    },
+    {
+      "key": "6f967cd5-687b-49ac-b4e3-b8d392374557",
+      "name": "4.5",
+      "status": "CLOSED",
+      "project": "org.codehaus.sonar:sonar",
+      "userLogin": "freddy.mallet",
+      "createdAt": "2014-07-01T21:22:52+0200",
+      "fCreatedAt": "Jul 1, 2014 9:22 PM",
+      "updatedAt": "2014-09-10T15:44:24+0200",
+      "fUpdatedAt": "Sep 10, 2014 3:44 PM"
+    }
+  ],
+  "languages": [
+    {
+      "key": "js",
+      "name": "JavaScript"
+    },
+    {
+      "key": "java",
+      "name": "Java"
+    }
+  ],
+  "maxResultsReached": false,
+  "paging": {
+    "pageIndex": 1,
+    "pageSize": 50,
+    "total": 4,
+    "fTotal": "4",
+    "pages": 1
+  },
+  "facets": [
+    {
+      "property": "severities",
+      "values": [
+        {
+          "val": "MAJOR",
+          "count": 3
+        },
+        {
+          "val": "MINOR",
+          "count": 1
+        },
+        {
+          "val": "INFO",
+          "count": 0
+        },
+        {
+          "val": "CRITICAL",
+          "count": 0
+        },
+        {
+          "val": "BLOCKER",
+          "count": 0
+        }
+      ]
+    },
+    {
+      "property": "statuses",
+      "values": [
+        {
+          "val": "CONFIRMED",
+          "count": 4583
+        },
+        {
+          "val": "OPEN",
+          "count": 324
+        },
+        {
+          "val": "REOPENED",
+          "count": 4
+        },
+        {
+          "val": "RESOLVED",
+          "count": 0
+        },
+        {
+          "val": "CLOSED",
+          "count": 0
+        }
+      ]
+    },
+    {
+      "property": "resolutions",
+      "values": [
+        {
+          "val": "",
+          "count": 4
+        },
+        {
+          "val": "FALSE-POSITIVE",
+          "count": 0
+        },
+        {
+          "val": "FIXED",
+          "count": 0
+        },
+        {
+          "val": "REMOVED",
+          "count": 0
+        }
+      ]
+    },
+    {
+      "property": "actionPlans",
+      "values": [
+        {
+          "val": "1b9e7e52-ff58-40c1-80bf-f68429a3275e",
+          "count": 4
+        },
+        {
+          "val": "151b796f-c5e1-40c9-89c0-ca391e8a31c0",
+          "count": 2
+        },
+        {
+          "val": "6f967cd5-687b-49ac-b4e3-b8d392374557",
+          "count": 1
+        },
+        {
+          "val": "",
+          "count": 4
+        }
+      ]
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-favorite-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-favorite-spec.js
new file mode 100644 (file)
index 0000000..3f268df
--- /dev/null
@@ -0,0 +1,68 @@
+/* global casper:false */
+
+var lib = require('../lib'),
+    testName = lib.testName('Source Viewer');
+
+lib.initMessages();
+lib.changeWorkingDirectory('source-viewer-spec');
+
+
+casper.test.begin(testName('Mark as Favorite'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequest('/api/favourites', '{}', { type: 'POST' });
+        lib.mockRequest('/api/favourites/*', '{}', { type: 'DELETE' });
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        test.assertExists('.js-favorite');
+        test.assertExists('.icon-not-favorite');
+        casper.click('.js-favorite');
+        casper.waitForSelector('.icon-favorite', function () {
+          test.assertExists('.icon-favorite');
+          casper.click('.js-favorite');
+          casper.waitForSelector('.icon-not-favorite', function () {
+            test.assertExists('.icon-not-favorite');
+          });
+        });
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Don\'t Show Favorite If Not Logged In'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'app-not-logged-in.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        test.assertDoesntExist('.js-favorite');
+        test.assertDoesntExist('.icon-favorite');
+        test.assertDoesntExist('.icon-not-favorite');
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-link-to-raw-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-link-to-raw-spec.js
new file mode 100644 (file)
index 0000000..d4ae21d
--- /dev/null
@@ -0,0 +1,40 @@
+/* global casper:false */
+
+var lib = require('../lib'),
+    testName = lib.testName('Source Viewer');
+
+lib.initMessages();
+lib.changeWorkingDirectory('source-viewer-spec');
+
+
+casper.test.begin(testName('Link to Raw'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        casper.click('.js-actions');
+        casper.waitForSelector('.js-raw-source', function () {
+          casper.click('.js-raw-source');
+        });
+      })
+
+      .then(function () {
+        casper.withPopup(/Cache\.java/, function () {
+          this.test.assertUrlMatch('org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java');
+        });
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file.js b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file.js
new file mode 100644 (file)
index 0000000..3b64a89
--- /dev/null
@@ -0,0 +1,58 @@
+/* global casper:false */
+
+var lib = require('../lib'),
+    testName = lib.testName('Source Viewer');
+
+lib.initMessages();
+lib.changeWorkingDirectory('source-viewer-should-show-measures-for-test-file');
+
+casper.test.begin(testName('Should Show Measures For Test File'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'api-components-app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'api-sources-lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'api-issues-search.json');
+        lib.mockRequestFromFile('/api/resources', 'api-resources.json');
+        lib.mockRequestFromFile('/api/tests/show', 'api-tests-show.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        casper.click('.js-actions');
+        casper.waitForSelector('.js-measures', function () {
+          casper.click('.js-measures');
+          casper.waitForSelector('.source-viewer-measures');
+        });
+      })
+
+      .then(function () {
+        // The test data is built the specific way when the formatted value
+        // of a measure is equal to the measure name.
+        var metrics = [
+          'tests',
+          'test_success_density',
+          'test_failures',
+          'test_errors',
+          'skipped_tests',
+          'test_execution_time'
+        ];
+        metrics.forEach(function (metric) {
+          test.assertSelectorContains('.measure[data-metric=' + metric + ']', metric);
+        });
+      })
+
+      .then(function () {
+        casper.click('.overlay-popup-close');
+        test.assertDoesntExist('.source-viewer-measures');
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-components-app.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-components-app.json
new file mode 100644 (file)
index 0000000..a9fbf38
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  "key": "test:fake-project-for-tests:src/test/java/foo/SimplestTest.java",
+  "path": "src/test/java/foo/SimplestTest.java",
+  "name": "SimplestTest.java",
+  "longName": "src/test/java/foo/SimplestTest.java",
+  "q": "UTS",
+  "project": "test:fake-project-for-tests",
+  "projectName": "Fake Project for Tests",
+  "fav": false,
+  "canMarkAsFavourite": true,
+  "canBulkChange": true,
+  "canCreateManualIssue": true,
+  "periods": [
+    [
+      1,
+      "since previous analysis (2014 Dec 09)",
+      "2014-12-09T10:47:33+0100"
+    ],
+    [
+      2,
+      "over 365 days (2014 Dec 09)",
+      "2014-12-09T10:47:33+0100"
+    ]
+  ],
+  "severities": [],
+  "rules": [],
+  "measures": {
+    "fTests": "3",
+    "fIssues": "0"
+  },
+  "tabs": [
+    "scm"
+  ],
+  "manual_rules": [
+    {
+      "key": "manual:api",
+      "name": "API"
+    },
+    {
+      "key": "manual:design",
+      "name": "Design"
+    },
+    {
+      "key": "manual:error_handling",
+      "name": "Error handling"
+    },
+    {
+      "key": "manual:performance",
+      "name": "Performance"
+    },
+    {
+      "key": "manual:sql_pitfalls",
+      "name": "SQL Pitfall"
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-issues-search.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-issues-search.json
new file mode 100644 (file)
index 0000000..24f1c1c
--- /dev/null
@@ -0,0 +1,66 @@
+{
+  "total": 0,
+  "p": 1,
+  "ps": 100,
+  "projects": [
+    {
+      "uuid": "e07e9bed-f45d-4538-a5e8-77031c1ecae7",
+      "key": "test:fake-project-for-tests",
+      "id": 36125,
+      "qualifier": "TRK",
+      "name": "Fake Project for Tests",
+      "longName": "Fake Project for Tests"
+    }
+  ],
+  "components": [
+    {
+      "uuid": "58f53b48-f375-4e3d-9b84-1c0e5a373f62",
+      "key": "test:fake-project-for-tests:src/test/java/foo/SimplestTest.java",
+      "id": 36134,
+      "enabled": true,
+      "qualifier": "UTS",
+      "name": "SimplestTest.java",
+      "longName": "src/test/java/foo/SimplestTest.java",
+      "path": "src/test/java/foo/SimplestTest.java",
+      "projectId": 36125,
+      "subProjectId": 36125
+    },
+    {
+      "uuid": "e07e9bed-f45d-4538-a5e8-77031c1ecae7",
+      "key": "test:fake-project-for-tests",
+      "id": 36125,
+      "enabled": true,
+      "qualifier": "TRK",
+      "name": "Fake Project for Tests",
+      "longName": "Fake Project for Tests"
+    }
+  ],
+  "issues": [],
+  "rules": [],
+  "users": [
+    {
+      "login": "admin",
+      "name": "Admin Admin",
+      "active": true,
+      "email": "admin@sonarsource.com"
+    }
+  ],
+  "languages": [
+    {
+      "key": "js",
+      "name": "JavaScript"
+    },
+    {
+      "key": "java",
+      "name": "Java"
+    }
+  ],
+  "maxResultsReached": false,
+  "paging": {
+    "pageIndex": 1,
+    "pageSize": 100,
+    "total": 0,
+    "fTotal": "0",
+    "pages": 0
+  }
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-resources.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-resources.json
new file mode 100644 (file)
index 0000000..42e8c10
--- /dev/null
@@ -0,0 +1,45 @@
+[
+  {
+    "id": 36129,
+    "key": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+    "name": "Simplest.java",
+    "scope": "FIL",
+    "qualifier": "FIL",
+    "date": "2014-12-09T10:58:44+0100",
+    "creationDate": "2014-12-09T10:47:35+0100",
+    "lname": "src/main/java/foo/Simplest.java",
+    "lang": "java",
+    "msr": [
+      {
+        "key": "tests",
+        "val": 1,
+        "frmt_val": "tests"
+      },
+      {
+        "key": "test_success_density",
+        "val": 1,
+        "frmt_val": "test_success_density"
+      },
+      {
+        "key": "test_failures",
+        "val": 1,
+        "frmt_val": "test_failures"
+      },
+      {
+        "key": "test_errors",
+        "val": 1,
+        "frmt_val": "test_errors"
+      },
+      {
+        "key": "skipped_tests",
+        "val": 1,
+        "frmt_val": "skipped_tests"
+      },
+      {
+        "key": "test_execution_time",
+        "val": 1,
+        "frmt_val": "test_execution_time"
+      }
+    ]
+  }
+]
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-sources-lines.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-sources-lines.json
new file mode 100644 (file)
index 0000000..b095d82
--- /dev/null
@@ -0,0 +1,130 @@
+{
+  "sources": [
+    {
+      "line": 1,
+      "code": "<span class=\"k\">package </span>foo;",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 2,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 3,
+      "code": "<span class=\"cppd\">/**</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "37acee5ff6e67cdb501c08a656fbabf21160b052",
+      "scmDate": "2013-09-19T15:37:05+0200"
+    },
+    {
+      "line": 4,
+      "code": "<span class=\"cppd\"> * Simple class</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "37acee5ff6e67cdb501c08a656fbabf21160b052",
+      "scmDate": "2013-09-19T15:37:05+0200"
+    },
+    {
+      "line": 5,
+      "code": "<span class=\"cppd\"> */</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "37acee5ff6e67cdb501c08a656fbabf21160b052",
+      "scmDate": "2013-09-19T15:37:05+0200"
+    },
+    {
+      "line": 6,
+      "code": "<span class=\"k\">public </span><span class=\"k\">class </span><span class=\"sym-1 sym\">Simplest</span> {",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 7,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 8,
+      "code": "    <span class=\"k\">public </span><span class=\"k\">static </span><span class=\"k\">int </span><span class=\"sym-2 sym\">add</span>(<span class=\"k\">int </span><span class=\"sym-3 sym\">a</span>, <span class=\"k\">int </span><span class=\"sym-4 sym\">b</span>) {",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 9,
+      "code": "    \t<span class=\"cppd\">// introduce a variable that is not needed - just to get a violation</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "322e4e8b3cb54a39651f563273745e6ee737fb3e",
+      "scmDate": "2013-10-15T16:14:22+0200"
+    },
+    {
+      "line": 10,
+      "code": "    \t<span class=\"k\">int </span><span class=\"sym-5 sym\">result</span> = <span class=\"sym-3 sym\">a</span> + <span class=\"sym-4 sym\">b</span>;",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "322e4e8b3cb54a39651f563273745e6ee737fb3e",
+      "scmDate": "2013-10-15T16:14:22+0200"
+    },
+    {
+      "line": 11,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "44e0c5b4fc18a006a405d3f3d489896245fab3d1",
+      "scmDate": "2014-01-09T16:48:59+0100"
+    },
+    {
+      "line": 12,
+      "code": "    \tSystem.out.println(<span class=\"s\">\"\"</span>);",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "44e0c5b4fc18a006a405d3f3d489896245fab3d1",
+      "scmDate": "2014-01-09T16:48:59+0100"
+    },
+    {
+      "line": 13,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "44e0c5b4fc18a006a405d3f3d489896245fab3d1",
+      "scmDate": "2014-01-09T16:48:59+0100"
+    },
+    {
+      "line": 14,
+      "code": "        <span class=\"k\">return </span><span class=\"sym-5 sym\">result</span>;",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "322e4e8b3cb54a39651f563273745e6ee737fb3e",
+      "scmDate": "2013-10-15T16:14:22+0200"
+    },
+    {
+      "line": 15,
+      "code": "    }",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 16,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 17,
+      "code": "}",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 18,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-tests-show.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures-for-test-file/api-tests-show.json
new file mode 100644 (file)
index 0000000..4a6dc47
--- /dev/null
@@ -0,0 +1,27 @@
+{"tests": [
+  {
+    "name": "testOK",
+    "status": "OK",
+    "durationInMs": 9,
+    "coveredLines": 3
+  },
+  {
+    "name": "testERROR",
+    "status": "ERROR",
+    "durationInMs": 8,
+    "coveredLines": 4,
+    "stackTrace": "stacktrace error"
+  },
+  {
+    "name": "testFAILURE",
+    "status": "FAILURE",
+    "durationInMs": 7,
+    "coveredLines": 5,
+    "message": "message failure",
+    "stackTrace": "stacktrace failure"
+  },
+  {
+    "name": "testSKIPPED",
+    "status": "SKIPPED"
+  }
+]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures.js b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures.js
new file mode 100644 (file)
index 0000000..71a1254
--- /dev/null
@@ -0,0 +1,102 @@
+/* global casper:false */
+
+var lib = require('../lib'),
+    testName = lib.testName('Source Viewer');
+
+lib.initMessages();
+lib.changeWorkingDirectory('source-viewer-should-show-measures');
+
+
+casper.test.begin(testName('Should Show Measures'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'api-components-app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'api-sources-lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'api-issues-search.json');
+        lib.mockRequestFromFile('/api/resources', 'api-resources.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        casper.click('.js-actions');
+        casper.waitForSelector('.js-measures', function () {
+          casper.click('.js-measures');
+          casper.waitForSelector('.source-viewer-measures');
+        });
+      })
+
+      .then(function () {
+        // The test data is built the specific way when the formatted value
+        // of a measure is equal to the measure name.
+        var metrics = [
+          'accessors',
+          'classes',
+          'functions',
+          'statements',
+          'ncloc',
+          'lines',
+          'generated_ncloc',
+          'generated_lines',
+          'complexity',
+          'function_complexity',
+          'comment_lines',
+          'comment_lines_density',
+          'public_api',
+          'public_undocumented_api',
+          'public_documented_api_density',
+
+          'coverage',
+          'line_coverage',
+          'lines_to_cover',
+          'uncovered_lines',
+          'branch_coverage',
+          'conditions_to_cover',
+          'uncovered_conditions',
+          'it_coverage',
+          'it_line_coverage',
+          'it_lines_to_cover',
+          'it_uncovered_lines',
+          'it_branch_coverage',
+          'it_conditions_to_cover',
+          'it_uncovered_conditions',
+          'overall_coverage',
+          'overall_line_coverage',
+          'overall_lines_to_cover',
+          'overall_uncovered_lines',
+          'overall_branch_coverage',
+          'overall_conditions_to_cover',
+          'overall_uncovered_conditions',
+
+          'violations',
+          'sqale_index',
+          'sqale_debt_ratio',
+          'blocker_violations',
+          'critical_violations',
+          'major_violations',
+          'minor_violations',
+          'info_violations',
+
+          'duplicated_lines_density',
+          'duplicated_blocks',
+          'duplicated_lines'
+        ];
+        metrics.forEach(function (metric) {
+          test.assertSelectorContains('.measure[data-metric=' + metric + ']', metric);
+        });
+      })
+
+      .then(function () {
+        casper.click('.overlay-popup-close');
+        test.assertDoesntExist('.source-viewer-measures');
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-components-app.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-components-app.json
new file mode 100644 (file)
index 0000000..25b2e1e
--- /dev/null
@@ -0,0 +1,95 @@
+{
+  "key": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+  "path": "src/main/java/foo/Simplest.java",
+  "name": "Simplest.java",
+  "longName": "src/main/java/foo/Simplest.java",
+  "q": "FIL",
+  "project": "test:fake-project-for-tests",
+  "projectName": "Fake Project for Tests",
+  "fav": false,
+  "canMarkAsFavourite": true,
+  "canBulkChange": true,
+  "canCreateManualIssue": true,
+  "periods": [
+    [
+      1,
+      "since previous analysis (2014 Dec 09)",
+      "2014-12-09T10:47:33+0100"
+    ],
+    [
+      2,
+      "over 365 days (2014 Dec 09)",
+      "2014-12-09T10:47:33+0100"
+    ]
+  ],
+  "severities": [
+    [
+      "MINOR",
+      "Minor",
+      1
+    ],
+    [
+      "MAJOR",
+      "Major",
+      4
+    ]
+  ],
+  "rules": [
+    [
+      "squid:IndentationCheck",
+      "Source code should be correctly indented",
+      2
+    ],
+    [
+      "squid:S1118",
+      "Utility classes should not have a public constructor",
+      1
+    ],
+    [
+      "squid:S00105",
+      "Tabulation characters should not be used",
+      1
+    ],
+    [
+      "squid:S106",
+      "System.out and System.err should not be used as loggers",
+      1
+    ]
+  ],
+  "measures": {
+    "fNcloc": "8",
+    "fCoverage": "75.0%",
+    "fDebt": "44min",
+    "fSqaleRating": "C",
+    "fSqaleDebtRatio": "18.3%",
+    "fIssues": "5",
+    "fMinorIssues": "1",
+    "fMajorIssues": "4"
+  },
+  "tabs": [
+    "scm",
+    "coverage"
+  ],
+  "manual_rules": [
+    {
+      "key": "manual:api",
+      "name": "API"
+    },
+    {
+      "key": "manual:design",
+      "name": "Design"
+    },
+    {
+      "key": "manual:error_handling",
+      "name": "Error handling"
+    },
+    {
+      "key": "manual:performance",
+      "name": "Performance"
+    },
+    {
+      "key": "manual:sql_pitfalls",
+      "name": "SQL Pitfall"
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-issues-search.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-issues-search.json
new file mode 100644 (file)
index 0000000..73d6a9f
--- /dev/null
@@ -0,0 +1,234 @@
+{
+  "total": 5,
+  "p": 1,
+  "ps": 100,
+  "projects": [
+    {
+      "uuid": "e07e9bed-f45d-4538-a5e8-77031c1ecae7",
+      "key": "test:fake-project-for-tests",
+      "id": 36125,
+      "qualifier": "TRK",
+      "name": "Fake Project for Tests",
+      "longName": "Fake Project for Tests"
+    }
+  ],
+  "components": [
+    {
+      "uuid": "b4248001-df0c-436a-8acd-a152809b8a23",
+      "key": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+      "id": 36129,
+      "enabled": true,
+      "qualifier": "FIL",
+      "name": "Simplest.java",
+      "longName": "src/main/java/foo/Simplest.java",
+      "path": "src/main/java/foo/Simplest.java",
+      "projectId": 36125,
+      "subProjectId": 36125
+    },
+    {
+      "uuid": "e07e9bed-f45d-4538-a5e8-77031c1ecae7",
+      "key": "test:fake-project-for-tests",
+      "id": 36125,
+      "enabled": true,
+      "qualifier": "TRK",
+      "name": "Fake Project for Tests",
+      "longName": "Fake Project for Tests"
+    }
+  ],
+  "issues": [
+    {
+      "key": "91b13078-6f69-4b51-ab0f-8fd0bc391532",
+      "component": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+      "componentId": 36129,
+      "project": "test:fake-project-for-tests",
+      "rule": "squid:S00105",
+      "status": "OPEN",
+      "severity": "MINOR",
+      "message": "Replace all tab characters in this file by sequences of white-spaces.",
+      "debt": "2min",
+      "creationDate": "2014-12-09T10:47:33+0100",
+      "updateDate": "2014-12-09T10:47:33+0100",
+      "fUpdateAge": "3 hours",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ]
+    },
+    {
+      "key": "c18ae6fa-fac7-46b5-bd71-feef7906b05a",
+      "component": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+      "componentId": 36129,
+      "project": "test:fake-project-for-tests",
+      "rule": "squid:S1118",
+      "status": "OPEN",
+      "severity": "MAJOR",
+      "message": "Add a private constructor to hide the implicit public one.",
+      "line": 6,
+      "debt": "30min",
+      "creationDate": "2014-12-09T10:47:33+0100",
+      "updateDate": "2014-12-09T10:47:33+0100",
+      "fUpdateAge": "3 hours",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ]
+    },
+    {
+      "key": "816282ec-0ca9-4d03-b8bc-22b515496fe4",
+      "component": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+      "componentId": 36129,
+      "project": "test:fake-project-for-tests",
+      "rule": "squid:IndentationCheck",
+      "status": "OPEN",
+      "severity": "MAJOR",
+      "message": "Make this line start at column 3.",
+      "line": 8,
+      "debt": "1min",
+      "creationDate": "2014-12-09T10:47:33+0100",
+      "updateDate": "2014-12-09T10:47:33+0100",
+      "fUpdateAge": "3 hours",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ]
+    },
+    {
+      "key": "0229497b-a613-48f3-83ed-2b98983e5e60",
+      "component": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+      "componentId": 36129,
+      "project": "test:fake-project-for-tests",
+      "rule": "squid:IndentationCheck",
+      "status": "OPEN",
+      "severity": "MAJOR",
+      "message": "Make this line start at column 5.",
+      "line": 10,
+      "debt": "1min",
+      "creationDate": "2014-12-09T10:47:33+0100",
+      "updateDate": "2014-12-09T10:47:33+0100",
+      "fUpdateAge": "3 hours",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ]
+    },
+    {
+      "key": "896ccfe0-bb85-4155-be1f-1aaece716539",
+      "component": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+      "componentId": 36129,
+      "project": "test:fake-project-for-tests",
+      "rule": "squid:S106",
+      "status": "OPEN",
+      "severity": "MAJOR",
+      "message": "Replace this usage of System.out or System.err by a logger.",
+      "line": 12,
+      "debt": "10min",
+      "creationDate": "2014-12-09T10:47:33+0100",
+      "updateDate": "2014-12-09T10:47:33+0100",
+      "fUpdateAge": "3 hours",
+      "actions": [
+        "comment",
+        "assign",
+        "assign_to_me",
+        "plan",
+        "set_severity"
+      ],
+      "transitions": [
+        "confirm",
+        "resolve",
+        "falsepositive"
+      ]
+    }
+  ],
+  "rules": [
+    {
+      "key": "squid:IndentationCheck",
+      "name": "Source code should be correctly indented",
+      "lang": "java",
+      "desc": "<p>\nProper indentation is a simple and effective way to improve the code's readability.\nConsistent indentation among developers also reduces the differences that are committed to source control systems, making code reviews easier.\n</p>\n\n<p>The following code illustrates this rule with an indentation level of 2:</p>\n\n<pre>\nclass Foo {\n  public int a; // Compliant\npublic int b;   // Non-Compliant\n}\n</pre>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:S1118",
+      "name": "Utility classes should not have a public constructor",
+      "lang": "java",
+      "desc": "<p>\nUtility classes, which are a collection of static members, are not meant to be instantiated.\nThey should therefore not have public constructors.\n</p>\n\n<p>\nJava adds an implicit public constructor to every class which does not define at least one explicitly.\nHence, at least one non-public constructor should be defined.\n</p>\n\n<p>The following code:</p>\n\n<pre>\nclass StringUtils { // Non-Compliant\n\n  public static String concatenate(String s1, String s2) {\n    return s1 + s2;\n  }\n\n}\n</pre>\n\n<p>should be refactored into:</p>\n\n<pre>\nclass StringUtils { // Compliant\n\n  private StringUtils() {\n  }\n\n  public static String concatenate(String s1, String s2) {\n    return s1 + s2;\n  }\n\n}\n</pre>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:S00105",
+      "name": "Tabulation characters should not be used",
+      "lang": "java",
+      "desc": "<p>\nDevelopers should not need to configure the tab width of their text editors in order to be able to read source code.\nSo the use of tabulation character must be banned.\n</p>",
+      "status": "READY",
+      "langName": "Java"
+    },
+    {
+      "key": "squid:S106",
+      "name": "System.out and System.err should not be used as loggers",
+      "lang": "java",
+      "desc": "<p>Two important requirements must be fulfilled when logging messages:</p>\n\n<ul>\n  <li>The user must be able to easily retrieve the logs.</li>\n  <li>The format of all messages must be uniform to enable users to easily browse them.</li>\n</ul>\n\n<p>\nIf a program directly writes to the standard output, there is absolutely no way to comply with these requirements.\nThat's why defining and using a dedicated logger is highly recommended.\n</p>\n\n<p>\nThe following code snippet illustrates this rule:\n</p>\n\n<pre>\nSystem.out.println(\"My Message\");  // Non-Compliant\n\nlogger.log(\"My Message\");          // Compliant\n</pre>",
+      "status": "READY",
+      "langName": "Java"
+    }
+  ],
+  "users": [
+    {
+      "login": "admin",
+      "name": "Admin Admin",
+      "active": true,
+      "email": "admin@sonarsource.com"
+    }
+  ],
+  "languages": [
+    {
+      "key": "js",
+      "name": "JavaScript"
+    },
+    {
+      "key": "java",
+      "name": "Java"
+    }
+  ],
+  "maxResultsReached": false,
+  "paging": {
+    "pageIndex": 1,
+    "pageSize": 100,
+    "total": 5,
+    "fTotal": "5",
+    "pages": 1
+  }
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-resources.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-resources.json
new file mode 100644 (file)
index 0000000..eb47ea0
--- /dev/null
@@ -0,0 +1,256 @@
+[
+  {
+    "id": 36129,
+    "key": "test:fake-project-for-tests:src/main/java/foo/Simplest.java",
+    "name": "Simplest.java",
+    "scope": "FIL",
+    "qualifier": "FIL",
+    "date": "2014-12-09T10:58:44+0100",
+    "creationDate": "2014-12-09T10:47:35+0100",
+    "lname": "src/main/java/foo/Simplest.java",
+    "lang": "java",
+    "msr": [
+      {
+        "key": "accessors",
+        "val": 1,
+        "frmt_val": "accessors"
+      },
+      {
+        "key": "classes",
+        "val": 1,
+        "frmt_val": "classes"
+      },
+      {
+        "key": "functions",
+        "val": 1,
+        "frmt_val": "functions"
+      },
+      {
+        "key": "statements",
+        "val": 1,
+        "frmt_val": "statements"
+      },
+      {
+        "key": "ncloc",
+        "val": 1,
+        "frmt_val": "ncloc"
+      },
+      {
+        "key": "lines",
+        "val": 1,
+        "frmt_val": "lines"
+      },
+      {
+        "key": "generated_ncloc",
+        "val": 1,
+        "frmt_val": "generated_ncloc"
+      },
+      {
+        "key": "generated_lines",
+        "val": 1,
+        "frmt_val": "generated_lines"
+      },
+      {
+        "key": "complexity",
+        "val": 1,
+        "frmt_val": "complexity"
+      },
+      {
+        "key": "function_complexity",
+        "val": 1,
+        "frmt_val": "function_complexity"
+      },
+      {
+        "key": "comment_lines",
+        "val": 1,
+        "frmt_val": "comment_lines"
+      },
+      {
+        "key": "comment_lines_density",
+        "val": 1,
+        "frmt_val": "comment_lines_density"
+      },
+      {
+        "key": "public_api",
+        "val": 1,
+        "frmt_val": "public_api"
+      },
+      {
+        "key": "public_undocumented_api",
+        "val": 1,
+        "frmt_val": "public_undocumented_api"
+      },
+      {
+        "key": "public_documented_api_density",
+        "val": 1,
+        "frmt_val": "public_documented_api_density"
+      },
+      {
+        "key": "coverage",
+        "val": 1,
+        "frmt_val": "coverage"
+      },
+      {
+        "key": "line_coverage",
+        "val": 1,
+        "frmt_val": "line_coverage"
+      },
+      {
+        "key": "lines_to_cover",
+        "val": 1,
+        "frmt_val": "lines_to_cover"
+      },
+      {
+        "key": "uncovered_lines",
+        "val": 1,
+        "frmt_val": "uncovered_lines"
+      },
+      {
+        "key": "branch_coverage",
+        "val": 1,
+        "frmt_val": "branch_coverage"
+      },
+      {
+        "key": "conditions_to_cover",
+        "val": 1,
+        "frmt_val": "conditions_to_cover"
+      },
+      {
+        "key": "uncovered_conditions",
+        "val": 1,
+        "frmt_val": "uncovered_conditions"
+      },
+      {
+        "key": "it_coverage",
+        "val": 1,
+        "frmt_val": "it_coverage"
+      },
+      {
+        "key": "it_line_coverage",
+        "val": 1,
+        "frmt_val": "it_line_coverage"
+      },
+      {
+        "key": "it_lines_to_cover",
+        "val": 1,
+        "frmt_val": "it_lines_to_cover"
+      },
+      {
+        "key": "it_uncovered_lines",
+        "val": 1,
+        "frmt_val": "it_uncovered_lines"
+      },
+      {
+        "key": "it_branch_coverage",
+        "val": 1,
+        "frmt_val": "it_branch_coverage"
+      },
+      {
+        "key": "it_conditions_to_cover",
+        "val": 1,
+        "frmt_val": "it_conditions_to_cover"
+      },
+      {
+        "key": "it_uncovered_conditions",
+        "val": 1,
+        "frmt_val": "it_uncovered_conditions"
+      },
+      {
+        "key": "overall_coverage",
+        "val": 1,
+        "frmt_val": "overall_coverage"
+      },
+      {
+        "key": "overall_line_coverage",
+        "val": 1,
+        "frmt_val": "overall_line_coverage"
+      },
+      {
+        "key": "overall_lines_to_cover",
+        "val": 1,
+        "frmt_val": "overall_lines_to_cover"
+      },
+      {
+        "key": "overall_uncovered_lines",
+        "val": 1,
+        "frmt_val": "overall_uncovered_lines"
+      },
+      {
+        "key": "overall_branch_coverage",
+        "val": 1,
+        "frmt_val": "overall_branch_coverage"
+      },
+      {
+        "key": "overall_conditions_to_cover",
+        "val": 1,
+        "frmt_val": "overall_conditions_to_cover"
+      },
+      {
+        "key": "overall_uncovered_conditions",
+        "val": 1,
+        "frmt_val": "overall_uncovered_conditions"
+      },
+      {
+        "key": "violations",
+        "val": 1,
+        "frmt_val": "violations"
+      },
+      {
+        "key": "sqale_index",
+        "val": 1,
+        "frmt_val": "sqale_index"
+      },
+      {
+        "key": "sqale_rating",
+        "val": 1,
+        "frmt_val": "sqale_rating"
+      },
+      {
+        "key": "sqale_debt_ratio",
+        "val": 1,
+        "frmt_val": "sqale_debt_ratio"
+      },
+      {
+        "key": "blocker_violations",
+        "val": 1,
+        "frmt_val": "blocker_violations"
+      },
+      {
+        "key": "critical_violations",
+        "val": 1,
+        "frmt_val": "critical_violations"
+      },
+      {
+        "key": "major_violations",
+        "val": 1,
+        "frmt_val": "major_violations"
+      },
+      {
+        "key": "minor_violations",
+        "val": 1,
+        "frmt_val": "minor_violations"
+      },
+      {
+        "key": "info_violations",
+        "val": 1,
+        "frmt_val": "info_violations"
+      },
+      {
+        "key": "duplicated_lines_density",
+        "val": 1,
+        "frmt_val": "duplicated_lines_density"
+      },
+      {
+        "key": "duplicated_blocks",
+        "val": 1,
+        "frmt_val": "duplicated_blocks"
+      },
+      {
+        "key": "duplicated_lines",
+        "val": 1,
+        "frmt_val": "duplicated_lines"
+      }
+
+    ]
+  }
+]
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-sources-lines.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-should-show-measures/api-sources-lines.json
new file mode 100644 (file)
index 0000000..b095d82
--- /dev/null
@@ -0,0 +1,130 @@
+{
+  "sources": [
+    {
+      "line": 1,
+      "code": "<span class=\"k\">package </span>foo;",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 2,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 3,
+      "code": "<span class=\"cppd\">/**</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "37acee5ff6e67cdb501c08a656fbabf21160b052",
+      "scmDate": "2013-09-19T15:37:05+0200"
+    },
+    {
+      "line": 4,
+      "code": "<span class=\"cppd\"> * Simple class</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "37acee5ff6e67cdb501c08a656fbabf21160b052",
+      "scmDate": "2013-09-19T15:37:05+0200"
+    },
+    {
+      "line": 5,
+      "code": "<span class=\"cppd\"> */</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "37acee5ff6e67cdb501c08a656fbabf21160b052",
+      "scmDate": "2013-09-19T15:37:05+0200"
+    },
+    {
+      "line": 6,
+      "code": "<span class=\"k\">public </span><span class=\"k\">class </span><span class=\"sym-1 sym\">Simplest</span> {",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 7,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 8,
+      "code": "    <span class=\"k\">public </span><span class=\"k\">static </span><span class=\"k\">int </span><span class=\"sym-2 sym\">add</span>(<span class=\"k\">int </span><span class=\"sym-3 sym\">a</span>, <span class=\"k\">int </span><span class=\"sym-4 sym\">b</span>) {",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 9,
+      "code": "    \t<span class=\"cppd\">// introduce a variable that is not needed - just to get a violation</span>",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "322e4e8b3cb54a39651f563273745e6ee737fb3e",
+      "scmDate": "2013-10-15T16:14:22+0200"
+    },
+    {
+      "line": 10,
+      "code": "    \t<span class=\"k\">int </span><span class=\"sym-5 sym\">result</span> = <span class=\"sym-3 sym\">a</span> + <span class=\"sym-4 sym\">b</span>;",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "322e4e8b3cb54a39651f563273745e6ee737fb3e",
+      "scmDate": "2013-10-15T16:14:22+0200"
+    },
+    {
+      "line": 11,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "44e0c5b4fc18a006a405d3f3d489896245fab3d1",
+      "scmDate": "2014-01-09T16:48:59+0100"
+    },
+    {
+      "line": 12,
+      "code": "    \tSystem.out.println(<span class=\"s\">\"\"</span>);",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "44e0c5b4fc18a006a405d3f3d489896245fab3d1",
+      "scmDate": "2014-01-09T16:48:59+0100"
+    },
+    {
+      "line": 13,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "44e0c5b4fc18a006a405d3f3d489896245fab3d1",
+      "scmDate": "2014-01-09T16:48:59+0100"
+    },
+    {
+      "line": 14,
+      "code": "        <span class=\"k\">return </span><span class=\"sym-5 sym\">result</span>;",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "322e4e8b3cb54a39651f563273745e6ee737fb3e",
+      "scmDate": "2013-10-15T16:14:22+0200"
+    },
+    {
+      "line": 15,
+      "code": "    }",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 16,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 17,
+      "code": "}",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    },
+    {
+      "line": 18,
+      "code": "",
+      "scmAuthor": "fabrice.bellingard@sonarsource.com",
+      "scmRevision": "f467e9befd3ff15bb1dbf634b0e9b45d44110bac",
+      "scmDate": "2013-09-16T15:31:49+0200"
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec.js
new file mode 100644 (file)
index 0000000..97f3fa9
--- /dev/null
@@ -0,0 +1,213 @@
+/* global casper:false */
+
+var lib = require('../lib'),
+    testName = lib.testName('Source Viewer');
+
+lib.initMessages();
+lib.changeWorkingDirectory('source-viewer-spec');
+
+
+casper.test.begin(testName('Base'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line', function () {
+          // Check header elements
+          test.assertExists('.source-viewer-header');
+          test.assertSelectorContains('.source-viewer-header-component-project', 'SonarQube');
+          test.assertSelectorContains('.source-viewer-header-component-project', 'SonarQube :: Batch');
+          test.assertSelectorContains('.source-viewer-header-component-name',
+              'src/main/java/org/sonar/batch/index/Cache.java');
+          test.assertExists('.source-viewer-header-favorite');
+          test.assertExists('.source-viewer-header-actions');
+
+          // Check main measures
+          // FIXME enable lines check
+          //test.assertSelectorContains('.source-viewer-header-measure', '379');
+          test.assertSelectorContains('.source-viewer-header-measure', 'A');
+          test.assertSelectorContains('.source-viewer-header-measure', '2h 10min');
+          test.assertSelectorContains('.source-viewer-header-measure', '6');
+          test.assertSelectorContains('.source-viewer-header-measure', '74.3%');
+          test.assertSelectorContains('.source-viewer-header-measure', '5.8%');
+
+          // Check source
+          // FIXME enable source lines count check
+          //test.assertElementCount('.source-line', 518);
+          test.assertSelectorContains('.source-viewer', 'public class Cache');
+        });
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Decoration'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        // Check issues decoration
+        test.assertElementCount('.has-issues', 6);
+      })
+
+      .then(function () {
+        // Check coverage decoration
+        test.assertElementCount('.source-line-covered', 142);
+        test.assertElementCount('.source-line-uncovered', 50);
+        test.assertElementCount('.source-line-partially-covered', 2);
+      })
+
+      .then(function () {
+        // Check duplications decoration
+        test.assertElementCount('.source-line-duplicated', 30);
+      })
+
+      .then(function () {
+        // Check scm decoration
+        test.assertElementCount('.source-line-scm-inner', 186);
+        test.assertExists('.source-line-scm-inner[data-author="simon.brandhof@gmail.com"]');
+        test.assertExists('.source-line-scm-inner[data-author="julien.henry@sonarsource.com"]');
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Test File'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'tests/app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'tests/lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        test.assertSelectorContains('.source-viewer-header-measure', '6');
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+// FIXME enable test
+//casper.test.begin(testName('Go From Coverage to Test File'), function (test) {
+//  casper
+//      .start(lib.buildUrl('source-viewer'), function () {
+//        lib.setDefaultViewport();
+//        lib.mockRequest('/api/l10n/index', '{}');
+//        lib.mockRequestFromFile('/api/components/app', 'app.json');
+//        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+//        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+//        lib.mockRequestFromFile('/api/tests/test_cases', 'test-cases.json');
+//      })
+//
+//      .then(function () {
+//        casper.waitForSelector('.component-viewer-source .source-line');
+//      })
+//
+//      .then(function () {
+//        casper.click('.js-toggle-coverage');
+//        casper.waitForSelector('.source-line-covered', function () {
+//          casper.click('.source-line-covered');
+//          casper.waitForSelector('.bubble-popup', function () {
+//            test.assertSelectorContains('.bubble-popup', 'src/test/java/org/sonar/batch/issue/IssueCacheTest.java');
+//            test.assertSelectorContains('.bubble-popup', 'should_update_existing_issue');
+//            test.assertSelectorContains('.bubble-popup li[title="should_update_existing_issue"]', '293');
+//
+//            lib.clearRequestMocks();
+//            lib.mockRequestFromFile('/api/components/app', 'tests/app.json');
+//            lib.mockRequestFromFile('/api/sources/show', 'tests/source.json');
+//            lib.mockRequestFromFile('/api/resources', 'tests/resources.json');
+//            lib.mockRequest('/api/coverage/show', '{}');
+//            lib.mockRequestFromFile('/api/tests/show', 'tests/tests.json');
+//            casper.click('.component-viewer-popup-test-file[data-key]');
+//
+//            casper.waitForSelector('.js-unit-test', function () {
+//              test.assertElementCount('.js-unit-test', 2);
+//            });
+//          });
+//        });
+//      })
+//
+//      .run(function () {
+//        test.done();
+//      });
+//});
+
+
+casper.test.begin(testName('Create Manual Issue'), function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequest('/api/l10n/index', '{}');
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+        lib.mockRequestFromFile('/api/issues/create', 'create-issue.json');
+        lib.mockRequestFromFile('/api/issues/show', 'create-issue.json');
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line-number[data-line-number="3"]');
+      })
+
+      .then(function () {
+        casper.click('.source-line-number[data-line-number="3"]');
+        casper.waitForSelector('.js-add-manual-issue');
+      })
+
+      .then(function () {
+        casper.click('.js-add-manual-issue');
+        casper.waitForSelector('.js-manual-issue-form');
+      })
+
+      .then(function () {
+        casper.fill('.js-manual-issue-form', {
+          rule: 'manual:api',
+          message: 'An issue message'
+        }, true);
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line-code.has-issues[data-line-number="3"]', function () {
+          test.assertExists('.source-line-code.has-issues[data-line-number="3"]');
+        });
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/app-not-logged-in.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/app-not-logged-in.json
new file mode 100644 (file)
index 0000000..936eeb1
--- /dev/null
@@ -0,0 +1,62 @@
+{"key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+  "path": "src/main/java/org/sonar/batch/index/Cache.java",
+  "name": "Cache.java",
+  "longName": "src/main/java/org/sonar/batch/index/Cache.java",
+  "q": "FIL", "subProject": "org.codehaus.sonar:sonar-batch",
+  "subProjectName": "SonarQube :: Batch",
+  "project": "org.codehaus.sonar:sonar",
+  "projectName": "SonarQube",
+  "fav": false,
+  "canMarkAsFavourite": false,
+  "canBulkChange": false,
+  "canCreateManualIssue": false,
+  "periods": [
+    [1, "since previous analysis (2014 Dec 01)", "2014-12-01T18:51:13+0100"],
+    [2, "over 365 days (2013 Dec 01)", "2013-12-01T00:40:31+0100"],
+    [3, "since previous version (4.5 - 2014 Sep 03)", "2014-09-03T23:16:52+0200"]
+  ],
+  "severities": [
+    ["MINOR", "Minor", 1],
+    ["MAJOR", "Major", 1],
+    ["INFO", "Info", 4]
+  ],
+  "rules": [
+    ["common-java:DuplicatedBlocks", "Duplicated blocks", 1],
+    ["squid:S1192", "String literals should not be duplicated", 1],
+    ["squid:S1135", "TODO tags should be handled", 4]
+  ],
+  "measures": {
+    "fNcloc": "378",
+    "fCoverage": "74.3%",
+    "fDuplicationDensity": "5.8%",
+    "fDebt": "2h 10min",
+    "fSqaleRating": "A",
+    "fSqaleDebtRatio": "1.1%",
+    "fIssues": "6",
+    "fMinorIssues": "1",
+    "fMajorIssues": "1",
+    "fInfoIssues": "4"
+  },
+  "tabs": ["scm", "coverage", "duplications"],
+  "manual_rules": [
+    {
+      "key": "manual:api",
+      "name": "API"
+    },
+    {
+      "key": "manual:design",
+      "name": "Design"
+    },
+    {
+      "key": "manual:error_handling",
+      "name": "Error handling"
+    },
+    {
+      "key": "manual:performance",
+      "name": "Performance"
+    },
+    {
+      "key": "manual:sql_pitfalls",
+      "name": "SQL Pitfall"
+    }
+  ]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/app.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/app.json
new file mode 100644 (file)
index 0000000..393598f
--- /dev/null
@@ -0,0 +1,62 @@
+{"key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+  "path": "src/main/java/org/sonar/batch/index/Cache.java",
+  "name": "Cache.java",
+  "longName": "src/main/java/org/sonar/batch/index/Cache.java",
+  "q": "FIL", "subProject": "org.codehaus.sonar:sonar-batch",
+  "subProjectName": "SonarQube :: Batch",
+  "project": "org.codehaus.sonar:sonar",
+  "projectName": "SonarQube",
+  "fav": false,
+  "canMarkAsFavourite": true,
+  "canBulkChange": true,
+  "canCreateManualIssue": true,
+  "periods": [
+    [1, "since previous analysis (2014 Dec 01)", "2014-12-01T18:51:13+0100"],
+    [2, "over 365 days (2013 Dec 01)", "2013-12-01T00:40:31+0100"],
+    [3, "since previous version (4.5 - 2014 Sep 03)", "2014-09-03T23:16:52+0200"]
+  ],
+  "severities": [
+    ["MINOR", "Minor", 1],
+    ["MAJOR", "Major", 1],
+    ["INFO", "Info", 4]
+  ],
+  "rules": [
+    ["common-java:DuplicatedBlocks", "Duplicated blocks", 1],
+    ["squid:S1192", "String literals should not be duplicated", 1],
+    ["squid:S1135", "TODO tags should be handled", 4]
+  ],
+  "measures": {
+    "fNcloc": "378",
+    "fCoverage": "74.3%",
+    "fDuplicationDensity": "5.8%",
+    "fDebt": "2h 10min",
+    "fSqaleRating": "A",
+    "fSqaleDebtRatio": "1.1%",
+    "fIssues": "6",
+    "fMinorIssues": "1",
+    "fMajorIssues": "1",
+    "fInfoIssues": "4"
+  },
+  "tabs": ["scm", "coverage", "duplications"],
+  "manual_rules": [
+    {
+      "key": "manual:api",
+      "name": "API"
+    },
+    {
+      "key": "manual:design",
+      "name": "Design"
+    },
+    {
+      "key": "manual:error_handling",
+      "name": "Error handling"
+    },
+    {
+      "key": "manual:performance",
+      "name": "Performance"
+    },
+    {
+      "key": "manual:sql_pitfalls",
+      "name": "SQL Pitfall"
+    }
+  ]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/coverage.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/coverage.json
new file mode 100644 (file)
index 0000000..ace41da
--- /dev/null
@@ -0,0 +1,196 @@
+{"coverage": [
+  [46, true, 32, null, null],
+  [47, true, 32, null, null],
+  [48, true, 32, null, null],
+  [49, true, 32, null, null],
+  [52, true, 2, null, null],
+  [53, true, 2, null, null],
+  [57, true, 18, null, null],
+  [58, true, 18, null, null],
+  [62, true, 13, null, null],
+  [63, true, 13, null, null],
+  [67, false, null, null, null],
+  [68, false, null, null, null],
+  [73, true, 27, null, null],
+  [74, true, 27, null, null],
+  [75, true, 27, null, null],
+  [76, true, 1, null, null],
+  [77, true, 1, null, null],
+  [85, true, 5, null, null],
+  [86, true, 5, null, null],
+  [94, true, 10, null, null],
+  [95, true, 10, null, null],
+  [103, true, 11, null, null],
+  [104, true, 11, null, null],
+  [112, false, null, null, null],
+  [113, false, null, null, null],
+  [120, true, 17, null, null],
+  [121, true, 17, 2, 2],
+  [122, true, 8, null, null],
+  [124, true, 13, null, null],
+  [125, false, null, null, null],
+  [127, false, null, null, null],
+  [132, true, 4, null, null],
+  [133, true, 4, null, null],
+  [137, true, 3, null, null],
+  [138, true, 3, null, null],
+  [142, true, 5, null, null],
+  [143, true, 5, null, null],
+  [147, false, null, null, null],
+  [148, false, null, null, null],
+  [153, true, 7, null, null],
+  [154, true, 7, null, null],
+  [155, false, null, null, null],
+  [157, false, null, null, null],
+  [162, true, 3, null, null],
+  [163, true, 3, null, null],
+  [167, true, 3, null, null],
+  [168, true, 3, null, null],
+  [172, true, 2, null, null],
+  [173, true, 2, null, null],
+  [177, false, null, null, null],
+  [178, false, null, null, null],
+  [183, true, 6, null, null],
+  [184, false, null, null, null],
+  [186, false, null, null, null],
+  [196, true, 5, null, null],
+  [197, true, 5, null, null],
+  [201, true, 2, null, null],
+  [202, true, 2, null, null],
+  [206, true, 1, null, null],
+  [207, true, 1, null, null],
+  [211, false, null, null, null],
+  [212, false, null, null, null],
+  [217, true, 5, null, null],
+  [218, true, 5, null, null],
+  [219, true, 5, null, null],
+  [220, true, 5, null, null],
+  [221, false, null, null, null],
+  [222, false, null, null, null],
+  [231, true, 4, null, null],
+  [232, true, 4, null, null],
+  [233, false, null, null, null],
+  [234, false, null, null, null],
+  [235, true, 4, null, null],
+  [236, true, 4, null, null],
+  [248, true, 4, null, null],
+  [249, true, 4, null, null],
+  [250, true, 4, null, null],
+  [251, true, 4, null, null],
+  [252, true, 4, null, null],
+  [253, true, 4, 2, 2],
+  [254, true, 2, null, null],
+  [256, true, 4, null, null],
+  [257, false, null, null, null],
+  [258, false, null, null, null],
+  [265, true, 1, null, null],
+  [266, true, 1, null, null],
+  [267, true, 1, null, null],
+  [268, true, 1, null, null],
+  [269, true, 1, null, null],
+  [270, true, 1, null, null],
+  [271, true, 1, 2, 2],
+  [272, true, 1, null, null],
+  [274, true, 1, null, null],
+  [275, false, null, null, null],
+  [276, false, null, null, null],
+  [287, true, 4, null, null],
+  [288, true, 4, null, null],
+  [289, true, 4, null, null],
+  [290, true, 4, null, null],
+  [291, true, 4, 2, 2],
+  [292, true, 3, null, null],
+  [294, true, 4, null, null],
+  [295, false, null, null, null],
+  [296, false, null, null, null],
+  [305, true, 1, null, null],
+  [306, true, 1, null, null],
+  [307, true, 1, null, null],
+  [308, true, 1, null, null],
+  [309, true, 1, null, null],
+  [310, false, null, null, null],
+  [311, false, null, null, null],
+  [316, false, null, null, null],
+  [324, true, 23, null, null],
+  [325, true, 23, null, null],
+  [326, true, 23, null, null],
+  [327, true, 23, null, null],
+  [328, true, 23, null, null],
+  [329, false, null, null, null],
+  [330, false, null, null, null],
+  [339, true, 16, null, null],
+  [340, true, 16, null, null],
+  [341, true, 16, null, null],
+  [342, true, 16, null, null],
+  [343, false, null, null, null],
+  [344, false, null, null, null],
+  [349, true, 9, null, null],
+  [350, true, 9, null, null],
+  [351, true, 9, null, null],
+  [355, true, 3, null, null],
+  [356, true, 3, null, null],
+  [357, true, 3, null, null],
+  [361, true, 7, null, null],
+  [362, true, 7, null, null],
+  [363, true, 7, null, null],
+  [366, true, 20, null, null],
+  [367, true, 20, null, null],
+  [368, true, 20, null, null],
+  [371, true, 18, null, null],
+  [372, true, 18, null, null],
+  [373, true, 18, null, null],
+  [376, false, null, null, null],
+  [377, false, null, 2, 0],
+  [378, false, null, null, null],
+  [380, false, null, null, null],
+  [389, true, 26, null, null],
+  [390, true, 26, null, null],
+  [391, true, 26, null, null],
+  [395, true, 26, null, null],
+  [403, true, 26, null, null],
+  [404, true, 26, null, null],
+  [405, true, 26, null, null],
+  [406, true, 26, null, null],
+  [411, true, 25, null, null],
+  [412, false, null, null, null],
+  [413, false, null, null, null],
+  [421, true, 23, null, null],
+  [422, false, null, null, null],
+  [423, false, null, null, null],
+  [424, true, 23, null, null],
+  [425, true, 23, 2, 1],
+  [426, true, 23, null, null],
+  [428, false, null, null, null],
+  [433, false, null, null, null],
+  [440, true, 10, null, null],
+  [441, true, 10, null, null],
+  [442, true, 10, null, null],
+  [446, true, 10, null, null],
+  [454, true, 10, null, null],
+  [455, true, 10, null, null],
+  [456, true, 10, null, null],
+  [457, true, 10, null, null],
+  [462, true, 10, null, null],
+  [463, false, null, null, null],
+  [464, false, null, null, null],
+  [472, true, 9, null, null],
+  [473, false, null, null, null],
+  [474, false, null, null, null],
+  [475, true, 9, null, null],
+  [476, true, 9, 2, 1],
+  [477, true, 9, null, null],
+  [478, true, 9, null, null],
+  [479, true, 9, null, null],
+  [480, true, 9, 2, 2],
+  [481, true, 9, null, null],
+  [483, true, 9, null, null],
+  [485, false, null, null, null],
+  [490, false, null, null, null],
+  [498, true, 16, null, null],
+  [499, true, 16, null, null],
+  [500, true, 16, null, null],
+  [501, true, 16, null, null],
+  [504, true, 14, null, null],
+  [509, true, 14, null, null],
+  [514, false, null, null, null]
+]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/create-issue.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/create-issue.json
new file mode 100644 (file)
index 0000000..db69ef3
--- /dev/null
@@ -0,0 +1,17 @@
+{
+  "issue": {
+    "key": "e69e2012-c58e-4c37-9e0e-9595576de9de",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": null,
+    "project": "org.codehaus.sonar:sonar",
+    "rule": "manual:api",
+    "status": "OPEN",
+    "severity": "MAJOR",
+    "message": "An issue message",
+    "line": 3,
+    "reporter": "admin",
+    "creationDate": "2014-12-08T14:22:49+0100",
+    "updateDate": "2014-12-08T14:22:49+0100",
+    "fUpdateAge": "less than a minute"
+  }
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/cross-project-duplications.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/cross-project-duplications.json
new file mode 100644 (file)
index 0000000..cd445d5
--- /dev/null
@@ -0,0 +1,33 @@
+{"duplications": [
+  {
+    "blocks": [
+      {
+        "from": 404,
+        "size": 15,
+        "_ref": "1"
+      },
+      {
+        "from": 455,
+        "size": 15,
+        "_ref": "2"
+      }
+    ]
+  }
+], "files": {
+  "1": {
+    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "name": "src/main/java/org/sonar/batch/index/Cache.java",
+    "project": "org.codehaus.sonar:sonar",
+    "projectName": "SonarQube",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "subProjectName": "SonarQube :: Batch"
+  },
+  "2": {
+    "key": "org.codehaus.sonar-plugins.javascript:sonar-javascript-plugin:src/main/java/org/sonar/plugins/javascript/core/JavaScript.java",
+    "name": "src/main/java/org/sonar/plugins/javascript/core/JavaScript.java",
+    "project": "org.codehaus.sonar-plugins.javascript:javascript",
+    "projectName": "JavaScript",
+    "subProject": "org.codehaus.sonar-plugins.javascript:sonar-javascript-plugin",
+    "subProjectName": "JavaScript :: Sonar Plugin"
+  }
+}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/duplications-in-deleted-files.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/duplications-in-deleted-files.json
new file mode 100644 (file)
index 0000000..9de23d1
--- /dev/null
@@ -0,0 +1,24 @@
+{"duplications": [
+  {
+    "blocks": [
+      {
+        "from": 404,
+        "size": 15,
+        "_ref": "1"
+      },
+      {
+        "from": 455,
+        "size": 15
+      }
+    ]
+  }
+], "files": {
+  "1": {
+    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "name": "src/main/java/org/sonar/batch/index/Cache.java",
+    "project": "org.codehaus.sonar:sonar",
+    "projectName": "SonarQube",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "subProjectName": "SonarQube :: Batch"
+  }
+}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/duplications.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/duplications.json
new file mode 100644 (file)
index 0000000..f77e92b
--- /dev/null
@@ -0,0 +1,25 @@
+{"duplications": [
+  {
+    "blocks": [
+      {
+        "from": 404,
+        "size": 15,
+        "_ref": "1"
+      },
+      {
+        "from": 455,
+        "size": 15,
+        "_ref": "1"
+      }
+    ]
+  }
+], "files": {
+  "1": {
+    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "name": "src/main/java/org/sonar/batch/index/Cache.java",
+    "project": "org.codehaus.sonar:sonar",
+    "projectName": "SonarQube",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "subProjectName": "SonarQube :: Batch"
+  }
+}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/issues.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/issues.json
new file mode 100644 (file)
index 0000000..0b16011
--- /dev/null
@@ -0,0 +1,200 @@
+{"total": 6, "p": 1, "ps": 100, "projects": [
+  {
+    "uuid": "69e57151-be0d-4157-adff-c06741d88879",
+    "key": "org.codehaus.sonar:sonar",
+    "id": 2865,
+    "qualifier": "TRK",
+    "name": "SonarQube",
+    "longName": "SonarQube"
+  }
+], "components": [
+  {
+    "uuid": "83379565-7af3-4047-8d1a-ed42b10309b0",
+    "key": "org.codehaus.sonar:sonar-batch",
+    "id": 1624,
+    "enabled": true,
+    "qualifier": "BRC",
+    "name": "SonarQube :: Batch",
+    "longName": "SonarQube :: Batch",
+    "path": "sonar-batch",
+    "projectId": 2865,
+    "subProjectId": 2865
+  },
+  {
+    "uuid": "69e57151-be0d-4157-adff-c06741d88879",
+    "key": "org.codehaus.sonar:sonar",
+    "id": 2865,
+    "enabled": true,
+    "qualifier": "TRK",
+    "name": "SonarQube",
+    "longName": "SonarQube"
+  },
+  {
+    "uuid": "b9615992-2458-4d54-a22f-b91ee7ba5bc5",
+    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "id": 19983,
+    "enabled": true,
+    "qualifier": "FIL",
+    "name": "Cache.java",
+    "longName": "src/main/java/org/sonar/batch/index/Cache.java",
+    "path": "src/main/java/org/sonar/batch/index/Cache.java",
+    "projectId": 2865,
+    "subProjectId": 1624
+  }
+], "issues": [
+  {
+    "key": "20002ec7-b647-44da-bdf5-4d9fbf4b7c58",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": 19983,
+    "project": "org.codehaus.sonar:sonar",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "rule": "common-java:DuplicatedBlocks",
+    "status": "CONFIRMED",
+    "severity": "MAJOR",
+    "message": "2 duplicated blocks of code.",
+    "debt": "2h",
+    "creationDate": "2014-05-01T23:38:31+0200",
+    "updateDate": "2014-07-01T17:48:47+0200",
+    "fUpdateAge": "5 months",
+    "actions": ["comment", "assign", "assign_to_me", "plan", "set_severity"],
+    "transitions": ["unconfirm", "resolve", "falsepositive"]
+  },
+  {
+    "key": "71a26f48-a90d-4a76-a745-4f6e6e8b1773",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": 19983,
+    "project": "org.codehaus.sonar:sonar",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "rule": "squid:S1135",
+    "status": "CONFIRMED",
+    "severity": "INFO",
+    "message": "Complete the task associated to this TODO comment.",
+    "line": 125,
+    "author": "simon.brandhof@gmail.com",
+    "creationDate": "2013-10-10T23:51:33+0200",
+    "updateDate": "2014-07-29T23:15:18+0200",
+    "fUpdateAge": "4 months",
+    "actions": ["comment", "assign", "assign_to_me", "plan", "set_severity"],
+    "transitions": ["unconfirm", "resolve", "falsepositive"]
+  },
+  {
+    "key": "75419c88-0e3c-4311-aa47-fe5731e67558",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": 19983,
+    "project": "org.codehaus.sonar:sonar",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "rule": "squid:S1135",
+    "status": "CONFIRMED",
+    "severity": "INFO",
+    "message": "Complete the task associated to this TODO comment.",
+    "line": 155,
+    "author": "simon.brandhof@gmail.com",
+    "creationDate": "2013-10-10T23:51:33+0200",
+    "updateDate": "2014-07-29T23:15:18+0200",
+    "fUpdateAge": "4 months",
+    "actions": ["comment", "assign", "assign_to_me", "plan", "set_severity"],
+    "transitions": ["unconfirm", "resolve", "falsepositive"]
+  },
+  {
+    "key": "01461208-6c1e-4cdf-9f27-b7afa78e76ec",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": 19983,
+    "project": "org.codehaus.sonar:sonar",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "rule": "squid:S1135",
+    "status": "CONFIRMED",
+    "severity": "INFO",
+    "message": "Complete the task associated to this TODO comment.",
+    "line": 184,
+    "author": "simon.brandhof@gmail.com",
+    "creationDate": "2013-10-10T23:51:33+0200",
+    "updateDate": "2014-07-29T23:15:18+0200",
+    "fUpdateAge": "4 months",
+    "actions": ["comment", "assign", "assign_to_me", "plan", "set_severity"],
+    "transitions": ["unconfirm", "resolve", "falsepositive"]
+  },
+  {
+    "key": "e4de6481-7bfb-460a-8b3c-24459f9561d3",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": 19983,
+    "project": "org.codehaus.sonar:sonar",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "rule": "squid:S1135",
+    "status": "CONFIRMED",
+    "severity": "INFO",
+    "message": "Complete the task associated to this TODO comment.",
+    "line": 239,
+    "author": "Simon Brandhof",
+    "creationDate": "2013-08-09T16:04:33+0200",
+    "updateDate": "2014-07-29T23:15:18+0200",
+    "fUpdateAge": "4 months",
+    "actions": ["comment", "assign", "assign_to_me", "plan", "set_severity"],
+    "transitions": ["unconfirm", "resolve", "falsepositive"]
+  },
+  {
+    "key": "59fc17f7-c977-4cb6-8f04-fbe88e4b9186",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": 19983,
+    "project": "org.codehaus.sonar:sonar",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "rule": "squid:S1192",
+    "status": "CONFIRMED",
+    "severity": "MINOR",
+    "message": "Define a constant instead of duplicating this literal \"Fail to get keys from cache \" 3 times.",
+    "line": 257,
+    "debt": "10min",
+    "author": "simon.brandhof@gmail.com",
+    "creationDate": "2014-02-20T07:48:16+0100",
+    "updateDate": "2014-02-24T16:57:34+0100",
+    "fUpdateAge": "9 months",
+    "actions": ["comment", "assign", "assign_to_me", "plan", "set_severity"],
+    "transitions": ["unconfirm", "resolve", "falsepositive"]
+  }
+], "rules": [
+  {
+    "key": "common-java:DuplicatedBlocks",
+    "name": "Duplicated blocks",
+    "lang": "java",
+    "desc": "<p>An issue is created on a file as soon as there is a block of duplicated code on this file. It gives the number of blocks in the file.</p>",
+    "status": "READY",
+    "langName": "Java"
+  },
+  {
+    "key": "squid:S1192",
+    "name": "String literals should not be duplicated",
+    "lang": "java",
+    "desc": "<p>\n  Duplicated string literals make the process of refactoring error-prone, since you must be sure to update all occurrences.\n  On the other hand, constants can be referenced from many places, but only need to be updated in a single place.\n</p>\n\n<h2>Non Compliant Code Example</h2>\n\n<pre>\npublic void run() {\n  prepare(\"action1\");                              // Non-Compliant - \"action1\" is duplicated 3 times\n  execute(\"action1\");\n  release(\"action1\");\n}\n\n@SuppressWarning(\"all\")                            // Compliant - annotations are excluded\nprivate void method1() { /* ... */ }\n@SuppressWarning(\"all\")\nprivate void method2() { /* ... */ }\n\npublic String method3(String a) {\n  System.out.println(\"'\" + a + \"'\");               // Compliant - literal \"'\" has less than 5 characters and is excluded\n  return \"\";                                       // Compliant - literal \"\" has less than 5 characters and is excluded\n}\n</pre>\n\n<h2>Compliant Code Example</h2>\n\n<pre>\nprivate static final String ACTION_1 = \"action1\";  // Compliant\n\npublic void run() {\n  prepare(ACTION_1);                               // Compliant\n  execute(ACTION_1);\n  release(ACTION_1);\n}\n</pre>\n\n<h2>Exceptions</h2>\n<p>To prevent generating some false-positives, literals having less than 5 characters are excluded.</p>",
+    "status": "READY",
+    "langName": "Java"
+  },
+  {
+    "key": "squid:S1135",
+    "name": "TODO tags should be handled",
+    "lang": "java",
+    "desc": "<p>\n<code>TODO</code> tags are commonly used to mark places where some more code is required, but which the developer wants to implement later.\nSometimes the developer will not have the time or will simply forget to get back to that tag.\nThis rule is meant to track those tags, and ensure that they do not go unnoticed.\n</p>\n\n<p>The following code illustrates this rule:</p>\n\n<pre>\nvoid doSomething() {\n  // TODO\n}\n</pre>",
+    "status": "READY",
+    "langName": "Java"
+  }
+], "users": [
+  {
+    "login": "admin",
+    "name": "Admin Admin",
+    "active": true,
+    "email": "admin@sonarsource.com"
+  }
+], "languages": [
+  {
+    "key": "js",
+    "name": "JavaScript"
+  },
+  {
+    "key": "java",
+    "name": "Java"
+  }
+], "maxResultsReached": false, "paging": {
+  "pageIndex": 1,
+  "pageSize": 100,
+  "total": 6,
+  "fTotal": "6",
+  "pages": 1
+}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/lines.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/lines.json
new file mode 100644 (file)
index 0000000..e33d02b
--- /dev/null
@@ -0,0 +1,3868 @@
+{"sources": [
+  {
+    "line": 1,
+    "code": "<span class=\"cppd\">/*</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 2,
+    "code": "<span class=\"cppd\"> * SonarQube, open source software quality management tool.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 3,
+    "code": "<span class=\"cppd\"> * Copyright (C) 2008-2014 SonarSource</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "57ae3026c36ae3b0b71756d6161124b1ae594c53",
+    "scmDate": "2014-03-11T17:52:41+0100"
+  },
+  {
+    "line": 4,
+    "code": "<span class=\"cppd\"> * mailto:contact AT sonarsource DOT com</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 5,
+    "code": "<span class=\"cppd\"> *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 6,
+    "code": "<span class=\"cppd\"> * SonarQube is free software; you can redistribute it and/or</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 7,
+    "code": "<span class=\"cppd\"> * modify it under the terms of the GNU Lesser General Public</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 8,
+    "code": "<span class=\"cppd\"> * License as published by the Free Software Foundation; either</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 9,
+    "code": "<span class=\"cppd\"> * version 3 of the License, or (at your option) any later version.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 10,
+    "code": "<span class=\"cppd\"> *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 11,
+    "code": "<span class=\"cppd\"> * SonarQube is distributed in the hope that it will be useful,</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 12,
+    "code": "<span class=\"cppd\"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 13,
+    "code": "<span class=\"cppd\"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 14,
+    "code": "<span class=\"cppd\"> * Lesser General Public License for more details.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 15,
+    "code": "<span class=\"cppd\"> *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 16,
+    "code": "<span class=\"cppd\"> * You should have received a copy of the GNU Lesser General Public License</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "ce63bd4c293fe7a1fa066d73860bbaf4e1f5a608",
+    "scmDate": "2013-04-22T09:37:03+0200"
+  },
+  {
+    "line": 17,
+    "code": "<span class=\"cppd\"> * along with this program; if not, write to the Free Software Foundation,</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "ce63bd4c293fe7a1fa066d73860bbaf4e1f5a608",
+    "scmDate": "2013-04-22T09:37:03+0200"
+  },
+  {
+    "line": 18,
+    "code": "<span class=\"cppd\"> * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "ce63bd4c293fe7a1fa066d73860bbaf4e1f5a608",
+    "scmDate": "2013-04-22T09:37:03+0200"
+  },
+  {
+    "line": 19,
+    "code": "<span class=\"cppd\"> */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 20,
+    "code": "<span class=\"k\">package</span> org.sonar.batch.index;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 21,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 22,
+    "code": "<span class=\"k\">import </span>com.google.common.collect.<span class=\"sym-1 sym\">Sets</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 23,
+    "code": "<span class=\"k\">import </span>com.persistit.<span class=\"sym-2 sym\">Exchange</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 24,
+    "code": "<span class=\"k\">import </span>com.persistit.<span class=\"sym-3 sym\">Key</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 25,
+    "code": "<span class=\"k\">import </span>com.persistit.<span class=\"sym-4 sym\">KeyFilter</span>;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 26,
+    "code": "<span class=\"k\">import </span>com.persistit.exception.<span class=\"sym-5 sym\">PersistitException</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 27,
+    "code": "<span class=\"k\">import </span>org.apache.commons.lang.builder.<span class=\"sym-6 sym\">ToStringBuilder</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 28,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 29,
+    "code": "<span class=\"k\">import </span>javax.annotation.<span class=\"sym-7 sym\">CheckForNull</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 30,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 31,
+    "code": "<span class=\"k\">import </span>java.util.<span class=\"sym-8 sym\">Iterator</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 32,
+    "code": "<span class=\"k\">import </span>java.util.<span class=\"sym-9 sym\">NoSuchElementException</span>;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 33,
+    "code": "<span class=\"k\">import </span>java.util.<span class=\"sym-10 sym\">Set</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 34,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 35,
+    "code": "<span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 36,
+    "code": "<span class=\"cppd\"> * &lt;p&gt;</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 37,
+    "code": "<span class=\"cppd\"> * This cache is not thread-safe, due to direct usage of {@link com.persistit.Exchange}</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 38,
+    "code": "<span class=\"cppd\"> * &lt;/p&gt;</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 39,
+    "code": "<span class=\"cppd\"> */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 40,
+    "code": "<span class=\"k\">public </span><span class=\"k\">class</span> <span class=\"sym-11 sym\">Cache</span>&lt;V&gt; {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "6074164392edd3db2dfdfd21d05cd56c19e2b0e6",
+    "scmDate": "2014-07-25T16:31:45+0200"
+  },
+  {
+    "line": 41,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 42,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">final </span>String <span class=\"sym-12 sym\">name</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 43,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-13 sym\">exchange</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 44,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 45,
+    "code": "  <span class=\"sym-14 sym\">Cache</span>(String <span class=\"sym-15 sym\">name</span>, <span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-16 sym\">exchange</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 46,
+    "code": "    <span class=\"k\">this</span>.<span class=\"sym-12 sym\">name</span> = <span class=\"sym-15 sym\">name</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 47,
+    "code": "    <span class=\"k\">this</span>.<span class=\"sym-13 sym\">exchange</span> = <span class=\"sym-16 sym\">exchange</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 48,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 49,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 50,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-17 sym\">put</span>(Object <span class=\"sym-18 sym\">key</span>, V <span class=\"sym-19 sym\">value</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 51,
+    "code": "    <span class=\"sym-127 sym\">resetKey</span>(<span class=\"sym-18 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 52,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-32 sym\">doPut</span>(<span class=\"sym-19 sym\">value</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 53,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 54,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 55,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-20 sym\">put</span>(Object <span class=\"sym-21 sym\">firstKey</span>, Object <span class=\"sym-22 sym\">secondKey</span>, V <span class=\"sym-23 sym\">value</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 56,
+    "code": "    <span class=\"sym-129 sym\">resetKey</span>(<span class=\"sym-21 sym\">firstKey</span>, <span class=\"sym-22 sym\">secondKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 57,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-32 sym\">doPut</span>(<span class=\"sym-23 sym\">value</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 58,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 59,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 60,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-24 sym\">put</span>(Object <span class=\"sym-25 sym\">firstKey</span>, Object <span class=\"sym-26 sym\">secondKey</span>, Object <span class=\"sym-27 sym\">thirdKey</span>, V <span class=\"sym-28 sym\">value</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 61,
+    "code": "    <span class=\"sym-132 sym\">resetKey</span>(<span class=\"sym-25 sym\">firstKey</span>, <span class=\"sym-26 sym\">secondKey</span>, <span class=\"sym-27 sym\">thirdKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 62,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-32 sym\">doPut</span>(<span class=\"sym-28 sym\">value</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 63,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 64,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 65,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-29 sym\">put</span>(Object[] <span class=\"sym-30 sym\">key</span>, V <span class=\"sym-31 sym\">value</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 66,
+    "code": "    <span class=\"sym-136 sym\">resetKey</span>(<span class=\"sym-30 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 67,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-32 sym\">doPut</span>(<span class=\"sym-31 sym\">value</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 68,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 69,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 70,
+    "code": "  <span class=\"k\">private </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-32 sym\">doPut</span>(V <span class=\"sym-33 sym\">value</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 71,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 72,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.getValue().put(<span class=\"sym-33 sym\">value</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 73,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.store();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 74,
+    "code": "      <span class=\"k\">return</span> <span class=\"k\">this</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 75,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-34 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 76,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to put element in the cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-34 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 77,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 78,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 79,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 80,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 81,
+    "code": "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 82,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 83,
+    "code": "  <span class=\"k\">public </span>V <span class=\"sym-35 sym\">get</span>(Object <span class=\"sym-36 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 84,
+    "code": "    <span class=\"sym-127 sym\">resetKey</span>(<span class=\"sym-36 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 85,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-46 sym\">doGet</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 86,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 87,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 88,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 89,
+    "code": "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 90,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 91,
+    "code": "  <span class=\"a\">@<span class=\"sym-7 sym\">CheckForNull</span></span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 92,
+    "code": "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-37 sym\">get</span>(Object <span class=\"sym-38 sym\">firstKey</span>, Object <span class=\"sym-39 sym\">secondKey</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 93,
+    "code": "    <span class=\"sym-129 sym\">resetKey</span>(<span class=\"sym-38 sym\">firstKey</span>, <span class=\"sym-39 sym\">secondKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 94,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-46 sym\">doGet</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 95,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 96,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 97,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 98,
+    "code": "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 99,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 100,
+    "code": "  <span class=\"a\">@<span class=\"sym-7 sym\">CheckForNull</span></span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 101,
+    "code": "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-40 sym\">get</span>(Object <span class=\"sym-41 sym\">firstKey</span>, Object <span class=\"sym-42 sym\">secondKey</span>, Object <span class=\"sym-43 sym\">thirdKey</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 102,
+    "code": "    <span class=\"sym-132 sym\">resetKey</span>(<span class=\"sym-41 sym\">firstKey</span>, <span class=\"sym-42 sym\">secondKey</span>, <span class=\"sym-43 sym\">thirdKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 103,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-46 sym\">doGet</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 104,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 105,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 106,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 107,
+    "code": "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 108,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 109,
+    "code": "  <span class=\"a\">@<span class=\"sym-7 sym\">CheckForNull</span></span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 110,
+    "code": "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-44 sym\">get</span>(Object[] <span class=\"sym-45 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 111,
+    "code": "    <span class=\"sym-136 sym\">resetKey</span>(<span class=\"sym-45 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 112,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-46 sym\">doGet</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 113,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 114,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 115,
+    "code": "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 116,
+    "code": "  <span class=\"a\">@<span class=\"sym-7 sym\">CheckForNull</span></span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 117,
+    "code": "<span class=\"a\">  </span><span class=\"k\">private </span>V <span class=\"sym-46 sym\">doGet</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 118,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 119,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.fetch();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 120,
+    "code": "      <span class=\"k\">if </span>(!<span class=\"sym-13 sym\">exchange</span>.getValue().isDefined()) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1,
+    "conditions": 2,
+    "coveredConditions": 2
+  },
+  {
+    "line": 121,
+    "code": "        <span class=\"k\">return</span> <span class=\"k\">null</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 122,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 123,
+    "code": "      <span class=\"k\">return</span> (V) <span class=\"sym-13 sym\">exchange</span>.getValue().get();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 124,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-47 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 125,
+    "code": "      <span class=\"cppd\">// TODO add parameters to message</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200"
+  },
+  {
+    "line": 126,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to get element from cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-47 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 127,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 128,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 129,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 130,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-48 sym\">containsKey</span>(Object <span class=\"sym-49 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 131,
+    "code": "    <span class=\"sym-127 sym\">resetKey</span>(<span class=\"sym-49 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 132,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-59 sym\">doContainsKey</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 133,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 134,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 135,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-50 sym\">containsKey</span>(Object <span class=\"sym-51 sym\">firstKey</span>, Object <span class=\"sym-52 sym\">secondKey</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 136,
+    "code": "    <span class=\"sym-129 sym\">resetKey</span>(<span class=\"sym-51 sym\">firstKey</span>, <span class=\"sym-52 sym\">secondKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 137,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-59 sym\">doContainsKey</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 138,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 139,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 140,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-53 sym\">containsKey</span>(Object <span class=\"sym-54 sym\">firstKey</span>, Object <span class=\"sym-55 sym\">secondKey</span>, Object <span class=\"sym-56 sym\">thirdKey</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 141,
+    "code": "    <span class=\"sym-132 sym\">resetKey</span>(<span class=\"sym-54 sym\">firstKey</span>, <span class=\"sym-55 sym\">secondKey</span>, <span class=\"sym-56 sym\">thirdKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 142,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-59 sym\">doContainsKey</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 143,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 144,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 145,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-57 sym\">containsKey</span>(Object[] <span class=\"sym-58 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 146,
+    "code": "    <span class=\"sym-136 sym\">resetKey</span>(<span class=\"sym-58 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 147,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-59 sym\">doContainsKey</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 148,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 149,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 150,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">boolean </span><span class=\"sym-59 sym\">doContainsKey</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 151,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200"
+  },
+  {
+    "line": 152,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.fetch();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 153,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-13 sym\">exchange</span>.isValueDefined();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 154,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-60 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 155,
+    "code": "      <span class=\"cppd\">// TODO add parameters to message</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200"
+  },
+  {
+    "line": 156,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to check if element is in cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-60 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 157,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200"
+  },
+  {
+    "line": 158,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200"
+  },
+  {
+    "line": 159,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200"
+  },
+  {
+    "line": 160,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-61 sym\">remove</span>(Object <span class=\"sym-62 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 161,
+    "code": "    <span class=\"sym-127 sym\">resetKey</span>(<span class=\"sym-62 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 162,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-72 sym\">doRemove</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 163,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 164,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 165,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-63 sym\">remove</span>(Object <span class=\"sym-64 sym\">firstKey</span>, Object <span class=\"sym-65 sym\">secondKey</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 166,
+    "code": "    <span class=\"sym-129 sym\">resetKey</span>(<span class=\"sym-64 sym\">firstKey</span>, <span class=\"sym-65 sym\">secondKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 167,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-72 sym\">doRemove</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 168,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 169,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 170,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-66 sym\">remove</span>(Object <span class=\"sym-67 sym\">firstKey</span>, Object <span class=\"sym-68 sym\">secondKey</span>, Object <span class=\"sym-69 sym\">thirdKey</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 171,
+    "code": "    <span class=\"sym-132 sym\">resetKey</span>(<span class=\"sym-67 sym\">firstKey</span>, <span class=\"sym-68 sym\">secondKey</span>, <span class=\"sym-69 sym\">thirdKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 172,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-72 sym\">doRemove</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 173,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 174,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 175,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-70 sym\">remove</span>(Object[] <span class=\"sym-71 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 176,
+    "code": "    <span class=\"sym-136 sym\">resetKey</span>(<span class=\"sym-71 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 177,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-72 sym\">doRemove</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 178,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 179,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 180,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">boolean </span><span class=\"sym-72 sym\">doRemove</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 181,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 182,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-13 sym\">exchange</span>.remove();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "6f1161efb92298ace498df544e38f6f97216ec36",
+    "scmDate": "2013-04-26T15:19:16+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 183,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-73 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 184,
+    "code": "      <span class=\"cppd\">// TODO add parameters to message</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e108f5de333cf36aff978aa03940590f9caca9fc",
+    "scmDate": "2013-10-10T12:18:02+0200"
+  },
+  {
+    "line": 185,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to get element from cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-73 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 186,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 187,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 188,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 189,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 190,
+    "code": "<span class=\"cppd\">   * Removes everything in the specified group.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 191,
+    "code": "<span class=\"cppd\">   *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 192,
+    "code": "<span class=\"cppd\">   * @param group The group name.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 193,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 194,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-74 sym\">clear</span>(Object <span class=\"sym-75 sym\">key</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 195,
+    "code": "    <span class=\"sym-127 sym\">resetKey</span>(<span class=\"sym-75 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 196,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-85 sym\">doClear</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 197,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 198,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 199,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-76 sym\">clear</span>(Object <span class=\"sym-77 sym\">firstKey</span>, Object <span class=\"sym-78 sym\">secondKey</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 200,
+    "code": "    <span class=\"sym-129 sym\">resetKey</span>(<span class=\"sym-77 sym\">firstKey</span>, <span class=\"sym-78 sym\">secondKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 201,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-85 sym\">doClear</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 202,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 203,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 204,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-79 sym\">clear</span>(Object <span class=\"sym-80 sym\">firstKey</span>, Object <span class=\"sym-81 sym\">secondKey</span>, Object <span class=\"sym-82 sym\">thirdKey</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 205,
+    "code": "    <span class=\"sym-132 sym\">resetKey</span>(<span class=\"sym-80 sym\">firstKey</span>, <span class=\"sym-81 sym\">secondKey</span>, <span class=\"sym-82 sym\">thirdKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 206,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-85 sym\">doClear</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 207,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 208,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 209,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-83 sym\">clear</span>(Object[] <span class=\"sym-84 sym\">key</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 210,
+    "code": "    <span class=\"sym-136 sym\">resetKey</span>(<span class=\"sym-84 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 211,
+    "code": "    <span class=\"k\">return</span> <span class=\"sym-85 sym\">doClear</span>();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 212,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 213,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 214,
+    "code": "  <span class=\"k\">private </span><span class=\"sym-11 sym\">Cache</span>&lt;V&gt; <span class=\"sym-85 sym\">doClear</span>() {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 215,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 216,
+    "code": "      <span class=\"sym-3 sym\">Key</span> <span class=\"sym-86 sym\">to</span> = <span class=\"k\">new</span> <span class=\"sym-3 sym\">Key</span>(<span class=\"sym-13 sym\">exchange</span>.getKey());",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 217,
+    "code": "      <span class=\"sym-86 sym\">to</span>.append(<span class=\"sym-3 sym\">Key</span>.AFTER);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 218,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.removeKeyRange(<span class=\"sym-13 sym\">exchange</span>.getKey(), <span class=\"sym-86 sym\">to</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 219,
+    "code": "      <span class=\"k\">return</span> <span class=\"k\">this</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 220,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-87 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 221,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to clear values from cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-87 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 222,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 223,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 224,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 225,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 226,
+    "code": "<span class=\"cppd\">   * Clears the default as well as all group caches.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 227,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 228,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-88 sym\">clear</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 229,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 230,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 231,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.removeAll();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 232,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-89 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 233,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to clear cache\"</span>, <span class=\"sym-89 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 234,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 235,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 236,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 237,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 238,
+    "code": "<span class=\"cppd\">   * Returns the set of cache keys associated with this group.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 239,
+    "code": "<span class=\"cppd\">   * TODO implement a lazy-loading equivalent with Iterator/Iterable</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 240,
+    "code": "<span class=\"cppd\">   *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 241,
+    "code": "<span class=\"cppd\">   * @param group The group.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 242,
+    "code": "<span class=\"cppd\">   * @return The set of cache keys for this group.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 243,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 244,
+    "code": "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"rawtypes\"</span>)",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 245,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-10 sym\">Set</span> <span class=\"sym-90 sym\">keySet</span>(Object <span class=\"sym-91 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 246,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 247,
+    "code": "      <span class=\"sym-10 sym\">Set</span>&lt;Object&gt; <span class=\"sym-92 sym\">keys</span> = <span class=\"sym-1 sym\">Sets</span>.newLinkedHashSet();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 248,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 249,
+    "code": "      <span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-93 sym\">iteratorExchange</span> = <span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 250,
+    "code": "      <span class=\"sym-93 sym\">iteratorExchange</span>.append(<span class=\"sym-91 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 251,
+    "code": "      <span class=\"sym-93 sym\">iteratorExchange</span>.append(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 252,
+    "code": "      <span class=\"k\">while </span>(<span class=\"sym-93 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1,
+    "conditions": 2,
+    "coveredConditions": 2
+  },
+  {
+    "line": 253,
+    "code": "        <span class=\"sym-92 sym\">keys</span>.add(<span class=\"sym-93 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 254,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 255,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-92 sym\">keys</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 256,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-94 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 257,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-94 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 258,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 259,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 260,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 261,
+    "code": "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"rawtypes\"</span>)",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 262,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-10 sym\">Set</span> <span class=\"sym-95 sym\">keySet</span>(Object <span class=\"sym-96 sym\">firstKey</span>, Object <span class=\"sym-97 sym\">secondKey</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 263,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 264,
+    "code": "      <span class=\"sym-10 sym\">Set</span>&lt;Object&gt; <span class=\"sym-98 sym\">keys</span> = <span class=\"sym-1 sym\">Sets</span>.newLinkedHashSet();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 265,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 266,
+    "code": "      <span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-99 sym\">iteratorExchange</span> = <span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 267,
+    "code": "      <span class=\"sym-99 sym\">iteratorExchange</span>.append(<span class=\"sym-96 sym\">firstKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 268,
+    "code": "      <span class=\"sym-99 sym\">iteratorExchange</span>.append(<span class=\"sym-97 sym\">secondKey</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 269,
+    "code": "      <span class=\"sym-99 sym\">iteratorExchange</span>.append(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 270,
+    "code": "      <span class=\"k\">while </span>(<span class=\"sym-99 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1,
+    "conditions": 2,
+    "coveredConditions": 2
+  },
+  {
+    "line": 271,
+    "code": "        <span class=\"sym-98 sym\">keys</span>.add(<span class=\"sym-99 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 272,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 273,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-98 sym\">keys</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 274,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-100 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 275,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-100 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 276,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 277,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 278,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 279,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 280,
+    "code": "<span class=\"cppd\">   * Returns the set of keys associated with this cache.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 281,
+    "code": "<span class=\"cppd\">   *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 282,
+    "code": "<span class=\"cppd\">   * @return The set containing the keys for this cache.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 283,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 284,
+    "code": "  <span class=\"k\">public </span><span class=\"sym-10 sym\">Set</span>&lt;Object&gt; <span class=\"sym-101 sym\">keySet</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 285,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 286,
+    "code": "      <span class=\"sym-10 sym\">Set</span>&lt;Object&gt; <span class=\"sym-102 sym\">keys</span> = <span class=\"sym-1 sym\">Sets</span>.newLinkedHashSet();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 287,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 288,
+    "code": "      <span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-103 sym\">iteratorExchange</span> = <span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 289,
+    "code": "      <span class=\"sym-103 sym\">iteratorExchange</span>.append(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 290,
+    "code": "      <span class=\"k\">while </span>(<span class=\"sym-103 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1,
+    "conditions": 2,
+    "coveredConditions": 2
+  },
+  {
+    "line": 291,
+    "code": "        <span class=\"sym-102 sym\">keys</span>.add(<span class=\"sym-103 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 292,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 293,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-102 sym\">keys</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 294,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-104 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 295,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-104 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 296,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 297,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 298,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 299,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 300,
+    "code": "<span class=\"cppd\">   * Lazy-loading values for given keys</span>",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 301,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 302,
+    "code": "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-105 sym\">values</span>(Object <span class=\"sym-106 sym\">firstKey</span>, Object <span class=\"sym-107 sym\">secondKey</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 303,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 304,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 305,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.append(<span class=\"sym-106 sym\">firstKey</span>).append(<span class=\"sym-107 sym\">secondKey</span>).append(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 306,
+    "code": "      <span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-108 sym\">iteratorExchange</span> = <span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 307,
+    "code": "      <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-109 sym\">filter</span> = <span class=\"k\">new</span> <span class=\"sym-4 sym\">KeyFilter</span>().append(<span class=\"sym-4 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-106 sym\">firstKey</span>)).append(<span class=\"sym-4 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-107 sym\">secondKey</span>));",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 308,
+    "code": "      <span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"sym-139 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-108 sym\">iteratorExchange</span>, <span class=\"sym-109 sym\">filter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 309,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-110 sym\">e</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 310,
+    "code": "      <span class=\"k\">throw</span> <span class=\"sym-111 sym\">failToGetValues</span>(<span class=\"sym-110 sym\">e</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "904b462c56317b1fb5a616534bd58aa9c9097d0b",
+    "scmDate": "2014-06-20T14:13:01+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 311,
+    "code": "    }",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 312,
+    "code": "  }",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "904b462c56317b1fb5a616534bd58aa9c9097d0b",
+    "scmDate": "2014-06-20T14:13:01+0200"
+  },
+  {
+    "line": 313,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "904b462c56317b1fb5a616534bd58aa9c9097d0b",
+    "scmDate": "2014-06-20T14:13:01+0200"
+  },
+  {
+    "line": 314,
+    "code": "  <span class=\"k\">private </span>IllegalStateException <span class=\"sym-111 sym\">failToGetValues</span>(Exception <span class=\"sym-112 sym\">e</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "904b462c56317b1fb5a616534bd58aa9c9097d0b",
+    "scmDate": "2014-06-20T14:13:01+0200"
+  },
+  {
+    "line": 315,
+    "code": "    <span class=\"k\">return</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"s\">\"Fail to get values from cache \" </span>+ <span class=\"sym-12 sym\">name</span>, <span class=\"sym-112 sym\">e</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "904b462c56317b1fb5a616534bd58aa9c9097d0b",
+    "scmDate": "2014-06-20T14:13:01+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 316,
+    "code": "  }",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 317,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 318,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "171cd79c0b5152461434951ed5d6e5e58849a7b7",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 319,
+    "code": "<span class=\"cppd\">   * Lazy-loading values for a given key</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 320,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 321,
+    "code": "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-113 sym\">values</span>(Object <span class=\"sym-114 sym\">firstKey</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 322,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 323,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 324,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.append(<span class=\"sym-114 sym\">firstKey</span>).append(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 325,
+    "code": "      <span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-115 sym\">iteratorExchange</span> = <span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 326,
+    "code": "      <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-116 sym\">filter</span> = <span class=\"k\">new</span> <span class=\"sym-4 sym\">KeyFilter</span>().append(<span class=\"sym-4 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-114 sym\">firstKey</span>));",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 327,
+    "code": "      <span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"sym-139 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-115 sym\">iteratorExchange</span>, <span class=\"sym-116 sym\">filter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 328,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-117 sym\">e</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "46395126b184c343df5471a147cdb48133f59f6f",
+    "scmDate": "2014-04-23T14:41:32+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 329,
+    "code": "      <span class=\"k\">throw</span> <span class=\"sym-111 sym\">failToGetValues</span>(<span class=\"sym-117 sym\">e</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "904b462c56317b1fb5a616534bd58aa9c9097d0b",
+    "scmDate": "2014-06-20T14:13:01+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 330,
+    "code": "    }",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "46395126b184c343df5471a147cdb48133f59f6f",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 331,
+    "code": "  }",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "46395126b184c343df5471a147cdb48133f59f6f",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 332,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "46395126b184c343df5471a147cdb48133f59f6f",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 333,
+    "code": "  <span class=\"cppd\">/**</span>",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "46395126b184c343df5471a147cdb48133f59f6f",
+    "scmDate": "2014-04-23T14:41:32+0200"
+  },
+  {
+    "line": 334,
+    "code": "<span class=\"cppd\">   * Lazy-loading values</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 335,
+    "code": "<span class=\"cppd\">   */</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 336,
+    "code": "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-118 sym\">values</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 337,
+    "code": "    <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 338,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.clear().append(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 339,
+    "code": "      <span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-119 sym\">iteratorExchange</span> = <span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 340,
+    "code": "      <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-120 sym\">filter</span> = <span class=\"k\">new</span> <span class=\"sym-4 sym\">KeyFilter</span>().append(<span class=\"sym-4 sym\">KeyFilter</span>.ALL);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 341,
+    "code": "      <span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"sym-139 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-119 sym\">iteratorExchange</span>, <span class=\"sym-120 sym\">filter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 342,
+    "code": "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-121 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 343,
+    "code": "      <span class=\"k\">throw</span> <span class=\"sym-111 sym\">failToGetValues</span>(<span class=\"sym-121 sym\">e</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "904b462c56317b1fb5a616534bd58aa9c9097d0b",
+    "scmDate": "2014-06-20T14:13:01+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 344,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 345,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 346,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 347,
+    "code": "  <span class=\"k\">public </span>Iterable&lt;<span class=\"sym-177 sym\">Entry</span>&lt;V&gt;&gt; <span class=\"sym-122 sym\">entries</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 348,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.clear().to(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 349,
+    "code": "    <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-123 sym\">filter</span> = <span class=\"k\">new</span> <span class=\"sym-4 sym\">KeyFilter</span>().append(<span class=\"sym-4 sym\">KeyFilter</span>.ALL);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 350,
+    "code": "    <span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"sym-156 sym\">EntryIterable</span>&lt;V&gt;(<span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>), <span class=\"sym-123 sym\">filter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 351,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 352,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 353,
+    "code": "  <span class=\"k\">public </span>Iterable&lt;<span class=\"sym-177 sym\">Entry</span>&lt;V&gt;&gt; <span class=\"sym-124 sym\">entries</span>(Object <span class=\"sym-125 sym\">firstKey</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 354,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.clear().append(<span class=\"sym-125 sym\">firstKey</span>).append(<span class=\"sym-3 sym\">Key</span>.BEFORE);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 355,
+    "code": "    <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-126 sym\">filter</span> = <span class=\"k\">new</span> <span class=\"sym-4 sym\">KeyFilter</span>().append(<span class=\"sym-4 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-125 sym\">firstKey</span>));",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 356,
+    "code": "    <span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"sym-156 sym\">EntryIterable</span>&lt;V&gt;(<span class=\"k\">new</span> <span class=\"sym-2 sym\">Exchange</span>(<span class=\"sym-13 sym\">exchange</span>), <span class=\"sym-126 sym\">filter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 357,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 358,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 359,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-127 sym\">resetKey</span>(Object <span class=\"sym-128 sym\">key</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 360,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 361,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.append(<span class=\"sym-128 sym\">key</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 362,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 363,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 364,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-129 sym\">resetKey</span>(Object <span class=\"sym-130 sym\">first</span>, Object <span class=\"sym-131 sym\">second</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 365,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 366,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.append(<span class=\"sym-130 sym\">first</span>).append(<span class=\"sym-131 sym\">second</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 367,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 368,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 369,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-132 sym\">resetKey</span>(Object <span class=\"sym-133 sym\">first</span>, Object <span class=\"sym-134 sym\">second</span>, Object <span class=\"sym-135 sym\">third</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 370,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 371,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.append(<span class=\"sym-133 sym\">first</span>).append(<span class=\"sym-134 sym\">second</span>).append(<span class=\"sym-135 sym\">third</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 372,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 373,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 374,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-136 sym\">resetKey</span>(Object[] <span class=\"sym-137 sym\">keys</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 375,
+    "code": "    <span class=\"sym-13 sym\">exchange</span>.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 376,
+    "code": "    <span class=\"k\">for</span> (Object <span class=\"sym-138 sym\">o</span> : <span class=\"sym-137 sym\">keys</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0,
+    "conditions": 2,
+    "coveredConditions": 0
+  },
+  {
+    "line": 377,
+    "code": "      <span class=\"sym-13 sym\">exchange</span>.append(<span class=\"sym-138 sym\">o</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 378,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 379,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 380,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "7b301db8c7e3000ff2a04fce5534e45e7d973a1f",
+    "scmDate": "2014-04-25T11:17:09+0200"
+  },
+  {
+    "line": 381,
+    "code": "  <span class=\"cppd\">//</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 382,
+    "code": "  <span class=\"cppd\">// LAZY ITERATORS AND ITERABLES</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 383,
+    "code": "  <span class=\"cppd\">//</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 384,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 385,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class</span> <span class=\"sym-139 sym\">ValueIterable</span>&lt;T&gt; <span class=\"k\">implements</span> Iterable&lt;T&gt; {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "6074164392edd3db2dfdfd21d05cd56c19e2b0e6",
+    "scmDate": "2014-07-25T16:31:45+0200"
+  },
+  {
+    "line": 386,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-8 sym\">Iterator</span>&lt;T&gt; <span class=\"sym-140 sym\">iterator</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 387,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 388,
+    "code": "    <span class=\"k\">private </span><span class=\"sym-141 sym\">ValueIterable</span>(<span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-142 sym\">exchange</span>, <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-143 sym\">keyFilter</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 389,
+    "code": "      <span class=\"k\">this</span>.<span class=\"sym-140 sym\">iterator</span> = <span class=\"k\">new</span> <span class=\"sym-145 sym\">ValueIterator</span>&lt;T&gt;(<span class=\"sym-142 sym\">exchange</span>, <span class=\"sym-143 sym\">keyFilter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 390,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 391,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 392,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 393,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-8 sym\">Iterator</span>&lt;T&gt; <span class=\"sym-144 sym\">iterator</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 394,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-140 sym\">iterator</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 395,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 396,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 397,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 398,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class</span> <span class=\"sym-145 sym\">ValueIterator</span>&lt;T&gt; <span class=\"k\">implements</span> <span class=\"sym-8 sym\">Iterator</span>&lt;T&gt; {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "6074164392edd3db2dfdfd21d05cd56c19e2b0e6",
+    "scmDate": "2014-07-25T16:31:45+0200"
+  },
+  {
+    "line": 399,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-146 sym\">exchange</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 400,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-147 sym\">keyFilter</span>;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 401,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 402,
+    "code": "    <span class=\"k\">private </span><span class=\"sym-148 sym\">ValueIterator</span>(<span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-149 sym\">exchange</span>, <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-150 sym\">keyFilter</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 403,
+    "code": "      <span class=\"k\">this</span>.<span class=\"sym-146 sym\">exchange</span> = <span class=\"sym-149 sym\">exchange</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 404,
+    "code": "      <span class=\"k\">this</span>.<span class=\"sym-147 sym\">keyFilter</span> = <span class=\"sym-150 sym\">keyFilter</span>;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 405,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 406,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 407,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 408,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-151 sym\">hasNext</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 409,
+    "code": "      <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 410,
+    "code": "        <span class=\"k\">return</span> <span class=\"sym-146 sym\">exchange</span>.hasNext(<span class=\"sym-147 sym\">keyFilter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 411,
+    "code": "      } <span class=\"k\">catch </span>(<span class=\"sym-5 sym\">PersistitException</span> <span class=\"sym-152 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 0,
+    "duplicated": true
+  },
+  {
+    "line": 412,
+    "code": "        <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"sym-152 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 0,
+    "duplicated": true
+  },
+  {
+    "line": 413,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 414,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 415,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 416,
+    "code": "    <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "duplicated": true
+  },
+  {
+    "line": 417,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "duplicated": true
+  },
+  {
+    "line": 418,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span>T <span class=\"sym-153 sym\">next</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 419,
+    "code": "      <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 420,
+    "code": "        <span class=\"sym-146 sym\">exchange</span>.next(<span class=\"sym-147 sym\">keyFilter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 421,
+    "code": "      } <span class=\"k\">catch </span>(<span class=\"sym-5 sym\">PersistitException</span> <span class=\"sym-154 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 422,
+    "code": "        <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"sym-154 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 423,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 424,
+    "code": "      <span class=\"k\">if </span>(<span class=\"sym-146 sym\">exchange</span>.getValue().isDefined()) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200",
+    "lineHits": 1,
+    "conditions": 2,
+    "coveredConditions": 1
+  },
+  {
+    "line": 425,
+    "code": "        <span class=\"k\">return</span> (T) <span class=\"sym-146 sym\">exchange</span>.getValue().get();",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 426,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 427,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> <span class=\"sym-9 sym\">NoSuchElementException</span>();",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 428,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 429,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 430,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 431,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-155 sym\">remove</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "babb50a4f143c312df1ba45955d3d589ecb2845f",
+    "scmDate": "2013-05-29T14:27:38+0200"
+  },
+  {
+    "line": 432,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> UnsupportedOperationException(<span class=\"s\">\"Removing an item is not supported\"</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "34cce8e330192c56a159a856ebd8072d38299087",
+    "scmDate": "2014-02-24T14:21:50+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 433,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 434,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 435,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 436,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class</span> <span class=\"sym-156 sym\">EntryIterable</span>&lt;T&gt; <span class=\"k\">implements</span> Iterable&lt;<span class=\"sym-177 sym\">Entry</span>&lt;T&gt;&gt; {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "6074164392edd3db2dfdfd21d05cd56c19e2b0e6",
+    "scmDate": "2014-07-25T16:31:45+0200"
+  },
+  {
+    "line": 437,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-162 sym\">EntryIterator</span>&lt;T&gt; <span class=\"sym-157 sym\">it</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 438,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 439,
+    "code": "    <span class=\"k\">private </span><span class=\"sym-158 sym\">EntryIterable</span>(<span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-159 sym\">exchange</span>, <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-160 sym\">keyFilter</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 440,
+    "code": "      <span class=\"sym-157 sym\">it</span> = <span class=\"k\">new</span> <span class=\"sym-162 sym\">EntryIterator</span>&lt;T&gt;(<span class=\"sym-159 sym\">exchange</span>, <span class=\"sym-160 sym\">keyFilter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 441,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 442,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 443,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 444,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-8 sym\">Iterator</span>&lt;<span class=\"sym-177 sym\">Entry</span>&lt;T&gt;&gt; <span class=\"sym-161 sym\">iterator</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 445,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-157 sym\">it</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 446,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 447,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 448,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 449,
+    "code": "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class</span> <span class=\"sym-162 sym\">EntryIterator</span>&lt;T&gt; <span class=\"k\">implements</span> <span class=\"sym-8 sym\">Iterator</span>&lt;<span class=\"sym-177 sym\">Entry</span>&lt;T&gt;&gt; {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "6074164392edd3db2dfdfd21d05cd56c19e2b0e6",
+    "scmDate": "2014-07-25T16:31:45+0200"
+  },
+  {
+    "line": 450,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-163 sym\">exchange</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 451,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-164 sym\">keyFilter</span>;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 452,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 453,
+    "code": "    <span class=\"k\">private </span><span class=\"sym-165 sym\">EntryIterator</span>(<span class=\"sym-2 sym\">Exchange</span> <span class=\"sym-166 sym\">exchange</span>, <span class=\"sym-4 sym\">KeyFilter</span> <span class=\"sym-167 sym\">keyFilter</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 454,
+    "code": "      <span class=\"k\">this</span>.<span class=\"sym-163 sym\">exchange</span> = <span class=\"sym-166 sym\">exchange</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 455,
+    "code": "      <span class=\"k\">this</span>.<span class=\"sym-164 sym\">keyFilter</span> = <span class=\"sym-167 sym\">keyFilter</span>;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 456,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 457,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 458,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 459,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-168 sym\">hasNext</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 460,
+    "code": "      <span class=\"k\">try </span>{",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 461,
+    "code": "        <span class=\"k\">return</span> <span class=\"sym-163 sym\">exchange</span>.hasNext(<span class=\"sym-164 sym\">keyFilter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1,
+    "duplicated": true
+  },
+  {
+    "line": 462,
+    "code": "      } <span class=\"k\">catch </span>(<span class=\"sym-5 sym\">PersistitException</span> <span class=\"sym-169 sym\">e</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 0,
+    "duplicated": true
+  },
+  {
+    "line": 463,
+    "code": "        <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"sym-169 sym\">e</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 0,
+    "duplicated": true
+  },
+  {
+    "line": 464,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 465,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 466,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 467,
+    "code": "    <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "duplicated": true
+  },
+  {
+    "line": 468,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "duplicated": true
+  },
+  {
+    "line": 469,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-177 sym\">Entry</span>&lt;T&gt; <span class=\"sym-170 sym\">next</span>() {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 470,
+    "code": "      <span class=\"k\">try </span>{",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 471,
+    "code": "        <span class=\"sym-163 sym\">exchange</span>.next(<span class=\"sym-164 sym\">keyFilter</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 472,
+    "code": "      } <span class=\"k\">catch </span>(<span class=\"sym-5 sym\">PersistitException</span> <span class=\"sym-171 sym\">e</span>) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 473,
+    "code": "        <span class=\"k\">throw</span> <span class=\"k\">new</span> IllegalStateException(<span class=\"sym-171 sym\">e</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 474,
+    "code": "      }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 475,
+    "code": "      <span class=\"k\">if </span>(<span class=\"sym-163 sym\">exchange</span>.getValue().isDefined()) {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1,
+    "conditions": 2,
+    "coveredConditions": 1
+  },
+  {
+    "line": 476,
+    "code": "        T <span class=\"sym-172 sym\">value</span> = (T) <span class=\"sym-163 sym\">exchange</span>.getValue().get();",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 477,
+    "code": "        <span class=\"sym-3 sym\">Key</span> <span class=\"sym-173 sym\">key</span> = <span class=\"sym-163 sym\">exchange</span>.getKey();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 478,
+    "code": "        Object[] <span class=\"sym-174 sym\">array</span> = <span class=\"k\">new</span> Object[<span class=\"sym-173 sym\">key</span>.getDepth()];",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 479,
+    "code": "        <span class=\"k\">for</span> (<span class=\"k\">int </span><span class=\"sym-175 sym\">i</span> = <span class=\"c\">0</span>; <span class=\"sym-175 sym\">i</span> &lt; <span class=\"sym-173 sym\">key</span>.getDepth(); <span class=\"sym-175 sym\">i</span>++) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1,
+    "conditions": 2,
+    "coveredConditions": 2
+  },
+  {
+    "line": 480,
+    "code": "          <span class=\"sym-174 sym\">array</span>[<span class=\"sym-175 sym\">i</span>] = <span class=\"sym-173 sym\">key</span>.indexTo(<span class=\"sym-175 sym\">i</span> - <span class=\"sym-173 sym\">key</span>.getDepth()).decode();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 481,
+    "code": "        }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 482,
+    "code": "        <span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"sym-177 sym\">Entry</span>&lt;T&gt;(<span class=\"sym-174 sym\">array</span>, <span class=\"sym-172 sym\">value</span>);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 483,
+    "code": "      }",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 484,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> <span class=\"sym-9 sym\">NoSuchElementException</span>();",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 485,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 486,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 487,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 488,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-176 sym\">remove</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 489,
+    "code": "      <span class=\"k\">throw</span> <span class=\"k\">new</span> UnsupportedOperationException(<span class=\"s\">\"Removing an item is not supported\"</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "34cce8e330192c56a159a856ebd8072d38299087",
+    "scmDate": "2014-02-24T14:21:50+0100",
+    "lineHits": 0
+  },
+  {
+    "line": 490,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 491,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 492,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 493,
+    "code": "  <span class=\"k\">public </span><span class=\"k\">static </span><span class=\"k\">class</span> <span class=\"sym-177 sym\">Entry</span>&lt;V&gt; {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "6074164392edd3db2dfdfd21d05cd56c19e2b0e6",
+    "scmDate": "2014-07-25T16:31:45+0200"
+  },
+  {
+    "line": 494,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span>Object[] <span class=\"sym-178 sym\">key</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 495,
+    "code": "    <span class=\"k\">private </span><span class=\"k\">final </span>V <span class=\"sym-179 sym\">value</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 496,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 497,
+    "code": "    <span class=\"sym-180 sym\">Entry</span>(Object[] <span class=\"sym-181 sym\">key</span>, V <span class=\"sym-182 sym\">value</span>) {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100",
+    "lineHits": 1
+  },
+  {
+    "line": 498,
+    "code": "      <span class=\"k\">this</span>.<span class=\"sym-178 sym\">key</span> = <span class=\"sym-181 sym\">key</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 499,
+    "code": "      <span class=\"k\">this</span>.<span class=\"sym-179 sym\">value</span> = <span class=\"sym-182 sym\">value</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 500,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 501,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 502,
+    "code": "    <span class=\"k\">public </span>Object[] <span class=\"sym-183 sym\">key</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 503,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-178 sym\">key</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 504,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 505,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 506,
+    "code": "    <span class=\"a\">@<span class=\"sym-7 sym\">CheckForNull</span></span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 507,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span>V <span class=\"sym-184 sym\">value</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 508,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-179 sym\">value</span>;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 1
+  },
+  {
+    "line": 509,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 510,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 511,
+    "code": "    <span class=\"a\">@Override</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 512,
+    "code": "<span class=\"a\">    </span><span class=\"k\">public </span>String <span class=\"sym-185 sym\">toString</span>() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 513,
+    "code": "      <span class=\"k\">return</span> <span class=\"sym-6 sym\">ToStringBuilder</span>.reflectionToString(<span class=\"k\">this</span>);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200",
+    "lineHits": 0
+  },
+  {
+    "line": 514,
+    "code": "    }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 515,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 516,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "43fc31f75a2de06b23faefb0d2bbf1dd97290232",
+    "scmDate": "2014-05-05T16:43:19+0200"
+  },
+  {
+    "line": 517,
+    "code": "}",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 518,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  }
+]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/resources-without-ncloc-data.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/resources-without-ncloc-data.json
new file mode 100644 (file)
index 0000000..dfbacdf
--- /dev/null
@@ -0,0 +1,150 @@
+[
+  {
+    "id": 19983,
+    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "name": "Cache.java",
+    "scope": "FIL",
+    "qualifier": "FIL",
+    "date": "2014-07-21T23:18:51+0200",
+    "creationDate": "2013-04-17T04:06:45+0200",
+    "lname": "src/main/java/org/sonar/batch/index/Cache.java",
+    "lang": "java",
+    "msr": [
+      {
+        "key": "lines",
+        "val": 519.0,
+        "frmt_val": "519"
+      },
+      {
+        "key": "ncloc",
+        "val": 379.0,
+        "frmt_val": "379"
+      },
+      {
+        "key": "classes",
+        "val": 6.0,
+        "frmt_val": "6"
+      },
+      {
+        "key": "functions",
+        "val": 56.0,
+        "frmt_val": "56"
+      },
+      {
+        "key": "accessors",
+        "val": 0.0,
+        "frmt_val": "0"
+      },
+      {
+        "key": "statements",
+        "val": 174.0,
+        "frmt_val": "174"
+      },
+      {
+        "key": "public_api",
+        "val": 33.0,
+        "frmt_val": "33"
+      },
+      {
+        "key": "comment_lines",
+        "val": 23.0,
+        "frmt_val": "23"
+      },
+      {
+        "key": "comment_lines_density",
+        "val": 5.7,
+        "frmt_val": "5.7%"
+      },
+      {
+        "key": "public_documented_api_density",
+        "val": 36.4,
+        "frmt_val": "36.4%"
+      },
+      {
+        "key": "public_undocumented_api",
+        "val": 21.0,
+        "frmt_val": "21"
+      },
+      {
+        "key": "complexity",
+        "val": 116.0,
+        "frmt_val": "116"
+      },
+      {
+        "key": "function_complexity",
+        "val": 2.1,
+        "frmt_val": "2.1"
+      },
+      {
+        "key": "coverage",
+        "val": 74.3,
+        "frmt_val": "74.3%"
+      },
+      {
+        "key": "lines_to_cover",
+        "val": 194.0,
+        "frmt_val": "194"
+      },
+      {
+        "key": "uncovered_lines",
+        "val": 50.0,
+        "frmt_val": "50"
+      },
+      {
+        "key": "line_coverage",
+        "val": 74.2,
+        "frmt_val": "74.2%"
+      },
+      {
+        "key": "conditions_to_cover",
+        "val": 16.0,
+        "frmt_val": "16"
+      },
+      {
+        "key": "uncovered_conditions",
+        "val": 4.0,
+        "frmt_val": "4"
+      },
+      {
+        "key": "branch_coverage",
+        "val": 75.0,
+        "frmt_val": "75.0%"
+      },
+      {
+        "key": "duplicated_lines",
+        "val": 30.0,
+        "frmt_val": "30"
+      },
+      {
+        "key": "duplicated_blocks",
+        "val": 2.0,
+        "frmt_val": "2"
+      },
+      {
+        "key": "duplicated_files",
+        "val": 1.0,
+        "frmt_val": "1"
+      },
+      {
+        "key": "duplicated_lines_density",
+        "val": 5.8,
+        "frmt_val": "5.8%"
+      },
+      {
+        "key": "major_violations",
+        "val": 1.0,
+        "frmt_val": "1"
+      },
+      {
+        "key": "minor_violations",
+        "val": 1.0,
+        "frmt_val": "1"
+      },
+      {
+        "key": "info_violations",
+        "val": 4.0,
+        "frmt_val": "4"
+      }
+    ]
+  }
+]
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/resources.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/resources.json
new file mode 100644 (file)
index 0000000..415718c
--- /dev/null
@@ -0,0 +1,154 @@
+[
+  {
+    "id": 19983,
+    "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "name": "Cache.java",
+    "scope": "FIL",
+    "qualifier": "FIL",
+    "date": "2014-07-21T23:18:51+0200",
+    "creationDate": "2013-04-17T04:06:45+0200",
+    "lname": "src/main/java/org/sonar/batch/index/Cache.java",
+    "lang": "java",
+    "msr": [
+      {
+        "key": "lines",
+        "val": 519.0,
+        "frmt_val": "519"
+      },
+      {
+        "key": "ncloc",
+        "val": 379.0,
+        "frmt_val": "379"
+      },
+      {
+        "key": "classes",
+        "val": 6.0,
+        "frmt_val": "6"
+      },
+      {
+        "key": "functions",
+        "val": 56.0,
+        "frmt_val": "56"
+      },
+      {
+        "key": "accessors",
+        "val": 0.0,
+        "frmt_val": "0"
+      },
+      {
+        "key": "statements",
+        "val": 174.0,
+        "frmt_val": "174"
+      },
+      {
+        "key": "public_api",
+        "val": 33.0,
+        "frmt_val": "33"
+      },
+      {
+        "key": "comment_lines",
+        "val": 23.0,
+        "frmt_val": "23"
+      },
+      {
+        "key": "comment_lines_density",
+        "val": 5.7,
+        "frmt_val": "5.7%"
+      },
+      {
+        "key": "public_documented_api_density",
+        "val": 36.4,
+        "frmt_val": "36.4%"
+      },
+      {
+        "key": "public_undocumented_api",
+        "val": 21.0,
+        "frmt_val": "21"
+      },
+      {
+        "key": "complexity",
+        "val": 116.0,
+        "frmt_val": "116"
+      },
+      {
+        "key": "function_complexity",
+        "val": 2.1,
+        "frmt_val": "2.1"
+      },
+      {
+        "key": "coverage",
+        "val": 74.3,
+        "frmt_val": "74.3%"
+      },
+      {
+        "key": "lines_to_cover",
+        "val": 194.0,
+        "frmt_val": "194"
+      },
+      {
+        "key": "uncovered_lines",
+        "val": 50.0,
+        "frmt_val": "50"
+      },
+      {
+        "key": "line_coverage",
+        "val": 74.2,
+        "frmt_val": "74.2%"
+      },
+      {
+        "key": "conditions_to_cover",
+        "val": 16.0,
+        "frmt_val": "16"
+      },
+      {
+        "key": "uncovered_conditions",
+        "val": 4.0,
+        "frmt_val": "4"
+      },
+      {
+        "key": "branch_coverage",
+        "val": 75.0,
+        "frmt_val": "75.0%"
+      },
+      {
+        "key": "duplicated_lines",
+        "val": 30.0,
+        "frmt_val": "30"
+      },
+      {
+        "key": "duplicated_blocks",
+        "val": 2.0,
+        "frmt_val": "2"
+      },
+      {
+        "key": "duplicated_files",
+        "val": 1.0,
+        "frmt_val": "1"
+      },
+      {
+        "key": "duplicated_lines_density",
+        "val": 5.8,
+        "frmt_val": "5.8%"
+      },
+      {
+        "key": "major_violations",
+        "val": 1.0,
+        "frmt_val": "1"
+      },
+      {
+        "key": "minor_violations",
+        "val": 1.0,
+        "frmt_val": "1"
+      },
+      {
+        "key": "info_violations",
+        "val": 4.0,
+        "frmt_val": "4"
+      },
+      {
+        "key": "ncloc_data",
+        "data": "1=0;2=0;3=0;4=0;5=0;6=0;7=0;8=0;9=0;10=0;11=0;12=0;13=0;14=0;15=0;17=0;16=0;19=0;18=0;21=0;20=1;23=1;22=1;25=1;24=1;27=1;26=1;29=1;28=0;31=1;30=0;34=1;35=0;32=1;33=1;38=0;39=0;36=0;37=0;42=0;43=1;40=0;41=1;46=1;47=1;44=1;45=0;51=1;50=0;49=1;48=1;55=0;54=1;53=1;52=1;59=1;58=1;57=1;56=1;63=1;62=1;61=1;60=0;68=1;69=1;70=0;71=1;64=1;65=0;66=1;67=1;76=1;77=1;78=1;79=1;72=1;73=1;74=1;75=1;85=1;84=1;87=1;86=1;81=0;80=0;83=0;82=0;93=1;92=1;95=1;94=1;89=0;88=0;91=0;90=0;102=1;103=1;100=0;101=1;98=0;99=0;96=1;97=0;110=1;111=1;108=0;109=0;106=0;107=0;104=1;105=1;119=1;118=1;117=1;116=1;115=0;114=1;113=1;112=1;127=1;126=0;125=1;124=1;123=1;122=1;121=1;120=1;137=1;136=1;139=1;138=1;141=1;140=0;143=1;142=1;129=1;128=1;131=1;130=0;133=1;132=1;135=0;134=1;152=1;153=1;154=1;155=1;156=0;157=1;158=1;159=1;144=1;145=0;146=1;147=1;148=1;149=1;150=0;151=1;171=1;170=0;169=1;168=1;175=0;174=1;173=1;172=1;163=1;162=1;161=1;160=0;167=1;166=1;165=0;164=1;186=1;187=1;184=1;185=0;190=0;191=0;188=1;189=0;178=1;179=1;176=1;177=1;182=1;183=1;180=0;181=1;205=1;204=0;207=1;206=1;201=1;200=1;203=1;202=1;197=1;196=1;199=0;198=1;193=0;192=0;195=1;194=0;220=1;221=1;222=1;223=1;216=1;217=1;218=1;219=1;212=1;213=1;214=0;215=1;208=1;209=0;210=1;211=1;239=0;238=0;237=0;236=1;235=1;234=1;233=1;232=1;231=1;230=1;229=1;228=0;227=0;226=0;225=0;224=1;254=1;255=1;252=1;253=1;250=1;251=1;248=1;249=1;246=1;247=1;244=0;245=1;242=0;243=0;240=0;241=0;275=1;274=1;273=1;272=1;279=0;278=1;277=1;276=1;283=0;282=0;281=0;280=0;287=1;286=1;285=1;284=0;258=1;259=1;256=1;257=1;262=1;263=1;260=1;261=0;266=1;267=1;264=1;265=1;270=1;271=1;268=1;269=1;305=1;304=1;307=1;306=1;309=1;308=1;311=1;310=1;313=1;312=1;315=1;314=0;317=1;316=1;319=0;318=0;288=1;289=1;290=1;291=1;292=1;293=1;294=1;295=1;296=1;297=1;298=1;299=0;300=0;301=0;302=0;303=1;343=1;342=1;341=1;340=1;339=1;338=1;337=1;336=0;351=1;350=1;349=1;348=1;347=0;346=1;345=1;344=1;326=1;327=1;324=1;325=1;322=1;323=1;320=0;321=0;334=0;335=0;332=1;333=0;330=1;331=1;328=1;329=1;373=1;372=1;375=1;374=0;369=0;368=1;371=1;370=1;381=0;380=1;383=0;382=0;377=1;376=1;379=1;378=1;356=1;357=1;358=1;359=0;352=1;353=0;354=1;355=1;364=0;365=1;366=1;367=1;360=1;361=1;362=1;363=1;410=1;411=1;408=1;409=1;414=1;415=1;412=1;413=1;402=0;403=1;400=1;401=1;406=1;407=0;404=1;405=1;395=1;394=1;393=1;392=0;399=1;398=0;397=1;396=1;387=1;386=1;385=0;384=0;391=1;390=1;389=1;388=0;440=1;441=1;442=1;443=0;444=1;445=1;446=1;447=1;432=1;433=1;434=1;435=1;436=0;437=1;438=1;439=0;425=1;424=1;427=1;426=1;429=1;428=1;431=1;430=0;417=1;416=0;419=1;418=1;421=1;420=1;423=1;422=1;478=1;479=1;476=1;477=1;474=1;475=1;472=1;473=1;470=1;471=1;468=1;469=1;466=1;467=0;464=1;465=1;463=1;462=1;461=1;460=1;459=1;458=0;457=1;456=1;455=1;454=1;453=0;452=1;451=1;450=1;449=0;448=1;508=1;509=1;510=1;511=0;504=1;505=1;506=0;507=1;500=1;501=1;502=0;503=1;496=1;497=0;498=1;499=1;493=0;492=1;495=1;494=1;489=1;488=1;491=1;490=1;485=1;484=1;487=0;486=1;481=1;480=1;483=1;482=1;516=1;517=0;518=1;512=1;513=1;514=1;515=1"
+      }
+    ]
+  }
+]
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/scm.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/scm.json
new file mode 100644 (file)
index 0000000..ff89c98
--- /dev/null
@@ -0,0 +1,184 @@
+{"scm": [
+  [1, "simon.brandhof@gmail.com", "2013-04-16"],
+  [2, "simon.brandhof@gmail.com", "2013-04-21"],
+  [3, "simon.brandhof@gmail.com", "2014-03-11"],
+  [4, "simon.brandhof@gmail.com", "2013-04-16"],
+  [6, "simon.brandhof@gmail.com", "2013-04-21"],
+  [7, "simon.brandhof@gmail.com", "2013-04-16"],
+  [11, "simon.brandhof@gmail.com", "2013-04-21"],
+  [12, "simon.brandhof@gmail.com", "2013-04-16"],
+  [16, "simon.brandhof@gmail.com", "2013-04-22"],
+  [19, "simon.brandhof@gmail.com", "2013-04-16"],
+  [25, "julien.henry@sonarsource.com", "2014-05-01"],
+  [26, "simon.brandhof@gmail.com", "2013-04-17"],
+  [30, "julien.henry@sonarsource.com", "2014-04-30"],
+  [31, "simon.brandhof@gmail.com", "2013-04-16"],
+  [32, "simon.brandhof@gmail.com", "2013-04-17"],
+  [33, "julien.henry@sonarsource.com", "2014-05-01"],
+  [34, "simon.brandhof@gmail.com", "2013-04-16"],
+  [37, "simon.brandhof@gmail.com", "2013-04-17"],
+  [38, "simon.brandhof@gmail.com", "2013-04-16"],
+  [39, "simon.brandhof@gmail.com", "2013-04-17"],
+  [40, "simon.brandhof@gmail.com", "2013-04-16"],
+  [41, "simon.brandhof@gmail.com", "2014-02-20"],
+  [42, "simon.brandhof@gmail.com", "2013-04-16"],
+  [51, "julien.henry@sonarsource.com", "2014-05-01"],
+  [52, "simon.brandhof@gmail.com", "2014-02-20"],
+  [54, "simon.brandhof@gmail.com", "2013-04-16"],
+  [56, "julien.henry@sonarsource.com", "2014-05-01"],
+  [57, "simon.brandhof@gmail.com", "2014-02-20"],
+  [61, "julien.henry@sonarsource.com", "2014-05-01"],
+  [62, "simon.brandhof@gmail.com", "2014-02-20"],
+  [66, "julien.henry@sonarsource.com", "2014-05-01"],
+  [67, "simon.brandhof@gmail.com", "2014-02-20"],
+  [71, "julien.henry@sonarsource.com", "2014-05-01"],
+  [72, "simon.brandhof@gmail.com", "2013-04-16"],
+  [77, "simon.brandhof@gmail.com", "2013-05-29"],
+  [78, "simon.brandhof@gmail.com", "2013-04-16"],
+  [82, "simon.brandhof@gmail.com", "2014-02-20"],
+  [83, "simon.brandhof@gmail.com", "2013-04-16"],
+  [84, "simon.brandhof@gmail.com", "2014-02-20"],
+  [116, "julien.henry@sonarsource.com", "2014-05-01"],
+  [117, "simon.brandhof@gmail.com", "2014-02-20"],
+  [119, "simon.brandhof@gmail.com", "2013-04-16"],
+  [126, "simon.brandhof@gmail.com", "2013-10-10"],
+  [127, "simon.brandhof@gmail.com", "2013-05-29"],
+  [128, "simon.brandhof@gmail.com", "2013-04-16"],
+  [131, "simon.brandhof@gmail.com", "2014-02-20"],
+  [144, "simon.brandhof@gmail.com", "2013-04-16"],
+  [146, "simon.brandhof@gmail.com", "2014-02-20"],
+  [152, "simon.brandhof@gmail.com", "2013-10-10"],
+  [161, "simon.brandhof@gmail.com", "2014-02-20"],
+  [182, "simon.brandhof@gmail.com", "2013-04-16"],
+  [183, "simon.brandhof@gmail.com", "2013-04-26"],
+  [184, "simon.brandhof@gmail.com", "2013-04-16"],
+  [185, "simon.brandhof@gmail.com", "2013-10-10"],
+  [186, "simon.brandhof@gmail.com", "2013-05-29"],
+  [187, "simon.brandhof@gmail.com", "2013-04-16"],
+  [195, "julien.henry@sonarsource.com", "2014-05-01"],
+  [196, "simon.brandhof@gmail.com", "2014-02-20"],
+  [200, "julien.henry@sonarsource.com", "2014-05-01"],
+  [201, "simon.brandhof@gmail.com", "2014-02-20"],
+  [205, "julien.henry@sonarsource.com", "2014-05-01"],
+  [206, "simon.brandhof@gmail.com", "2014-02-20"],
+  [210, "julien.henry@sonarsource.com", "2014-05-01"],
+  [211, "simon.brandhof@gmail.com", "2014-02-20"],
+  [215, "julien.henry@sonarsource.com", "2014-05-01"],
+  [216, "simon.brandhof@gmail.com", "2013-04-16"],
+  [217, "simon.brandhof@gmail.com", "2014-02-20"],
+  [220, "simon.brandhof@gmail.com", "2013-04-16"],
+  [222, "simon.brandhof@gmail.com", "2014-02-20"],
+  [223, "simon.brandhof@gmail.com", "2013-04-16"],
+  [229, "simon.brandhof@gmail.com", "2014-02-20"],
+  [230, "simon.brandhof@gmail.com", "2013-04-16"],
+  [245, "julien.henry@sonarsource.com", "2014-05-01"],
+  [246, "simon.brandhof@gmail.com", "2014-02-20"],
+  [247, "simon.brandhof@gmail.com", "2013-04-16"],
+  [248, "simon.brandhof@gmail.com", "2014-02-20"],
+  [249, "simon.brandhof@gmail.com", "2013-04-16"],
+  [251, "simon.brandhof@gmail.com", "2014-02-20"],
+  [252, "simon.brandhof@gmail.com", "2013-04-16"],
+  [254, "simon.brandhof@gmail.com", "2014-02-20"],
+  [255, "simon.brandhof@gmail.com", "2013-04-16"],
+  [258, "simon.brandhof@gmail.com", "2013-05-29"],
+  [259, "simon.brandhof@gmail.com", "2013-04-16"],
+  [262, "julien.henry@sonarsource.com", "2014-05-01"],
+  [263, "simon.brandhof@gmail.com", "2014-02-20"],
+  [279, "simon.brandhof@gmail.com", "2013-04-16"],
+  [285, "simon.brandhof@gmail.com", "2014-02-20"],
+  [298, "simon.brandhof@gmail.com", "2013-04-16"],
+  [300, "simon.brandhof@gmail.com", "2013-05-29"],
+  [301, "julien.henry@sonarsource.com", "2014-04-30"],
+  [308, "julien.henry@sonarsource.com", "2014-05-01"],
+  [310, "julien.henry@sonarsource.com", "2014-04-30"],
+  [311, "julien.henry@sonarsource.com", "2014-06-20"],
+  [312, "julien.henry@sonarsource.com", "2014-04-30"],
+  [315, "julien.henry@sonarsource.com", "2014-06-20"],
+  [319, "julien.henry@sonarsource.com", "2014-04-30"],
+  [320, "simon.brandhof@gmail.com", "2014-02-20"],
+  [321, "simon.brandhof@gmail.com", "2013-05-29"],
+  [322, "julien.henry@sonarsource.com", "2014-05-01"],
+  [323, "simon.brandhof@gmail.com", "2013-04-16"],
+  [325, "julien.henry@sonarsource.com", "2014-05-01"],
+  [326, "simon.brandhof@gmail.com", "2013-04-16"],
+  [327, "julien.henry@sonarsource.com", "2014-05-01"],
+  [329, "simon.brandhof@gmail.com", "2013-04-16"],
+  [330, "julien.henry@sonarsource.com", "2014-06-20"],
+  [331, "simon.brandhof@gmail.com", "2013-04-16"],
+  [334, "simon.brandhof@gmail.com", "2013-05-29"],
+  [337, "simon.brandhof@gmail.com", "2013-04-16"],
+  [339, "simon.brandhof@gmail.com", "2014-02-20"],
+  [340, "simon.brandhof@gmail.com", "2013-04-16"],
+  [341, "julien.henry@sonarsource.com", "2014-05-01"],
+  [343, "simon.brandhof@gmail.com", "2013-04-16"],
+  [344, "julien.henry@sonarsource.com", "2014-06-20"],
+  [345, "simon.brandhof@gmail.com", "2013-04-16"],
+  [347, "simon.brandhof@gmail.com", "2013-04-17"],
+  [348, "simon.brandhof@gmail.com", "2014-02-20"],
+  [350, "julien.henry@sonarsource.com", "2014-05-01"],
+  [352, "simon.brandhof@gmail.com", "2013-04-17"],
+  [353, "simon.brandhof@gmail.com", "2014-02-20"],
+  [354, "julien.henry@sonarsource.com", "2014-05-01"],
+  [358, "simon.brandhof@gmail.com", "2013-04-17"],
+  [359, "simon.brandhof@gmail.com", "2014-02-20"],
+  [363, "simon.brandhof@gmail.com", "2013-04-17"],
+  [365, "simon.brandhof@gmail.com", "2014-02-20"],
+  [368, "simon.brandhof@gmail.com", "2013-04-17"],
+  [370, "simon.brandhof@gmail.com", "2014-02-20"],
+  [380, "simon.brandhof@gmail.com", "2013-04-17"],
+  [382, "simon.brandhof@gmail.com", "2013-05-29"],
+  [389, "julien.henry@sonarsource.com", "2014-05-01"],
+  [391, "simon.brandhof@gmail.com", "2013-05-29"],
+  [401, "julien.henry@sonarsource.com", "2014-05-01"],
+  [402, "simon.brandhof@gmail.com", "2013-05-29"],
+  [403, "julien.henry@sonarsource.com", "2014-05-01"],
+  [404, "simon.brandhof@gmail.com", "2013-05-29"],
+  [405, "julien.henry@sonarsource.com", "2014-05-01"],
+  [406, "simon.brandhof@gmail.com", "2013-05-29"],
+  [411, "julien.henry@sonarsource.com", "2014-05-01"],
+  [412, "simon.brandhof@gmail.com", "2013-05-29"],
+  [417, "julien.henry@sonarsource.com", "2014-05-01"],
+  [418, "simon.brandhof@gmail.com", "2013-05-29"],
+  [420, "simon.brandhof@gmail.com", "2014-02-20"],
+  [421, "julien.henry@sonarsource.com", "2014-05-01"],
+  [422, "simon.brandhof@gmail.com", "2014-02-20"],
+  [425, "simon.brandhof@gmail.com", "2013-05-29"],
+  [426, "julien.henry@sonarsource.com", "2014-05-01"],
+  [427, "simon.brandhof@gmail.com", "2013-05-29"],
+  [428, "julien.henry@sonarsource.com", "2014-05-01"],
+  [429, "simon.brandhof@gmail.com", "2013-05-29"],
+  [433, "simon.brandhof@gmail.com", "2014-02-24"],
+  [434, "simon.brandhof@gmail.com", "2013-05-29"],
+  [437, "simon.brandhof@gmail.com", "2013-04-17"],
+  [440, "julien.henry@sonarsource.com", "2014-05-01"],
+  [442, "simon.brandhof@gmail.com", "2013-04-17"],
+  [452, "julien.henry@sonarsource.com", "2014-05-01"],
+  [453, "simon.brandhof@gmail.com", "2013-04-17"],
+  [454, "julien.henry@sonarsource.com", "2014-05-01"],
+  [455, "simon.brandhof@gmail.com", "2013-04-17"],
+  [456, "julien.henry@sonarsource.com", "2014-05-01"],
+  [457, "simon.brandhof@gmail.com", "2013-04-17"],
+  [462, "julien.henry@sonarsource.com", "2014-05-01"],
+  [463, "simon.brandhof@gmail.com", "2013-04-17"],
+  [468, "julien.henry@sonarsource.com", "2014-05-01"],
+  [469, "simon.brandhof@gmail.com", "2013-04-17"],
+  [470, "julien.henry@sonarsource.com", "2014-05-01"],
+  [475, "simon.brandhof@gmail.com", "2013-04-17"],
+  [476, "julien.henry@sonarsource.com", "2014-05-01"],
+  [478, "simon.brandhof@gmail.com", "2013-04-17"],
+  [479, "simon.brandhof@gmail.com", "2014-02-20"],
+  [483, "julien.henry@sonarsource.com", "2014-05-01"],
+  [486, "simon.brandhof@gmail.com", "2013-04-17"],
+  [490, "simon.brandhof@gmail.com", "2014-02-24"],
+  [491, "simon.brandhof@gmail.com", "2013-04-17"],
+  [494, "simon.brandhof@gmail.com", "2014-02-20"],
+  [497, "simon.brandhof@gmail.com", "2013-04-17"],
+  [498, "simon.brandhof@gmail.com", "2014-02-20"],
+  [499, "simon.brandhof@gmail.com", "2013-04-17"],
+  [503, "simon.brandhof@gmail.com", "2014-02-20"],
+  [504, "simon.brandhof@gmail.com", "2013-04-17"],
+  [508, "simon.brandhof@gmail.com", "2014-02-20"],
+  [509, "simon.brandhof@gmail.com", "2013-04-17"],
+  [517, "julien.henry@sonarsource.com", "2014-05-06"],
+  [518, "simon.brandhof@gmail.com", "2013-04-16"]
+]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/source.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/source.json
new file mode 100644 (file)
index 0000000..1b32224
--- /dev/null
@@ -0,0 +1,521 @@
+{"sources": [
+  [1, "<span class=\"cppd\">/*</span>"],
+  [2, "<span class=\"cppd\"> * SonarQube, open source software quality management tool.</span>"],
+  [3, "<span class=\"cppd\"> * Copyright (C) 2008-2014 SonarSource</span>"],
+  [4, "<span class=\"cppd\"> * mailto:contact AT sonarsource DOT com</span>"],
+  [5, "<span class=\"cppd\"> *</span>"],
+  [6, "<span class=\"cppd\"> * SonarQube is free software; you can redistribute it and/or</span>"],
+  [7, "<span class=\"cppd\"> * modify it under the terms of the GNU Lesser General Public</span>"],
+  [8, "<span class=\"cppd\"> * License as published by the Free Software Foundation; either</span>"],
+  [9, "<span class=\"cppd\"> * version 3 of the License, or (at your option) any later version.</span>"],
+  [10, "<span class=\"cppd\"> *</span>"],
+  [11, "<span class=\"cppd\"> * SonarQube is distributed in the hope that it will be useful,</span>"],
+  [12, "<span class=\"cppd\"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>"],
+  [13, "<span class=\"cppd\"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>"],
+  [14, "<span class=\"cppd\"> * Lesser General Public License for more details.</span>"],
+  [15, "<span class=\"cppd\"> *</span>"],
+  [16, "<span class=\"cppd\"> * You should have received a copy of the GNU Lesser General Public License</span>"],
+  [17, "<span class=\"cppd\"> * along with this program; if not, write to the Free Software Foundation,</span>"],
+  [18, "<span class=\"cppd\"> * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span>"],
+  [19, "<span class=\"cppd\"> */</span>"],
+  [20, "<span class=\"k\">package </span>org.sonar.batch.index;"],
+  [21, ""],
+  [22, "<span class=\"k\">import </span>com.google.common.collect.<span class=\"sym-949 sym\">Sets</span>;"],
+  [23, "<span class=\"k\">import </span>com.persistit.<span class=\"sym-976 sym\">Exchange</span>;"],
+  [24, "<span class=\"k\">import </span>com.persistit.<span class=\"sym-1007 sym\">Key</span>;"],
+  [25, "<span class=\"k\">import </span>com.persistit.<span class=\"sym-1033 sym\">KeyFilter</span>;"],
+  [26, "<span class=\"k\">import </span>com.persistit.exception.<span class=\"sym-1075 sym\">PersistitException</span>;"],
+  [27, "<span class=\"k\">import </span>org.apache.commons.lang.builder.<span class=\"sym-1134 sym\">ToStringBuilder</span>;"],
+  [28, ""],
+  [29, "<span class=\"k\">import </span>javax.annotation.<span class=\"sym-1176 sym\">CheckForNull</span>;"],
+  [30, ""],
+  [31, "<span class=\"k\">import </span>java.io.<span class=\"sym-1206 sym\">Serializable</span>;"],
+  [32, "<span class=\"k\">import </span>java.util.<span class=\"sym-1237 sym\">Iterator</span>;"],
+  [33, "<span class=\"k\">import </span>java.util.<span class=\"sym-1264 sym\">NoSuchElementException</span>;"],
+  [34, "<span class=\"k\">import </span>java.util.<span class=\"sym-1305 sym\">Set</span>;"],
+  [35, ""],
+  [36, "<span class=\"cppd\">/**</span>"],
+  [37, "<span class=\"cppd\"> * &lt;p&gt;</span>"],
+  [38, "<span class=\"cppd\"> * This cache is not thread-safe, due to direct usage of {@link com.persistit.Exchange}</span>"],
+  [39, "<span class=\"cppd\"> * &lt;/p&gt;</span>"],
+  [40, "<span class=\"cppd\"> */</span>"],
+  [41, "<span class=\"k\">public </span><span class=\"k\">class </span><span class=\"sym-1435 sym\">Cache</span>&lt;V <span class=\"k\">extends </span>Serializable&gt; {"],
+  [42, ""],
+  [43, "  <span class=\"k\">private </span><span class=\"k\">final </span>String <span class=\"sym-1491 sym\">name</span>;"],
+  [44, "  <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-1522 sym\">exchange</span>;"],
+  [45, ""],
+  [46, "  <span class=\"sym-1535 sym\">Cache</span>(String <span class=\"sym-1548 sym\">name</span>, <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-1563 sym\">exchange</span>) {"],
+  [47, "    <span class=\"k\">this</span>.<span class=\"sym-1491 sym\">name</span> = <span class=\"sym-1548 sym\">name</span>;"],
+  [48, "    <span class=\"k\">this</span>.<span class=\"sym-1522 sym\">exchange</span> = <span class=\"sym-1563 sym\">exchange</span>;"],
+  [49, "  }"],
+  [50, ""],
+  [51, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-1650 sym\">put</span>(Object <span class=\"sym-1661 sym\">key</span>, V <span class=\"sym-1668 sym\">value</span>) {"],
+  [52, "    resetKey(<span class=\"sym-1661 sym\">key</span>);"],
+  [53, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-1668 sym\">value</span>);"],
+  [54, "  }"],
+  [55, ""],
+  [56, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-1744 sym\">put</span>(Object <span class=\"sym-1755 sym\">firstKey</span>, Object <span class=\"sym-1772 sym\">secondKey</span>, V <span class=\"sym-1785 sym\">value</span>) {"],
+  [57, "    resetKey(<span class=\"sym-1755 sym\">firstKey</span>, <span class=\"sym-1772 sym\">secondKey</span>);"],
+  [58, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-1785 sym\">value</span>);"],
+  [59, "  }"],
+  [60, ""],
+  [61, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-1877 sym\">put</span>(Object <span class=\"sym-1888 sym\">firstKey</span>, Object <span class=\"sym-1905 sym\">secondKey</span>, Object <span class=\"sym-1923 sym\">thirdKey</span>, V <span class=\"sym-1935 sym\">value</span>) {"],
+  [62, "    resetKey(<span class=\"sym-1888 sym\">firstKey</span>, <span class=\"sym-1905 sym\">secondKey</span>, <span class=\"sym-1923 sym\">thirdKey</span>);"],
+  [63, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-1935 sym\">value</span>);"],
+  [64, "  }"],
+  [65, ""],
+  [66, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-2037 sym\">put</span>(Object[] <span class=\"sym-2050 sym\">key</span>, V <span class=\"sym-2057 sym\">value</span>) {"],
+  [67, "    resetKey(<span class=\"sym-2050 sym\">key</span>);"],
+  [68, "    <span class=\"k\">return </span><span class=\"sym-2134 sym\">doPut</span>(<span class=\"sym-2057 sym\">value</span>);"],
+  [69, "  }"],
+  [70, ""],
+  [71, "  <span class=\"k\">private </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-2134 sym\">doPut</span>(V <span class=\"sym-2142 sym\">value</span>) {"],
+  [72, "    <span class=\"k\">try </span>{"],
+  [73, "      <span class=\"sym-1522 sym\">exchange</span>.getValue().put(<span class=\"sym-2142 sym\">value</span>);"],
+  [74, "      <span class=\"sym-1522 sym\">exchange</span>.store();"],
+  [75, "      <span class=\"k\">return </span><span class=\"k\">this</span>;"],
+  [76, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-2265 sym\">e</span>) {"],
+  [77, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to put element in the cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-2265 sym\">e</span>);"],
+  [78, "    }"],
+  [79, "  }"],
+  [80, ""],
+  [81, "  <span class=\"cppd\">/**</span>"],
+  [82, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
+  [83, "<span class=\"cppd\">   */</span>"],
+  [84, "  <span class=\"k\">public </span>V <span class=\"sym-2464 sym\">get</span>(Object <span class=\"sym-2475 sym\">key</span>) {"],
+  [85, "    resetKey(<span class=\"sym-2475 sym\">key</span>);"],
+  [86, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
+  [87, "  }"],
+  [88, ""],
+  [89, "  <span class=\"cppd\">/**</span>"],
+  [90, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
+  [91, "<span class=\"cppd\">   */</span>"],
+  [92, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
+  [93, "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-2639 sym\">get</span>(Object <span class=\"sym-2650 sym\">firstKey</span>, Object <span class=\"sym-2667 sym\">secondKey</span>) {"],
+  [94, "    resetKey(<span class=\"sym-2650 sym\">firstKey</span>, <span class=\"sym-2667 sym\">secondKey</span>);"],
+  [95, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
+  [96, "  }"],
+  [97, ""],
+  [98, "  <span class=\"cppd\">/**</span>"],
+  [99, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
+  [100, "<span class=\"cppd\">   */</span>"],
+  [101, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
+  [102, "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-2853 sym\">get</span>(Object <span class=\"sym-2864 sym\">firstKey</span>, Object <span class=\"sym-2881 sym\">secondKey</span>, Object <span class=\"sym-2899 sym\">thirdKey</span>) {"],
+  [103, "    resetKey(<span class=\"sym-2864 sym\">firstKey</span>, <span class=\"sym-2881 sym\">secondKey</span>, <span class=\"sym-2899 sym\">thirdKey</span>);"],
+  [104, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
+  [105, "  }"],
+  [106, ""],
+  [107, "  <span class=\"cppd\">/**</span>"],
+  [108, "<span class=\"cppd\">   * Returns the value object associated with keys, or null if not found.</span>"],
+  [109, "<span class=\"cppd\">   */</span>"],
+  [110, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
+  [111, "<span class=\"a\">  </span><span class=\"k\">public </span>V <span class=\"sym-3094 sym\">get</span>(Object[] <span class=\"sym-3107 sym\">key</span>) {"],
+  [112, "    resetKey(<span class=\"sym-3107 sym\">key</span>);"],
+  [113, "    <span class=\"k\">return </span><span class=\"sym-3219 sym\">doGet</span>();"],
+  [114, "  }"],
+  [115, ""],
+  [116, "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)"],
+  [117, "  <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
+  [118, "<span class=\"a\">  </span><span class=\"k\">private </span>V <span class=\"sym-3219 sym\">doGet</span>() {"],
+  [119, "    <span class=\"k\">try </span>{"],
+  [120, "      <span class=\"sym-1522 sym\">exchange</span>.fetch();"],
+  [121, "      <span class=\"k\">if </span>(!<span class=\"sym-1522 sym\">exchange</span>.getValue().isDefined()) {"],
+  [122, "        <span class=\"k\">return </span><span class=\"k\">null</span>;"],
+  [123, "      }"],
+  [124, "      <span class=\"k\">return </span>(V) <span class=\"sym-1522 sym\">exchange</span>.getValue().get();"],
+  [125, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-3405 sym\">e</span>) {"],
+  [126, "      <span class=\"cppd\">// TODO add parameters to message</span>"],
+  [127, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get element from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-3405 sym\">e</span>);"],
+  [128, "    }"],
+  [129, "  }"],
+  [130, ""],
+  [131, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3562 sym\">containsKey</span>(Object <span class=\"sym-3581 sym\">key</span>) {"],
+  [132, "    resetKey(<span class=\"sym-3581 sym\">key</span>);"],
+  [133, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
+  [134, "  }"],
+  [135, ""],
+  [136, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3657 sym\">containsKey</span>(Object <span class=\"sym-3676 sym\">firstKey</span>, Object <span class=\"sym-3693 sym\">secondKey</span>) {"],
+  [137, "    resetKey(<span class=\"sym-3676 sym\">firstKey</span>, <span class=\"sym-3693 sym\">secondKey</span>);"],
+  [138, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
+  [139, "  }"],
+  [140, ""],
+  [141, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3791 sym\">containsKey</span>(Object <span class=\"sym-3810 sym\">firstKey</span>, Object <span class=\"sym-3827 sym\">secondKey</span>, Object <span class=\"sym-3845 sym\">thirdKey</span>) {"],
+  [142, "    resetKey(<span class=\"sym-3810 sym\">firstKey</span>, <span class=\"sym-3827 sym\">secondKey</span>, <span class=\"sym-3845 sym\">thirdKey</span>);"],
+  [143, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
+  [144, "  }"],
+  [145, ""],
+  [146, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-3952 sym\">containsKey</span>(Object[] <span class=\"sym-3973 sym\">key</span>) {"],
+  [147, "    resetKey(<span class=\"sym-3973 sym\">key</span>);"],
+  [148, "    <span class=\"k\">return </span><span class=\"sym-4050 sym\">doContainsKey</span>();"],
+  [149, "  }"],
+  [150, ""],
+  [151, "  <span class=\"k\">private </span><span class=\"k\">boolean </span><span class=\"sym-4050 sym\">doContainsKey</span>() {"],
+  [152, "    <span class=\"k\">try </span>{"],
+  [153, "      <span class=\"sym-1522 sym\">exchange</span>.fetch();"],
+  [154, "      <span class=\"k\">return </span><span class=\"sym-1522 sym\">exchange</span>.isValueDefined();"],
+  [155, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-4165 sym\">e</span>) {"],
+  [156, "      <span class=\"cppd\">// TODO add parameters to message</span>"],
+  [157, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to check if element is in cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-4165 sym\">e</span>);"],
+  [158, "    }"],
+  [159, "  }"],
+  [160, ""],
+  [161, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4328 sym\">remove</span>(Object <span class=\"sym-4342 sym\">key</span>) {"],
+  [162, "    resetKey(<span class=\"sym-4342 sym\">key</span>);"],
+  [163, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
+  [164, "  }"],
+  [165, ""],
+  [166, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4413 sym\">remove</span>(Object <span class=\"sym-4427 sym\">firstKey</span>, Object <span class=\"sym-4444 sym\">secondKey</span>) {"],
+  [167, "    resetKey(<span class=\"sym-4427 sym\">firstKey</span>, <span class=\"sym-4444 sym\">secondKey</span>);"],
+  [168, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
+  [169, "  }"],
+  [170, ""],
+  [171, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4537 sym\">remove</span>(Object <span class=\"sym-4551 sym\">firstKey</span>, Object <span class=\"sym-4568 sym\">secondKey</span>, Object <span class=\"sym-4586 sym\">thirdKey</span>) {"],
+  [172, "    resetKey(<span class=\"sym-4551 sym\">firstKey</span>, <span class=\"sym-4568 sym\">secondKey</span>, <span class=\"sym-4586 sym\">thirdKey</span>);"],
+  [173, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
+  [174, "  }"],
+  [175, ""],
+  [176, "  <span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-4688 sym\">remove</span>(Object[] <span class=\"sym-4704 sym\">key</span>) {"],
+  [177, "    resetKey(<span class=\"sym-4704 sym\">key</span>);"],
+  [178, "    <span class=\"k\">return </span><span class=\"sym-4776 sym\">doRemove</span>();"],
+  [179, "  }"],
+  [180, ""],
+  [181, "  <span class=\"k\">private </span><span class=\"k\">boolean </span><span class=\"sym-4776 sym\">doRemove</span>() {"],
+  [182, "    <span class=\"k\">try </span>{"],
+  [183, "      <span class=\"k\">return </span><span class=\"sym-1522 sym\">exchange</span>.remove();"],
+  [184, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-4854 sym\">e</span>) {"],
+  [185, "      <span class=\"cppd\">// TODO add parameters to message</span>"],
+  [186, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get element from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-4854 sym\">e</span>);"],
+  [187, "    }"],
+  [188, "  }"],
+  [189, ""],
+  [190, "  <span class=\"cppd\">/**</span>"],
+  [191, "<span class=\"cppd\">   * Removes everything in the specified group.</span>"],
+  [192, "<span class=\"cppd\">   *</span>"],
+  [193, "<span class=\"cppd\">   * @param group The group name.</span>"],
+  [194, "<span class=\"cppd\">   */</span>"],
+  [195, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5111 sym\">clear</span>(Object <span class=\"sym-5124 sym\">key</span>) {"],
+  [196, "    resetKey(<span class=\"sym-5124 sym\">key</span>);"],
+  [197, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
+  [198, "  }"],
+  [199, ""],
+  [200, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5195 sym\">clear</span>(Object <span class=\"sym-5208 sym\">firstKey</span>, Object <span class=\"sym-5225 sym\">secondKey</span>) {"],
+  [201, "    resetKey(<span class=\"sym-5208 sym\">firstKey</span>, <span class=\"sym-5225 sym\">secondKey</span>);"],
+  [202, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
+  [203, "  }"],
+  [204, ""],
+  [205, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5318 sym\">clear</span>(Object <span class=\"sym-5331 sym\">firstKey</span>, Object <span class=\"sym-5348 sym\">secondKey</span>, Object <span class=\"sym-5366 sym\">thirdKey</span>) {"],
+  [206, "    resetKey(<span class=\"sym-5331 sym\">firstKey</span>, <span class=\"sym-5348 sym\">secondKey</span>, <span class=\"sym-5366 sym\">thirdKey</span>);"],
+  [207, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
+  [208, "  }"],
+  [209, ""],
+  [210, "  <span class=\"k\">public </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5468 sym\">clear</span>(Object[] <span class=\"sym-5483 sym\">key</span>) {"],
+  [211, "    resetKey(<span class=\"sym-5483 sym\">key</span>);"],
+  [212, "    <span class=\"k\">return </span><span class=\"sym-5555 sym\">doClear</span>();"],
+  [213, "  }"],
+  [214, ""],
+  [215, "  <span class=\"k\">private </span><span class=\"sym-1435 sym\">Cache</span>&lt;V&gt; <span class=\"sym-5555 sym\">doClear</span>() {"],
+  [216, "    <span class=\"k\">try </span>{"],
+  [217, "      <span class=\"sym-1007 sym\">Key</span> <span class=\"sym-5587 sym\">to</span> = <span class=\"k\">new </span><span class=\"sym-1007 sym\">Key</span>(<span class=\"sym-1522 sym\">exchange</span>.getKey());"],
+  [218, "      <span class=\"sym-5587 sym\">to</span>.append(<span class=\"sym-1007 sym\">Key</span>.AFTER);"],
+  [219, "      <span class=\"sym-1522 sym\">exchange</span>.removeKeyRange(<span class=\"sym-1522 sym\">exchange</span>.getKey(), <span class=\"sym-5587 sym\">to</span>);"],
+  [220, "      <span class=\"k\">return </span><span class=\"k\">this</span>;"],
+  [221, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-5744 sym\">e</span>) {"],
+  [222, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to clear values from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-5744 sym\">e</span>);"],
+  [223, "    }"],
+  [224, "  }"],
+  [225, ""],
+  [226, "  <span class=\"cppd\">/**</span>"],
+  [227, "<span class=\"cppd\">   * Clears the default as well as all group caches.</span>"],
+  [228, "<span class=\"cppd\">   */</span>"],
+  [229, "  <span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-5924 sym\">clear</span>() {"],
+  [230, "    <span class=\"k\">try </span>{"],
+  [231, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [232, "      <span class=\"sym-1522 sym\">exchange</span>.removeAll();"],
+  [233, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-6019 sym\">e</span>) {"],
+  [234, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to clear cache\"</span>, <span class=\"sym-6019 sym\">e</span>);"],
+  [235, "    }"],
+  [236, "  }"],
+  [237, ""],
+  [238, "  <span class=\"cppd\">/**</span>"],
+  [239, "<span class=\"cppd\">   * Returns the set of cache keys associated with this group.</span>"],
+  [240, "<span class=\"cppd\">   * TODO implement a lazy-loading equivalent with Iterator/Iterable</span>"],
+  [241, "<span class=\"cppd\">   *</span>"],
+  [242, "<span class=\"cppd\">   * @param group The group.</span>"],
+  [243, "<span class=\"cppd\">   * @return The set of cache keys for this group.</span>"],
+  [244, "<span class=\"cppd\">   */</span>"],
+  [245, "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"rawtypes\"</span>)"],
+  [246, "  <span class=\"k\">public </span><span class=\"sym-1305 sym\">Set</span> <span class=\"sym-6374 sym\">keySet</span>(Object <span class=\"sym-6388 sym\">key</span>) {"],
+  [247, "    <span class=\"k\">try </span>{"],
+  [248, "      <span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-6423 sym\">keys</span> = <span class=\"sym-949 sym\">Sets</span>.newLinkedHashSet();"],
+  [249, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [250, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-6494 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
+  [251, "      <span class=\"sym-6494 sym\">iteratorExchange</span>.append(<span class=\"sym-6388 sym\">key</span>);"],
+  [252, "      <span class=\"sym-6494 sym\">iteratorExchange</span>.append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [253, "      <span class=\"k\">while </span>(<span class=\"sym-6494 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {"],
+  [254, "        <span class=\"sym-6423 sym\">keys</span>.add(<span class=\"sym-6494 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());"],
+  [255, "      }"],
+  [256, "      <span class=\"k\">return </span><span class=\"sym-6423 sym\">keys</span>;"],
+  [257, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-6777 sym\">e</span>) {"],
+  [258, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-6777 sym\">e</span>);"],
+  [259, "    }"],
+  [260, "  }"],
+  [261, ""],
+  [262, "  <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"rawtypes\"</span>)"],
+  [263, "  <span class=\"k\">public </span><span class=\"sym-1305 sym\">Set</span> <span class=\"sym-6919 sym\">keySet</span>(Object <span class=\"sym-6933 sym\">firstKey</span>, Object <span class=\"sym-6950 sym\">secondKey</span>) {"],
+  [264, "    <span class=\"k\">try </span>{"],
+  [265, "      <span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-6991 sym\">keys</span> = <span class=\"sym-949 sym\">Sets</span>.newLinkedHashSet();"],
+  [266, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [267, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-7062 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
+  [268, "      <span class=\"sym-7062 sym\">iteratorExchange</span>.append(<span class=\"sym-6933 sym\">firstKey</span>);"],
+  [269, "      <span class=\"sym-7062 sym\">iteratorExchange</span>.append(<span class=\"sym-6950 sym\">secondKey</span>);"],
+  [270, "      <span class=\"sym-7062 sym\">iteratorExchange</span>.append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [271, "      <span class=\"k\">while </span>(<span class=\"sym-7062 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {"],
+  [272, "        <span class=\"sym-6991 sym\">keys</span>.add(<span class=\"sym-7062 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());"],
+  [273, "      }"],
+  [274, "      <span class=\"k\">return </span><span class=\"sym-6991 sym\">keys</span>;"],
+  [275, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-7392 sym\">e</span>) {"],
+  [276, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-7392 sym\">e</span>);"],
+  [277, "    }"],
+  [278, "  }"],
+  [279, ""],
+  [280, "  <span class=\"cppd\">/**</span>"],
+  [281, "<span class=\"cppd\">   * Returns the set of keys associated with this cache.</span>"],
+  [282, "<span class=\"cppd\">   *</span>"],
+  [283, "<span class=\"cppd\">   * @return The set containing the keys for this cache.</span>"],
+  [284, "<span class=\"cppd\">   */</span>"],
+  [285, "  <span class=\"k\">public </span><span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-7641 sym\">keySet</span>() {"],
+  [286, "    <span class=\"k\">try </span>{"],
+  [287, "      <span class=\"sym-1305 sym\">Set</span>&lt;Object&gt; <span class=\"sym-7680 sym\">keys</span> = <span class=\"sym-949 sym\">Sets</span>.newLinkedHashSet();"],
+  [288, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [289, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-7751 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
+  [290, "      <span class=\"sym-7751 sym\">iteratorExchange</span>.append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [291, "      <span class=\"k\">while </span>(<span class=\"sym-7751 sym\">iteratorExchange</span>.next(<span class=\"k\">false</span>)) {"],
+  [292, "        <span class=\"sym-7680 sym\">keys</span>.add(<span class=\"sym-7751 sym\">iteratorExchange</span>.getKey().indexTo(-<span class=\"c\">1</span>).decode());"],
+  [293, "      }"],
+  [294, "      <span class=\"k\">return </span><span class=\"sym-7680 sym\">keys</span>;"],
+  [295, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-7998 sym\">e</span>) {"],
+  [296, "      <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get keys from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-7998 sym\">e</span>);"],
+  [297, "    }"],
+  [298, "  }"],
+  [299, ""],
+  [300, "  <span class=\"cppd\">/**</span>"],
+  [301, "<span class=\"cppd\">   * Lazy-loading values for given keys</span>"],
+  [302, "<span class=\"cppd\">   */</span>"],
+  [303, "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-8168 sym\">values</span>(Object <span class=\"sym-8182 sym\">firstKey</span>, Object <span class=\"sym-8199 sym\">secondKey</span>) {"],
+  [304, "    <span class=\"k\">try </span>{"],
+  [305, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [306, "      <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-8182 sym\">firstKey</span>).append(<span class=\"sym-8199 sym\">secondKey</span>).append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [307, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-8331 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
+  [308, "      <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-8390 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-8182 sym\">firstKey</span>)).append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-8199 sym\">secondKey</span>));"],
+  [309, "      <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-8331 sym\">iteratorExchange</span>, <span class=\"sym-8390 sym\">filter</span>);"],
+  [310, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-8579 sym\">e</span>) {"],
+  [311, "      <span class=\"k\">throw </span><span class=\"sym-8659 sym\">failToGetValues</span>(<span class=\"sym-8579 sym\">e</span>);"],
+  [312, "    }"],
+  [313, "  }"],
+  [314, ""],
+  [315, "  <span class=\"k\">private </span>IllegalStateException <span class=\"sym-8659 sym\">failToGetValues</span>(Exception <span class=\"sym-8685 sym\">e</span>) {"],
+  [316, "    <span class=\"k\">return </span><span class=\"k\">new </span>IllegalStateException(<span class=\"s\">\"Fail to get values from cache \" </span>+ <span class=\"sym-1491 sym\">name</span>, <span class=\"sym-8685 sym\">e</span>);"],
+  [317, "  }"],
+  [318, ""],
+  [319, "  <span class=\"cppd\">/**</span>"],
+  [320, "<span class=\"cppd\">   * Lazy-loading values for a given key</span>"],
+  [321, "<span class=\"cppd\">   */</span>"],
+  [322, "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-8851 sym\">values</span>(Object <span class=\"sym-8865 sym\">firstKey</span>) {"],
+  [323, "    <span class=\"k\">try </span>{"],
+  [324, "      <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [325, "      <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-8865 sym\">firstKey</span>).append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [326, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-8978 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
+  [327, "      <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9037 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-8865 sym\">firstKey</span>));"],
+  [328, "      <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-8978 sym\">iteratorExchange</span>, <span class=\"sym-9037 sym\">filter</span>);"],
+  [329, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-9186 sym\">e</span>) {"],
+  [330, "      <span class=\"k\">throw </span><span class=\"sym-8659 sym\">failToGetValues</span>(<span class=\"sym-9186 sym\">e</span>);"],
+  [331, "    }"],
+  [332, "  }"],
+  [333, ""],
+  [334, "  <span class=\"cppd\">/**</span>"],
+  [335, "<span class=\"cppd\">   * Lazy-loading values</span>"],
+  [336, "<span class=\"cppd\">   */</span>"],
+  [337, "  <span class=\"k\">public </span>Iterable&lt;V&gt; <span class=\"sym-9292 sym\">values</span>() {"],
+  [338, "    <span class=\"k\">try </span>{"],
+  [339, "      <span class=\"sym-1522 sym\">exchange</span>.clear().append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [340, "      <span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-9371 sym\">iteratorExchange</span> = <span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>);"],
+  [341, "      <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9430 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.ALL);"],
+  [342, "      <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;V&gt;(<span class=\"sym-9371 sym\">iteratorExchange</span>, <span class=\"sym-9430 sym\">filter</span>);"],
+  [343, "    } <span class=\"k\">catch </span>(Exception <span class=\"sym-9562 sym\">e</span>) {"],
+  [344, "      <span class=\"k\">throw </span><span class=\"sym-8659 sym\">failToGetValues</span>(<span class=\"sym-9562 sym\">e</span>);"],
+  [345, "    }"],
+  [346, "  }"],
+  [347, ""],
+  [348, "  <span class=\"k\">public </span>Iterable&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;V&gt;&gt; <span class=\"sym-9638 sym\">entries</span>() {"],
+  [349, "    <span class=\"sym-1522 sym\">exchange</span>.clear().to(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [350, "    <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9701 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.ALL);"],
+  [351, "    <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-11992 sym\">EntryIterable</span>&lt;V&gt;(<span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>), <span class=\"sym-9701 sym\">filter</span>);"],
+  [352, "  }"],
+  [353, ""],
+  [354, "  <span class=\"k\">public </span>Iterable&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;V&gt;&gt; <span class=\"sym-9847 sym\">entries</span>(Object <span class=\"sym-9862 sym\">firstKey</span>) {"],
+  [355, "    <span class=\"sym-1522 sym\">exchange</span>.clear().append(<span class=\"sym-9862 sym\">firstKey</span>).append(<span class=\"sym-1007 sym\">Key</span>.BEFORE);"],
+  [356, "    <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-9946 sym\">filter</span> = <span class=\"k\">new </span><span class=\"sym-1033 sym\">KeyFilter</span>().append(<span class=\"sym-1033 sym\">KeyFilter</span>.simpleTerm(<span class=\"sym-9862 sym\">firstKey</span>));"],
+  [357, "    <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-11992 sym\">EntryIterable</span>&lt;V&gt;(<span class=\"k\">new </span><span class=\"sym-976 sym\">Exchange</span>(<span class=\"sym-1522 sym\">exchange</span>), <span class=\"sym-9946 sym\">filter</span>);"],
+  [358, "  }"],
+  [359, ""],
+  [360, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10096 sym\">resetKey</span>(Object <span class=\"sym-10112 sym\">key</span>) {"],
+  [361, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [362, "    <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10112 sym\">key</span>);"],
+  [363, "  }"],
+  [364, ""],
+  [365, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10187 sym\">resetKey</span>(Object <span class=\"sym-10203 sym\">first</span>, Object <span class=\"sym-10217 sym\">second</span>) {"],
+  [366, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [367, "    <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10203 sym\">first</span>).append(<span class=\"sym-10217 sym\">second</span>);"],
+  [368, "  }"],
+  [369, ""],
+  [370, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10312 sym\">resetKey</span>(Object <span class=\"sym-10328 sym\">first</span>, Object <span class=\"sym-10342 sym\">second</span>, Object <span class=\"sym-10357 sym\">third</span>) {"],
+  [371, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [372, "    <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10328 sym\">first</span>).append(<span class=\"sym-10342 sym\">second</span>).append(<span class=\"sym-10357 sym\">third</span>);"],
+  [373, "  }"],
+  [374, ""],
+  [375, "  <span class=\"k\">private </span><span class=\"k\">void </span><span class=\"sym-10465 sym\">resetKey</span>(Object[] <span class=\"sym-10483 sym\">keys</span>) {"],
+  [376, "    <span class=\"sym-1522 sym\">exchange</span>.clear();"],
+  [377, "    <span class=\"k\">for </span>(Object <span class=\"sym-10529 sym\">o</span> : <span class=\"sym-10483 sym\">keys</span>) {"],
+  [378, "      <span class=\"sym-1522 sym\">exchange</span>.append(<span class=\"sym-10529 sym\">o</span>);"],
+  [379, "    }"],
+  [380, "  }"],
+  [381, ""],
+  [382, "  <span class=\"cppd\">//</span>"],
+  [383, "  <span class=\"cppd\">// LAZY ITERATORS AND ITERABLES</span>"],
+  [384, "  <span class=\"cppd\">//</span>"],
+  [385, ""],
+  [386, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-10646 sym\">ValueIterable</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span>Iterable&lt;T&gt; {"],
+  [387, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-1237 sym\">Iterator</span>&lt;T&gt; <span class=\"sym-10739 sym\">iterator</span>;"],
+  [388, ""],
+  [389, "    <span class=\"k\">private </span><span class=\"sym-10762 sym\">ValueIterable</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-10785 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-10805 sym\">keyFilter</span>) {"],
+  [390, "      <span class=\"k\">this</span>.<span class=\"sym-10739 sym\">iterator</span> = <span class=\"k\">new </span><span class=\"sym-10997 sym\">ValueIterator</span>&lt;T&gt;(<span class=\"sym-10785 sym\">exchange</span>, <span class=\"sym-10805 sym\">keyFilter</span>);"],
+  [391, "    }"],
+  [392, ""],
+  [393, "    <span class=\"a\">@Override</span>"],
+  [394, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-1237 sym\">Iterator</span>&lt;T&gt; <span class=\"sym-10927 sym\">iterator</span>() {"],
+  [395, "      <span class=\"k\">return </span><span class=\"sym-10739 sym\">iterator</span>;"],
+  [396, "    }"],
+  [397, "  }"],
+  [398, ""],
+  [399, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-10997 sym\">ValueIterator</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span><span class=\"sym-1237 sym\">Iterator</span>&lt;T&gt; {"],
+  [400, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-11087 sym\">exchange</span>;"],
+  [401, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-11125 sym\">keyFilter</span>;"],
+  [402, ""],
+  [403, "    <span class=\"k\">private </span><span class=\"sym-11149 sym\">ValueIterator</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-11172 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-11192 sym\">keyFilter</span>) {"],
+  [404, "      <span class=\"k\">this</span>.<span class=\"sym-11087 sym\">exchange</span> = <span class=\"sym-11172 sym\">exchange</span>;"],
+  [405, "      <span class=\"k\">this</span>.<span class=\"sym-11125 sym\">keyFilter</span> = <span class=\"sym-11192 sym\">keyFilter</span>;"],
+  [406, "    }"],
+  [407, ""],
+  [408, "    <span class=\"a\">@Override</span>"],
+  [409, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-11311 sym\">hasNext</span>() {"],
+  [410, "      <span class=\"k\">try </span>{"],
+  [411, "        <span class=\"k\">return </span><span class=\"sym-11087 sym\">exchange</span>.hasNext(<span class=\"sym-11125 sym\">keyFilter</span>);"],
+  [412, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-11413 sym\">e</span>) {"],
+  [413, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-11413 sym\">e</span>);"],
+  [414, "      }"],
+  [415, "    }"],
+  [416, ""],
+  [417, "    <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)"],
+  [418, "    <span class=\"a\">@Override</span>"],
+  [419, "<span class=\"a\">    </span><span class=\"k\">public </span>T <span class=\"sym-11539 sym\">next</span>() {"],
+  [420, "      <span class=\"k\">try </span>{"],
+  [421, "        <span class=\"sym-11087 sym\">exchange</span>.next(<span class=\"sym-11125 sym\">keyFilter</span>);"],
+  [422, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-11628 sym\">e</span>) {"],
+  [423, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-11628 sym\">e</span>);"],
+  [424, "      }"],
+  [425, "      <span class=\"k\">if </span>(<span class=\"sym-11087 sym\">exchange</span>.getValue().isDefined()) {"],
+  [426, "        <span class=\"k\">return </span>(T) <span class=\"sym-11087 sym\">exchange</span>.getValue().get();"],
+  [427, "      }"],
+  [428, "      <span class=\"k\">throw </span><span class=\"k\">new </span><span class=\"sym-1264 sym\">NoSuchElementException</span>();"],
+  [429, "    }"],
+  [430, ""],
+  [431, "    <span class=\"a\">@Override</span>"],
+  [432, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-11863 sym\">remove</span>() {"],
+  [433, "      <span class=\"k\">throw </span><span class=\"k\">new </span>UnsupportedOperationException(<span class=\"s\">\"Removing an item is not supported\"</span>);"],
+  [434, "    }"],
+  [435, "  }"],
+  [436, ""],
+  [437, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-11992 sym\">EntryIterable</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span>Iterable&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;&gt; {"],
+  [438, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-12339 sym\">EntryIterator</span>&lt;T&gt; <span class=\"sym-12097 sym\">it</span>;"],
+  [439, ""],
+  [440, "    <span class=\"k\">private </span><span class=\"sym-12114 sym\">EntryIterable</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-12137 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-12157 sym\">keyFilter</span>) {"],
+  [441, "      <span class=\"sym-12097 sym\">it</span> = <span class=\"k\">new </span><span class=\"sym-12339 sym\">EntryIterator</span>&lt;T&gt;(<span class=\"sym-12137 sym\">exchange</span>, <span class=\"sym-12157 sym\">keyFilter</span>);"],
+  [442, "    }"],
+  [443, ""],
+  [444, "    <span class=\"a\">@Override</span>"],
+  [445, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-1237 sym\">Iterator</span>&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;&gt; <span class=\"sym-12275 sym\">iterator</span>() {"],
+  [446, "      <span class=\"k\">return </span><span class=\"sym-12097 sym\">it</span>;"],
+  [447, "    }"],
+  [448, "  }"],
+  [449, ""],
+  [450, "  <span class=\"k\">private </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-12339 sym\">EntryIterator</span>&lt;T <span class=\"k\">extends </span>Serializable&gt; <span class=\"k\">implements </span><span class=\"sym-1237 sym\">Iterator</span>&lt;<span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;&gt; {"],
+  [451, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-12436 sym\">exchange</span>;"],
+  [452, "    <span class=\"k\">private </span><span class=\"k\">final </span><span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-12474 sym\">keyFilter</span>;"],
+  [453, ""],
+  [454, "    <span class=\"k\">private </span><span class=\"sym-12498 sym\">EntryIterator</span>(<span class=\"sym-976 sym\">Exchange</span> <span class=\"sym-12521 sym\">exchange</span>, <span class=\"sym-1033 sym\">KeyFilter</span> <span class=\"sym-12541 sym\">keyFilter</span>) {"],
+  [455, "      <span class=\"k\">this</span>.<span class=\"sym-12436 sym\">exchange</span> = <span class=\"sym-12521 sym\">exchange</span>;"],
+  [456, "      <span class=\"k\">this</span>.<span class=\"sym-12474 sym\">keyFilter</span> = <span class=\"sym-12541 sym\">keyFilter</span>;"],
+  [457, "    }"],
+  [458, ""],
+  [459, "    <span class=\"a\">@Override</span>"],
+  [460, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">boolean </span><span class=\"sym-12660 sym\">hasNext</span>() {"],
+  [461, "      <span class=\"k\">try </span>{"],
+  [462, "        <span class=\"k\">return </span><span class=\"sym-12436 sym\">exchange</span>.hasNext(<span class=\"sym-12474 sym\">keyFilter</span>);"],
+  [463, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-12762 sym\">e</span>) {"],
+  [464, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-12762 sym\">e</span>);"],
+  [465, "      }"],
+  [466, "    }"],
+  [467, ""],
+  [468, "    <span class=\"a\">@SuppressWarnings</span>(<span class=\"s\">\"unchecked\"</span>)"],
+  [469, "    <span class=\"a\">@Override</span>"],
+  [470, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"sym-13607 sym\">Entry</span>&lt;T&gt; <span class=\"sym-12895 sym\">next</span>() {"],
+  [471, "      <span class=\"k\">try </span>{"],
+  [472, "        <span class=\"sym-12436 sym\">exchange</span>.next(<span class=\"sym-12474 sym\">keyFilter</span>);"],
+  [473, "      } <span class=\"k\">catch </span>(<span class=\"sym-1075 sym\">PersistitException</span> <span class=\"sym-12984 sym\">e</span>) {"],
+  [474, "        <span class=\"k\">throw </span><span class=\"k\">new </span>IllegalStateException(<span class=\"sym-12984 sym\">e</span>);"],
+  [475, "      }"],
+  [476, "      <span class=\"k\">if </span>(<span class=\"sym-12436 sym\">exchange</span>.getValue().isDefined()) {"],
+  [477, "        T <span class=\"sym-13096 sym\">value</span> = (T) <span class=\"sym-12436 sym\">exchange</span>.getValue().get();"],
+  [478, "        <span class=\"sym-1007 sym\">Key</span> <span class=\"sym-13147 sym\">key</span> = <span class=\"sym-12436 sym\">exchange</span>.getKey();"],
+  [479, "        Object[] <span class=\"sym-13189 sym\">array</span> = <span class=\"k\">new </span>Object[<span class=\"sym-13147 sym\">key</span>.getDepth()];"],
+  [480, "        <span class=\"k\">for </span>(<span class=\"k\">int </span><span class=\"sym-13242 sym\">i</span> = <span class=\"c\">0</span>; <span class=\"sym-13242 sym\">i</span> &lt; <span class=\"sym-13147 sym\">key</span>.getDepth(); <span class=\"sym-13242 sym\">i</span>++) {"],
+  [481, "          <span class=\"sym-13189 sym\">array</span>[<span class=\"sym-13242 sym\">i</span>] = <span class=\"sym-13147 sym\">key</span>.indexTo(<span class=\"sym-13242 sym\">i</span> - <span class=\"sym-13147 sym\">key</span>.getDepth()).decode();"],
+  [482, "        }"],
+  [483, "        <span class=\"k\">return </span><span class=\"k\">new </span><span class=\"sym-13607 sym\">Entry</span>&lt;T&gt;(<span class=\"sym-13189 sym\">array</span>, <span class=\"sym-13096 sym\">value</span>);"],
+  [484, "      }"],
+  [485, "      <span class=\"k\">throw </span><span class=\"k\">new </span><span class=\"sym-1264 sym\">NoSuchElementException</span>();"],
+  [486, "    }"],
+  [487, ""],
+  [488, "    <span class=\"a\">@Override</span>"],
+  [489, "<span class=\"a\">    </span><span class=\"k\">public </span><span class=\"k\">void </span><span class=\"sym-13479 sym\">remove</span>() {"],
+  [490, "      <span class=\"k\">throw </span><span class=\"k\">new </span>UnsupportedOperationException(<span class=\"s\">\"Removing an item is not supported\"</span>);"],
+  [491, "    }"],
+  [492, "  }"],
+  [493, ""],
+  [494, "  <span class=\"k\">public </span><span class=\"k\">static </span><span class=\"k\">class </span><span class=\"sym-13607 sym\">Entry</span>&lt;V <span class=\"k\">extends </span>Serializable&gt; {"],
+  [495, "    <span class=\"k\">private </span><span class=\"k\">final </span>Object[] <span class=\"sym-13666 sym\">key</span>;"],
+  [496, "    <span class=\"k\">private </span><span class=\"k\">final </span>V <span class=\"sym-13691 sym\">value</span>;"],
+  [497, ""],
+  [498, "    <span class=\"sym-13703 sym\">Entry</span>(Object[] <span class=\"sym-13718 sym\">key</span>, V <span class=\"sym-13725 sym\">value</span>) {"],
+  [499, "      <span class=\"k\">this</span>.<span class=\"sym-13666 sym\">key</span> = <span class=\"sym-13718 sym\">key</span>;"],
+  [500, "      <span class=\"k\">this</span>.<span class=\"sym-13691 sym\">value</span> = <span class=\"sym-13725 sym\">value</span>;"],
+  [501, "    }"],
+  [502, ""],
+  [503, "    <span class=\"k\">public </span>Object[] <span class=\"sym-13809 sym\">key</span>() {"],
+  [504, "      <span class=\"k\">return </span><span class=\"sym-13666 sym\">key</span>;"],
+  [505, "    }"],
+  [506, ""],
+  [507, "    <span class=\"a\">@<span class=\"sym-1176 sym\">CheckForNull</span></span>"],
+  [508, "<span class=\"a\">    </span><span class=\"k\">public </span>V <span class=\"sym-13873 sym\">value</span>() {"],
+  [509, "      <span class=\"k\">return </span><span class=\"sym-13691 sym\">value</span>;"],
+  [510, "    }"],
+  [511, ""],
+  [512, "    <span class=\"a\">@Override</span>"],
+  [513, "<span class=\"a\">    </span><span class=\"k\">public </span>String <span class=\"sym-13942 sym\">toString</span>() {"],
+  [514, "      <span class=\"k\">return </span><span class=\"sym-1134 sym\">ToStringBuilder</span>.reflectionToString(<span class=\"k\">this</span>);"],
+  [515, "    }"],
+  [516, "  }"],
+  [517, ""],
+  [518, "}"],
+  [519, ""]
+]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/test-cases.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/test-cases.json
new file mode 100644 (file)
index 0000000..233229a
--- /dev/null
@@ -0,0 +1,235 @@
+{"tests": [
+  {
+    "name": "should_update_existing_issue",
+    "status": "OK",
+    "durationInMs": 293,
+    "_ref": "1"
+  },
+  {
+    "name": "testDistributionMeasure",
+    "status": "OK",
+    "durationInMs": 148,
+    "_ref": "2"
+  },
+  {
+    "name": "one_part_key",
+    "status": "OK",
+    "durationInMs": 96,
+    "_ref": "3"
+  },
+  {
+    "name": "testIssueExclusion",
+    "status": "OK",
+    "durationInMs": 305,
+    "_ref": "4"
+  },
+  {
+    "name": "should_add_measure_with_same_metric",
+    "status": "OK",
+    "durationInMs": 141,
+    "_ref": "5"
+  },
+  {
+    "name": "should_create_cache",
+    "status": "OK",
+    "durationInMs": 81,
+    "_ref": "6"
+  },
+  {
+    "name": "scanProjectWithMixedSourcesAndTests",
+    "status": "OK",
+    "durationInMs": 239,
+    "_ref": "7"
+  },
+  {
+    "name": "remove_versus_clear",
+    "status": "OK",
+    "durationInMs": 111,
+    "_ref": "3"
+  },
+  {
+    "name": "should_persist_component_data",
+    "status": "OK",
+    "durationInMs": 132,
+    "_ref": "8"
+  },
+  {
+    "name": "scanProjectWithSourceDir",
+    "status": "OK",
+    "durationInMs": 212,
+    "_ref": "7"
+  },
+  {
+    "name": "should_add_measure_with_too_big_data_for_persistit",
+    "status": "OK",
+    "durationInMs": 336,
+    "_ref": "5"
+  },
+  {
+    "name": "failForDuplicateInputFile",
+    "status": "OK",
+    "durationInMs": 127,
+    "_ref": "7"
+  },
+  {
+    "name": "should_not_create_cache_twice",
+    "status": "OK",
+    "durationInMs": 101,
+    "_ref": "6"
+  },
+  {
+    "name": "should_get_and_set_data",
+    "status": "OK",
+    "durationInMs": 190,
+    "_ref": "9"
+  },
+  {
+    "name": "should_add_input_file",
+    "status": "OK",
+    "durationInMs": 122,
+    "_ref": "10"
+  },
+  {
+    "name": "scanTempProject",
+    "status": "OK",
+    "durationInMs": 345,
+    "_ref": "4"
+  },
+  {
+    "name": "should_get_measures",
+    "status": "OK",
+    "durationInMs": 114,
+    "_ref": "5"
+  },
+  {
+    "name": "test_key_being_prefix_of_another_key",
+    "status": "OK",
+    "durationInMs": 94,
+    "_ref": "3"
+  },
+  {
+    "name": "should_add_measure_with_big_data",
+    "status": "OK",
+    "durationInMs": 242,
+    "_ref": "5"
+  },
+  {
+    "name": "should_get_all_issues",
+    "status": "OK",
+    "durationInMs": 104,
+    "_ref": "1"
+  },
+  {
+    "name": "should_add_measure",
+    "status": "OK",
+    "durationInMs": 117,
+    "_ref": "5"
+  },
+  {
+    "name": "computeMeasuresOnSampleProject",
+    "status": "OK",
+    "durationInMs": 315,
+    "_ref": "2"
+  },
+  {
+    "name": "test_measure_coder",
+    "status": "OK",
+    "durationInMs": 110,
+    "_ref": "5"
+  },
+  {
+    "name": "should_add_measure_with_too_big_data_for_persistit_pre_patch",
+    "status": "OK",
+    "durationInMs": 821,
+    "_ref": "5"
+  },
+  {
+    "name": "three_parts_key",
+    "status": "OK",
+    "durationInMs": 122,
+    "_ref": "3"
+  },
+  {
+    "name": "two_parts_key",
+    "status": "OK",
+    "durationInMs": 118,
+    "_ref": "3"
+  },
+  {
+    "name": "should_add_new_issue",
+    "status": "OK",
+    "durationInMs": 95,
+    "_ref": "1"
+  },
+  {
+    "name": "empty_cache",
+    "status": "OK",
+    "durationInMs": 104,
+    "_ref": "3"
+  },
+  {
+    "name": "scanProjectWithTestDir",
+    "status": "OK",
+    "durationInMs": 322,
+    "_ref": "7"
+  },
+  {
+    "name": "scanSampleProject",
+    "status": "OK",
+    "durationInMs": 184,
+    "_ref": "4"
+  },
+  {
+    "name": "computeMeasuresOnTempProject",
+    "status": "OK",
+    "durationInMs": 274,
+    "_ref": "2"
+  },
+  {
+    "name": "should_get_and_set_string_data",
+    "status": "OK",
+    "durationInMs": 95,
+    "_ref": "9"
+  }
+], "files": {
+  "3": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/CacheTest.java",
+    "longName": "src/test/java/org/sonar/batch/index/CacheTest.java"
+  },
+  "1": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/issue/IssueCacheTest.java",
+    "longName": "src/test/java/org/sonar/batch/issue/IssueCacheTest.java"
+  },
+  "4": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java",
+    "longName": "src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java"
+  },
+  "2": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java",
+    "longName": "src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java"
+  },
+  "8": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/ComponentDataPersisterTest.java",
+    "longName": "src/test/java/org/sonar/batch/index/ComponentDataPersisterTest.java"
+  },
+  "9": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/ComponentDataCacheTest.java",
+    "longName": "src/test/java/org/sonar/batch/index/ComponentDataCacheTest.java"
+  },
+  "10": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java",
+    "longName": "src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java"
+  },
+  "7": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/mediumtest/fs/FileSystemMediumTest.java",
+    "longName": "src/test/java/org/sonar/batch/mediumtest/fs/FileSystemMediumTest.java"
+  },
+  "5": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/scan/measure/MeasureCacheTest.java",
+    "longName": "src/test/java/org/sonar/batch/scan/measure/MeasureCacheTest.java"
+  },
+  "6": {
+    "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/CachesTest.java",
+    "longName": "src/test/java/org/sonar/batch/index/CachesTest.java"
+  }
+}}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/app.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/app.json
new file mode 100644 (file)
index 0000000..82d58c4
--- /dev/null
@@ -0,0 +1,49 @@
+{
+  "key": "org.codehaus.sonar:sonar-batch:src/test/java/org/sonar/batch/index/CacheTest.java",
+  "path": "src/test/java/org/sonar/batch/index/CacheTest.java",
+  "name": "CacheTest.java",
+  "longName": "src/test/java/org/sonar/batch/index/CacheTest.java",
+  "q": "UTS",
+  "subProject": "org.codehaus.sonar:sonar-batch",
+  "subProjectName": "SonarQube :: Batch",
+  "project": "org.codehaus.sonar:sonar",
+  "projectName": "SonarQube",
+  "fav": false,
+  "canMarkAsFavourite": true,
+  "canBulkChange": true,
+  "canCreateManualIssue": true,
+  "periods": [
+    [1, "since previous analysis (2014 Dec 01)", "2014-12-01T18:51:13+0100"],
+    [2, "over 365 days (2013 Dec 01)", "2013-12-01T00:40:31+0100"],
+    [3, "since previous version (4.5 - 2014 Sep 03)", "2014-09-03T23:16:52+0200"]
+  ],
+  "severities": [],
+  "rules": [],
+  "measures": {
+    "fTests": "6",
+    "fIssues": "0"
+  },
+  "tabs": ["scm"],
+  "manual_rules": [
+    {
+      "key": "manual:api",
+      "name": "API"
+    },
+    {
+      "key": "manual:design",
+      "name": "Design"
+    },
+    {
+      "key": "manual:error_handling",
+      "name": "Error handling"
+    },
+    {
+      "key": "manual:performance",
+      "name": "Performance"
+    },
+    {
+      "key": "manual:sql_pitfalls",
+      "name": "SQL Pitfall"
+    }
+  ]
+}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/lines.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/lines.json
new file mode 100644 (file)
index 0000000..becc8c9
--- /dev/null
@@ -0,0 +1,1808 @@
+{"sources": [
+  {
+    "line": 1,
+    "code": "/*",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 2,
+    "code": " * SonarQube, open source software quality management tool.",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 3,
+    "code": " * Copyright (C) 2008-2014 SonarSource",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "57ae3026c36ae3b0b71756d6161124b1ae594c53",
+    "scmDate": "2014-03-11T17:52:41+0100"
+  },
+  {
+    "line": 4,
+    "code": " * mailto:contact AT sonarsource DOT com",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 5,
+    "code": " *",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 6,
+    "code": " * SonarQube is free software; you can redistribute it and/or",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 7,
+    "code": " * modify it under the terms of the GNU Lesser General Public",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 8,
+    "code": " * License as published by the Free Software Foundation; either",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 9,
+    "code": " * version 3 of the License, or (at your option) any later version.",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 10,
+    "code": " *",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 11,
+    "code": " * SonarQube is distributed in the hope that it will be useful,",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 12,
+    "code": " * but WITHOUT ANY WARRANTY; without even the implied warranty of",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 13,
+    "code": " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 14,
+    "code": " * Lesser General Public License for more details.",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 15,
+    "code": " *",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 16,
+    "code": " * You should have received a copy of the GNU Lesser General Public License",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "ce63bd4c293fe7a1fa066d73860bbaf4e1f5a608",
+    "scmDate": "2013-04-22T09:37:03+0200"
+  },
+  {
+    "line": 17,
+    "code": " * along with this program; if not, write to the Free Software Foundation,",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "ce63bd4c293fe7a1fa066d73860bbaf4e1f5a608",
+    "scmDate": "2013-04-22T09:37:03+0200"
+  },
+  {
+    "line": 18,
+    "code": " * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "ce63bd4c293fe7a1fa066d73860bbaf4e1f5a608",
+    "scmDate": "2013-04-22T09:37:03+0200"
+  },
+  {
+    "line": 19,
+    "code": " */",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 20,
+    "code": "package org.sonar.batch.index;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 21,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 22,
+    "code": "import com.google.common.collect.Iterables;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 23,
+    "code": "import org.junit.After;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 24,
+    "code": "import org.junit.Before;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 25,
+    "code": "import org.junit.Rule;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 26,
+    "code": "import org.junit.Test;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 27,
+    "code": "import org.junit.rules.TemporaryFolder;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "18a4c15b060d1b56f08826bf6006d08eaf2625ec",
+    "scmDate": "2013-10-15T17:14:44+0200"
+  },
+  {
+    "line": 28,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 29,
+    "code": "import static org.fest.assertions.Assertions.assertThat;",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 30,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 31,
+    "code": "public class CacheTest {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 32,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "18a4c15b060d1b56f08826bf6006d08eaf2625ec",
+    "scmDate": "2013-10-15T17:14:44+0200"
+  },
+  {
+    "line": 33,
+    "code": "  @Rule",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 34,
+    "code": "  public TemporaryFolder temp = new TemporaryFolder();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 35,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "18a4c15b060d1b56f08826bf6006d08eaf2625ec",
+    "scmDate": "2013-10-15T17:14:44+0200"
+  },
+  {
+    "line": 36,
+    "code": "  Caches caches;",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "18a4c15b060d1b56f08826bf6006d08eaf2625ec",
+    "scmDate": "2013-10-15T17:14:44+0200"
+  },
+  {
+    "line": 37,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 38,
+    "code": "  @Before",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 39,
+    "code": "  public void start() throws Exception {",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "18a4c15b060d1b56f08826bf6006d08eaf2625ec",
+    "scmDate": "2013-10-15T17:14:44+0200"
+  },
+  {
+    "line": 40,
+    "code": "    caches = CachesTest.createCacheOnTemp(temp);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "18a4c15b060d1b56f08826bf6006d08eaf2625ec",
+    "scmDate": "2013-10-15T17:14:44+0200"
+  },
+  {
+    "line": 41,
+    "code": "    caches.start();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 42,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 43,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 44,
+    "code": "  @After",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 45,
+    "code": "  public void stop() {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 46,
+    "code": "    caches.stop();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 47,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 48,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 49,
+    "code": "  @Test",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 50,
+    "code": "  public void one_part_key() throws Exception {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 51,
+    "code": "    Cache&lt;String&gt; cache = caches.createCache(\"capitals\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 52,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 53,
+    "code": "    assertThat(cache.get(\"france\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 54,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 55,
+    "code": "    cache.put(\"france\", \"paris\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 56,
+    "code": "    cache.put(\"italy\", \"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 57,
+    "code": "    assertThat(cache.get(\"france\")).isEqualTo(\"paris\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 58,
+    "code": "    assertThat(cache.keySet()).containsOnly(\"france\", \"italy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 59,
+    "code": "    assertThat(cache.keySet(\"france\")).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 60,
+    "code": "    assertThat(cache.values()).containsOnly(\"paris\", \"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 61,
+    "code": "    assertThat(cache.containsKey(\"france\")).isTrue();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 62,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 63,
+    "code": "    Cache.Entry[] entries = Iterables.toArray(cache.entries(), Cache.Entry.class);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "db81d934752174207268c49658963ba98665794b",
+    "scmDate": "2014-02-20T07:35:27+0100"
+  },
+  {
+    "line": 64,
+    "code": "    assertThat(entries).hasSize(2);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 65,
+    "code": "    assertThat(entries[0].key()[0]).isEqualTo(\"france\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 66,
+    "code": "    assertThat(entries[0].value()).isEqualTo(\"paris\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 67,
+    "code": "    assertThat(entries[1].key()[0]).isEqualTo(\"italy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 68,
+    "code": "    assertThat(entries[1].value()).isEqualTo(\"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 69,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 70,
+    "code": "    cache.remove(\"france\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 71,
+    "code": "    assertThat(cache.get(\"france\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 72,
+    "code": "    assertThat(cache.get(\"italy\")).isEqualTo(\"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 73,
+    "code": "    assertThat(cache.keySet()).containsOnly(\"italy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 74,
+    "code": "    assertThat(cache.keySet(\"france\")).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 75,
+    "code": "    assertThat(cache.containsKey(\"france\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 76,
+    "code": "    assertThat(cache.containsKey(\"italy\")).isTrue();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 77,
+    "code": "    assertThat(cache.values()).containsOnly(\"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 78,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 79,
+    "code": "    cache.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 80,
+    "code": "    assertThat(cache.values()).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 81,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 82,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 83,
+    "code": "  @Test",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 84,
+    "code": "  public void test_key_being_prefix_of_another_key() throws Exception {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 85,
+    "code": "    Cache&lt;String&gt; cache = caches.createCache(\"components\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 86,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 87,
+    "code": "    cache.put(\"struts-el:org.apache.strutsel.taglib.html.ELButtonTag\", \"the Tag\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 88,
+    "code": "    cache.put(\"struts-el:org.apache.strutsel.taglib.html.ELButtonTagBeanInfo\", \"the BeanInfo\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 89,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 90,
+    "code": "    assertThat(cache.get(\"struts-el:org.apache.strutsel.taglib.html.ELButtonTag\")).isEqualTo(\"the Tag\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 91,
+    "code": "    assertThat(cache.get(\"struts-el:org.apache.strutsel.taglib.html.ELButtonTagBeanInfo\")).isEqualTo(\"the BeanInfo\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 92,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 93,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 94,
+    "code": "  @Test",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "2a37a23b0ff74cd69a3a4c9053f3a2331b234097",
+    "scmDate": "2013-05-31T12:42:59+0200"
+  },
+  {
+    "line": 95,
+    "code": "  public void two_parts_key() throws Exception {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 96,
+    "code": "    Cache&lt;String&gt; cache = caches.createCache(\"capitals\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 97,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 98,
+    "code": "    assertThat(cache.get(\"europe\", \"france\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 99,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 100,
+    "code": "    cache.put(\"europe\", \"france\", \"paris\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 101,
+    "code": "    cache.put(\"europe\", \"italy\", \"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 102,
+    "code": "    cache.put(\"asia\", \"china\", \"pekin\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 103,
+    "code": "    assertThat(cache.get(\"europe\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 104,
+    "code": "    assertThat(cache.get(\"europe\", \"france\")).isEqualTo(\"paris\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 105,
+    "code": "    assertThat(cache.get(\"europe\", \"italy\")).isEqualTo(\"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 106,
+    "code": "    assertThat(cache.get(\"europe\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 107,
+    "code": "    assertThat(cache.keySet(\"europe\")).containsOnly(\"france\", \"italy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 108,
+    "code": "    assertThat(cache.keySet()).containsOnly(\"europe\", \"asia\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 109,
+    "code": "    assertThat(cache.containsKey(\"europe\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 110,
+    "code": "    assertThat(cache.containsKey(\"europe\", \"france\")).isTrue();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 111,
+    "code": "    assertThat(cache.containsKey(\"europe\", \"spain\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 112,
+    "code": "    assertThat(cache.values()).containsOnly(\"paris\", \"rome\", \"pekin\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 113,
+    "code": "    assertThat(cache.values(\"america\")).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 114,
+    "code": "    assertThat(cache.values(\"europe\")).containsOnly(\"paris\", \"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 115,
+    "code": "    assertThat(cache.values(\"oceania\")).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 116,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 117,
+    "code": "    Cache.Entry[] allEntries = Iterables.toArray(cache.entries(), Cache.Entry.class);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "db81d934752174207268c49658963ba98665794b",
+    "scmDate": "2014-02-20T07:35:27+0100"
+  },
+  {
+    "line": 118,
+    "code": "    assertThat(allEntries).hasSize(3);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 119,
+    "code": "    assertThat(allEntries[0].key()).isEqualTo(new String[] {\"asia\", \"china\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 120,
+    "code": "    assertThat(allEntries[0].value()).isEqualTo(\"pekin\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 121,
+    "code": "    assertThat(allEntries[1].key()).isEqualTo(new String[] {\"europe\", \"france\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 122,
+    "code": "    assertThat(allEntries[1].value()).isEqualTo(\"paris\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 123,
+    "code": "    assertThat(allEntries[2].key()).isEqualTo(new String[] {\"europe\", \"italy\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 124,
+    "code": "    assertThat(allEntries[2].value()).isEqualTo(\"rome\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 125,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 126,
+    "code": "    Cache.Entry[] subEntries = Iterables.toArray(cache.entries(\"europe\"), Cache.Entry.class);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 127,
+    "code": "    assertThat(subEntries).hasSize(2);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 128,
+    "code": "    assertThat(subEntries[0].key()).isEqualTo(new String[] {\"europe\", \"france\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 129,
+    "code": "    assertThat(subEntries[0].value()).isEqualTo(\"paris\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 130,
+    "code": "    assertThat(subEntries[1].key()).isEqualTo(new String[] {\"europe\", \"italy\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 131,
+    "code": "    assertThat(subEntries[1].value()).isEqualTo(\"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 132,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 133,
+    "code": "    cache.remove(\"europe\", \"france\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 134,
+    "code": "    assertThat(cache.values()).containsOnly(\"rome\", \"pekin\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 135,
+    "code": "    assertThat(cache.get(\"europe\", \"france\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 136,
+    "code": "    assertThat(cache.get(\"europe\", \"italy\")).isEqualTo(\"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 137,
+    "code": "    assertThat(cache.containsKey(\"europe\", \"france\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 138,
+    "code": "    assertThat(cache.keySet(\"europe\")).containsOnly(\"italy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 139,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 140,
+    "code": "    cache.clear(\"america\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 141,
+    "code": "    assertThat(cache.keySet()).containsOnly(\"europe\", \"asia\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 142,
+    "code": "    cache.clear();",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 143,
+    "code": "    assertThat(cache.keySet()).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 144,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 145,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 146,
+    "code": "  @Test",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 147,
+    "code": "  public void three_parts_key() throws Exception {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 148,
+    "code": "    Cache&lt;String&gt; cache = caches.createCache(\"places\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 149,
+    "code": "    assertThat(cache.get(\"europe\", \"france\", \"paris\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 150,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 151,
+    "code": "    cache.put(\"europe\", \"france\", \"paris\", \"eiffel tower\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 152,
+    "code": "    cache.put(\"europe\", \"france\", \"annecy\", \"lake\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 153,
+    "code": "    cache.put(\"europe\", \"france\", \"poitiers\", \"notre dame\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 154,
+    "code": "    cache.put(\"europe\", \"italy\", \"rome\", \"colosseum\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 155,
+    "code": "    cache.put(\"europe2\", \"ukrania\", \"kiev\", \"dunno\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 156,
+    "code": "    cache.put(\"asia\", \"china\", \"pekin\", \"great wall\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 157,
+    "code": "    cache.put(\"america\", \"us\", \"new york\", \"empire state building\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 158,
+    "code": "    assertThat(cache.get(\"europe\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 159,
+    "code": "    assertThat(cache.get(\"europe\", \"france\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 160,
+    "code": "    assertThat(cache.get(\"europe\", \"france\", \"paris\")).isEqualTo(\"eiffel tower\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 161,
+    "code": "    assertThat(cache.get(\"europe\", \"france\", \"annecy\")).isEqualTo(\"lake\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 162,
+    "code": "    assertThat(cache.get(\"europe\", \"italy\", \"rome\")).isEqualTo(\"colosseum\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 163,
+    "code": "    assertThat(cache.keySet()).containsOnly(\"europe\", \"asia\", \"america\", \"europe2\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 164,
+    "code": "    assertThat(cache.keySet(\"europe\")).containsOnly(\"france\", \"italy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 165,
+    "code": "    assertThat(cache.keySet(\"europe\", \"france\")).containsOnly(\"annecy\", \"paris\", \"poitiers\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 166,
+    "code": "    assertThat(cache.containsKey(\"europe\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 167,
+    "code": "    assertThat(cache.containsKey(\"europe\", \"france\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 168,
+    "code": "    assertThat(cache.containsKey(\"europe\", \"france\", \"annecy\")).isTrue();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 169,
+    "code": "    assertThat(cache.containsKey(\"europe\", \"france\", \"biarritz\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 170,
+    "code": "    assertThat(cache.values()).containsOnly(\"eiffel tower\", \"lake\", \"colosseum\", \"notre dame\", \"great wall\", \"empire state building\", \"dunno\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 171,
+    "code": "    assertThat(cache.values(\"europe\")).containsOnly(\"eiffel tower\", \"lake\", \"colosseum\", \"notre dame\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 172,
+    "code": "    assertThat(cache.values(\"europe\", \"france\")).containsOnly(\"eiffel tower\", \"lake\", \"notre dame\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 173,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 174,
+    "code": "    Cache.Entry[] allEntries = Iterables.toArray(cache.entries(), Cache.Entry.class);",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "db81d934752174207268c49658963ba98665794b",
+    "scmDate": "2014-02-20T07:35:27+0100"
+  },
+  {
+    "line": 175,
+    "code": "    assertThat(allEntries).hasSize(7);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 176,
+    "code": "    assertThat(allEntries[0].key()).isEqualTo(new String[] {\"america\", \"us\", \"new york\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 177,
+    "code": "    assertThat(allEntries[0].value()).isEqualTo(\"empire state building\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 178,
+    "code": "    assertThat(allEntries[1].key()).isEqualTo(new String[] {\"asia\", \"china\", \"pekin\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 179,
+    "code": "    assertThat(allEntries[1].value()).isEqualTo(\"great wall\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 180,
+    "code": "    assertThat(allEntries[2].key()).isEqualTo(new String[] {\"europe\", \"france\", \"annecy\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 181,
+    "code": "    assertThat(allEntries[2].value()).isEqualTo(\"lake\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 182,
+    "code": "    assertThat(allEntries[3].key()).isEqualTo(new String[] {\"europe\", \"france\", \"paris\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 183,
+    "code": "    assertThat(allEntries[3].value()).isEqualTo(\"eiffel tower\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 184,
+    "code": "    assertThat(allEntries[4].key()).isEqualTo(new String[] {\"europe\", \"france\", \"poitiers\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 185,
+    "code": "    assertThat(allEntries[4].value()).isEqualTo(\"notre dame\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 186,
+    "code": "    assertThat(allEntries[5].key()).isEqualTo(new String[] {\"europe\", \"italy\", \"rome\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 187,
+    "code": "    assertThat(allEntries[5].value()).isEqualTo(\"colosseum\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 188,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 189,
+    "code": "    Cache.Entry[] subEntries = Iterables.toArray(cache.entries(\"europe\"), Cache.Entry.class);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 190,
+    "code": "    assertThat(subEntries).hasSize(4);",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 191,
+    "code": "    assertThat(subEntries[0].key()).isEqualTo(new String[] {\"europe\", \"france\", \"annecy\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 192,
+    "code": "    assertThat(subEntries[0].value()).isEqualTo(\"lake\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 193,
+    "code": "    assertThat(subEntries[1].key()).isEqualTo(new String[] {\"europe\", \"france\", \"paris\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 194,
+    "code": "    assertThat(subEntries[1].value()).isEqualTo(\"eiffel tower\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 195,
+    "code": "    assertThat(subEntries[2].key()).isEqualTo(new String[] {\"europe\", \"france\", \"poitiers\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 196,
+    "code": "    assertThat(subEntries[2].value()).isEqualTo(\"notre dame\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 197,
+    "code": "    assertThat(subEntries[3].key()).isEqualTo(new String[] {\"europe\", \"italy\", \"rome\"});",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 198,
+    "code": "    assertThat(subEntries[3].value()).isEqualTo(\"colosseum\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 199,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 200,
+    "code": "    cache.remove(\"europe\", \"france\", \"annecy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 201,
+    "code": "    assertThat(cache.values()).containsOnly(\"eiffel tower\", \"colosseum\", \"notre dame\", \"great wall\", \"empire state building\", \"dunno\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 202,
+    "code": "    assertThat(cache.values(\"europe\")).containsOnly(\"eiffel tower\", \"colosseum\", \"notre dame\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 203,
+    "code": "    assertThat(cache.values(\"europe\", \"france\")).containsOnly(\"eiffel tower\", \"notre dame\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 204,
+    "code": "    assertThat(cache.get(\"europe\", \"france\", \"annecy\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 205,
+    "code": "    assertThat(cache.get(\"europe\", \"italy\", \"rome\")).isEqualTo(\"colosseum\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 206,
+    "code": "    assertThat(cache.containsKey(\"europe\", \"france\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 207,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 208,
+    "code": "    cache.clear(\"europe\", \"italy\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 209,
+    "code": "    assertThat(cache.values()).containsOnly(\"eiffel tower\", \"notre dame\", \"great wall\", \"empire state building\", \"dunno\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 210,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 211,
+    "code": "    cache.clear(\"europe\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 212,
+    "code": "    assertThat(cache.values()).containsOnly(\"great wall\", \"empire state building\", \"dunno\");",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 213,
+    "code": "",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 214,
+    "code": "    cache.clear();",
+    "scmAuthor": "julien.henry@sonarsource.com",
+    "scmRevision": "cc071cc29e8c4d4592282313a3ca2ec376fd7f71",
+    "scmDate": "2014-05-01T00:00:12+0200"
+  },
+  {
+    "line": 215,
+    "code": "    assertThat(cache.values()).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 216,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 217,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 218,
+    "code": "  @Test",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 219,
+    "code": "  public void remove_versus_clear() throws Exception {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 220,
+    "code": "    Cache&lt;String&gt; cache = caches.createCache(\"capitals\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 221,
+    "code": "    cache.put(\"europe\", \"france\", \"paris\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 222,
+    "code": "    cache.put(\"europe\", \"italy\", \"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 223,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 224,
+    "code": "    // remove(\"europe\") does not remove sub-keys",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 225,
+    "code": "    cache.remove(\"europe\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 226,
+    "code": "    assertThat(cache.values()).containsOnly(\"paris\", \"rome\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 227,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 228,
+    "code": "    // clear(\"europe\") removes sub-keys",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 229,
+    "code": "    cache.clear(\"europe\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 230,
+    "code": "    assertThat(cache.values()).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 231,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 232,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 233,
+    "code": "  @Test",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 234,
+    "code": "  public void empty_cache() throws Exception {",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 235,
+    "code": "    Cache&lt;String&gt; cache = caches.createCache(\"empty\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 236,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 237,
+    "code": "    assertThat(cache.get(\"foo\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 238,
+    "code": "    assertThat(cache.get(\"foo\", \"bar\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 239,
+    "code": "    assertThat(cache.get(\"foo\", \"bar\", \"baz\")).isNull();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 240,
+    "code": "    assertThat(cache.keySet()).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 241,
+    "code": "    assertThat(cache.keySet(\"foo\")).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 242,
+    "code": "    assertThat(cache.containsKey(\"foo\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 243,
+    "code": "    assertThat(cache.containsKey(\"foo\", \"bar\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 244,
+    "code": "    assertThat(cache.containsKey(\"foo\", \"bar\", \"baz\")).isFalse();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 245,
+    "code": "    assertThat(cache.values()).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 246,
+    "code": "    assertThat(cache.values(\"foo\")).isEmpty();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 247,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 248,
+    "code": "    // do not fail",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 249,
+    "code": "    cache.remove(\"foo\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 250,
+    "code": "    cache.remove(\"foo\", \"bar\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 251,
+    "code": "    cache.remove(\"foo\", \"bar\", \"baz\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 252,
+    "code": "    cache.clear(\"foo\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 253,
+    "code": "    cache.clear(\"foo\", \"bar\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 254,
+    "code": "    cache.clear(\"foo\", \"bar\", \"baz\");",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "e486fe02a0a38d3d9fb70690f7870c77e2265254",
+    "scmDate": "2014-02-20T07:23:08+0100"
+  },
+  {
+    "line": 255,
+    "code": "    cache.clear();",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 256,
+    "code": "  }",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b5eb47872b34aa9d017dca62abfe49b2fd7af61b",
+    "scmDate": "2013-04-17T10:35:23+0200"
+  },
+  {
+    "line": 257,
+    "code": "}",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  },
+  {
+    "line": 258,
+    "code": "",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "108dc916996e3075eb21c6ae1bbc7c9a24f09ab0",
+    "scmDate": "2013-04-16T13:24:54+0200"
+  }
+]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/tests.json b/server/sonar-web/src/main/js/tests/e2e/tests/source-viewer-spec/tests/tests.json
new file mode 100644 (file)
index 0000000..421cbb3
--- /dev/null
@@ -0,0 +1,38 @@
+{"tests": [
+  {
+    "name": "two_parts_key",
+    "status": "OK",
+    "durationInMs": 324,
+    "coveredLines": 0
+  },
+  {
+    "name": "remove_versus_clear",
+    "status": "OK",
+    "durationInMs": 81,
+    "coveredLines": 0
+  },
+  {
+    "name": "three_parts_key",
+    "status": "OK",
+    "durationInMs": 93,
+    "coveredLines": 0
+  },
+  {
+    "name": "test_key_being_prefix_of_another_key",
+    "status": "OK",
+    "durationInMs": 89,
+    "coveredLines": 0
+  },
+  {
+    "name": "one_part_key",
+    "status": "OK",
+    "durationInMs": 91,
+    "coveredLines": 0
+  },
+  {
+    "name": "empty_cache",
+    "status": "OK",
+    "durationInMs": 88,
+    "coveredLines": 0
+  }
+]}
diff --git a/server/sonar-web/src/main/js/tests/e2e/views/component-viewer.jade b/server/sonar-web/src/main/js/tests/e2e/views/component-viewer.jade
deleted file mode 100644 (file)
index 0636b7f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-extends ./layouts/main
-
-block header
-  script.
-    localStorage.removeItem('componentViewerSCM');
-  script(data-main='/js/component-viewer/app', src='../js/require.js')
-
-block body
-  #component-viewer
diff --git a/server/sonar-web/src/main/js/tests/e2e/views/source-viewer.jade b/server/sonar-web/src/main/js/tests/e2e/views/source-viewer.jade
new file mode 100644 (file)
index 0000000..778195a
--- /dev/null
@@ -0,0 +1,13 @@
+extends ./layouts/main
+
+block header
+  script(data-main='/js/source-viewer/app', src='../js/require.js')
+
+block body
+  #source-viewer
+
+  script.
+    window.file = {
+      uuid: '',
+      key: ''
+    };
index fd4838d4a45601c57b64870925e5139395f14cc6..f219f85589a3601ed6829526421110526e5ada62 100644 (file)
@@ -191,6 +191,7 @@ window.SonarWidgets = window.SonarWidgets == null ? {} : window.SonarWidgets;
     // Configure sectors
     this.sectors = this.plotWrap.selectAll('.arc')
         .data(this.pie(this.components()));
+    console.log(this.components());
 
     this.sectors
         .enter()
index 834d9d6912bef35faab5ae665e438d72b8801eef..28333bca7a8e587c5ec780ef75326451c54fe226 100644 (file)
@@ -3,3 +3,4 @@
 @import "components/facets";
 @import "components/modals";
 @import "components/issues";
+@import "components/measures";
diff --git a/server/sonar-web/src/main/less/components/measures.less b/server/sonar-web/src/main/less/components/measures.less
new file mode 100644 (file)
index 0000000..ee589d1
--- /dev/null
@@ -0,0 +1,80 @@
+@import (reference) "../variables";
+@import (reference) "../mixins";
+@import (reference) "../ui";
+
+
+.measures {
+  font-size: 0;
+}
+
+.measures + .measures {
+  margin-top: 15px;
+  padding-top: 15px;
+  border-top: 1px solid @barBorderColor;
+}
+
+.measures-duplex {
+  .measures-list {
+    vertical-align: top;
+    width: 50%;
+  }
+}
+
+.measures-chart {
+  display: inline-block;
+  vertical-align: middle;
+  width: 70px;
+  margin-right: 20px;
+  text-align: center;
+
+  .rating {
+    font-size: 32px;
+  }
+}
+
+.measures-list {
+  display: inline-block;
+  vertical-align: middle;
+  font-size: @baseFontSize;
+}
+
+.measure {
+  line-height: 1.3333333333333;
+}
+
+.measure + .measure {
+  margin-top: 6px;
+}
+
+.measure-name {
+  display: block;
+}
+
+.measure-value {
+  color: @darkBlue;
+  font-size: @bigFontSize;
+  font-weight: 300;
+}
+
+.measure-big {
+  .measure-name {
+    font-size: 16px;
+    font-weight: 300;
+  }
+
+  .measure-value {
+    font-size: 22px;
+    font-weight: 300;
+  }
+}
+
+.measure-one-line {
+  .measure-name {
+    display: inline;
+
+    &:after {
+      content: ":";
+    }
+  }
+}
+
index d2df60b8098da3c3483654253c1c6f3957964e44..44a8ae0040543d6dd78c855e65f6832b591edbb4 100644 (file)
@@ -1,11 +1,12 @@
 @import (reference) "../mixins";
 @import (reference) "../variables";
+@import (reference) "../ui";
 
 @lineHeight: 18px;
 @lineWithIssuesBackground: #ffeaea;
 @duplicationColor: #f3ca8e;
 
-.source {
+.source-viewer {
   width: 100%;
   border: 1px solid @barBorderColor;
   .box-sizing(border-box);
   }
 }
 
+.source-line-shadowed {
+  .source-line-code {
+    opacity: 0.4;
+  }
+}
+
 .source-line-expand {
   .source-line-code {
     background: url(../images/gray-stripes.png) repeat;
   }
 }
 
-.source pre {
+.source-viewer pre {
   height: @lineHeight;
   padding: 0;
 }
 
-.source pre,
+.source-viewer pre,
 .source-meta {
   line-height: @lineHeight;
   font-family: @monoFontFamily;
   background-color: @duplicationColor !important;
   cursor: pointer;
 }
+
+
+// Header
+
+.source-viewer-header {
+  .clearfix;
+  position: relative;
+  padding: 2px 10px 4px;
+  border-bottom: 1px solid @barBorderColor;
+  background-color: @barBackgroundColor;
+}
+
+.source-viewer-header-bar + .source-viewer-header-bar {
+  border-top: 1px solid @barBorderColor;
+}
+
+.source-viewer-header-component {
+  float: left;
+  line-height: 20px;
+}
+
+.source-viewer-header-component-project {
+  color: #777;
+  font-size: @smallFontSize;
+}
+
+.source-viewer-header-component-name {
+  font-weight: 500;
+}
+
+.source-viewer-header-favorite {
+  position: relative;
+  top: -2px;
+  margin-left: 4px;
+  .link-no-underline;
+}
+
+.source-viewer-header-measures {
+  float: right;
+}
+
+.source-viewer-header-measures-scope {
+  position: relative;
+  float: left;
+}
+
+.source-viewer-header-measure {
+  display: inline-block;
+  vertical-align: middle;
+  padding: 3px 0;
+  font-size: @baseFontSize;
+
+  .rating {
+    font-size: 18px;
+  }
+}
+
+.source-viewer-header-measure + .source-viewer-header-measure {
+  margin-left: 25px;
+}
+
+.source-viewer-header-measure-label {
+  display: block;
+  margin-top: 4px;
+  line-height: @smallFontSize;
+  color: #777;
+  font-size: @smallFontSize;
+}
+
+.source-viewer-header-measure-value {
+  display: block;
+  line-height: 18px;
+  color: @baseFontColor;
+  font-size: 18px;
+  font-weight: 300;
+}
+
+.source-viewer-header-measure-issues {
+  width: 45px;
+}
+
+.source-viewer-header-measure-issue {
+  min-width: 1px;
+  height: 6px;
+
+  &.s-blocker { background-color: @severityBlockerColor; }
+  &.s-critical { background-color: @severityCriticalColor; }
+  &.s-major { background-color: @severityMajorColor; }
+  &.s-minor { background-color: @severityMinorColor; }
+  &.s-info { background-color: @severityInfoColor; }
+}
+
+.source-viewer-header-measure-issue + .source-viewer-header-measure-issue {
+  margin-top: 1px;
+}
+
+.source-viewer-header-actions {
+  float: right;
+  display: block;
+  margin-left: 25px;
+  padding: 13px 5px;
+}
+
+.source-viewer-header-more-actions {
+  position: absolute;
+  z-index: 100;
+  right: -1px;
+  top: 100%;
+  padding: 10px;
+  border: 1px solid @barBorderColor;
+  background-color: @white;
+  line-height: 1.8;
+}
+
+.source-viewer-measures {
+  width: 1080px;
+  margin: 0 auto;
+  border-collapse: collapse;
+  table-layout: fixed;
+}
+
+.source-viewer-measures-section {
+  vertical-align: top;
+  width: 25%;
+  padding: 0 15px;
+}
+
+//.source-viewer-measures-section + .source-viewer-measures-section {
+//  border-left: 1px solid @barBorderColor;
+//}
+
+.source-viewer-tests-list {
+  width: 100%;
+  font-size: @baseFontSize;
+
+  .subtitle {
+    font-size: @smallFontSize;
+  }
+}
+
+.source-viewer-test-status,
+.source-viewer-test-duration,
+.source-viewer-test-covered-lines {
+  width: 1px;
+}
+
+.source-viewer-test-status,
+.source-viewer-test-duration,
+.source-viewer-test-covered-lines,
+.source-viewer-test-covered-name {
+  vertical-align: middle;
+  padding: 3px;
+}
+
+.source-viewer-test-name {
+  padding-left: 10px;
+  word-break: break-all;
+}
+
+.source-viewer-test-covered-lines {
+  text-align: right;
+}
index 649b351d1cf5078002f8e2af6a73ead0a9e2fe00..58aab0ae838a8624625abacd6a281b76e740516e 100644 (file)
@@ -22,6 +22,9 @@ class ComponentController < ApplicationController
   SECTION=Navigation::SECTION_RESOURCE
 
   def index
+    load_resource()
+    @line = params[:line]
+
     if request.xhr?
       render :action => 'index'
     else
@@ -31,4 +34,19 @@ class ComponentController < ApplicationController
     end
   end
 
+  private
+
+  def load_resource
+    if params[:id]
+      @resource=Project.by_key(params[:id])
+      return project_not_found unless @resource
+      @resource=@resource.permanent_resource
+
+      @snapshot=@resource.last_snapshot
+      return project_not_analyzed unless @snapshot
+
+      access_denied unless has_role?(:user, @resource)
+    end
+  end
+
 end
index f6f0b264c072b68ae857ae67a5949afc60101c40..b48c26019297b70a40a64e82341f3991b633d7f9 100644 (file)
@@ -1,5 +1,14 @@
 <% content_for :script do %>
-  <script data-main="<%= ApplicationController.root_context -%>/js/component-viewer/app" src="<%= ApplicationController.root_context -%>/js/require.js"></script>
+  <script data-main="<%= ApplicationController.root_context -%>/js/source-viewer/app" src="<%= ApplicationController.root_context -%>/js/require.js"></script>
 <% end %>
 
-<div id="component-viewer"></div>
\ No newline at end of file
+<div id="source-viewer"></div>
+
+<script type="text/javascript">
+  window.file = {
+    uuid: '<%= @resource.uuid -%>',
+    key: '<%= @resource.key -%>'
+    <% if @line %>,line: <%= @line -%><% end %>
+  };
+</script>
+
index 8802eb19301c7d6bb2cf086e1da1ff402ea3605f..05cc887a16621bee55a8c4c9862680790b37148c 100644 (file)
@@ -1,12 +1,16 @@
 <% content_for :script do %>
-  <script data-main="<%= ApplicationController.root_context -%>/js/dashboard/file-app" src="<%= ApplicationController.root_context -%>/js/require.js"></script>
+  <script data-main="<%= ApplicationController.root_context -%>/js/source-viewer/app" src="<%= ApplicationController.root_context -%>/js/require.js"></script>
 <% end %>
 
-<div class="marginbottom10"></div>
-<div id="accordion-panel"></div>
+<div class="page">
+  <div id="source-viewer"></div>
+</div>
 
 <script type="text/javascript">
-  window.fileKey = '<%= @file.key -%>';
-  window.metric = '<%= @metric -%>';
+  window.file = {
+    uuid: '<%= @resource.uuid -%>',
+    key: '<%= @resource.key -%>'
+  };
   document.getElementById('crumbs').remove();
 </script>
+
index 56e4d0500d72d773fed5f36a0e76c427d0a8299b..58f6d8cdd351244661c03e3ad3036c70db0c1612 100644 (file)
@@ -86,7 +86,7 @@
                 <%= qualifier_icon(resource) -%>&nbsp;
                 <% if resource.source_code? %>
                   <a href="#" title="<%= h resource.name(true) -%>" data-key="<%= resource.key -%>"
-                     class="js-drilldown-link"><%= h resource.name(false) %></a>
+                     data-uuid="<%= resource.uuid -%>" class="js-drilldown-link"><%= h resource.name(false) %></a>
                 <% else %>
                   <%= link_to(h(resource.name), params.merge({:only_path => true, :rids => (selected ? rids-[resource.id] : rids+[resource.id])})) -%>
                 <% end %>
   };
 </script>
 
-<div id="accordion-panel"/>
+<div id="source-viewer"></div>
 
 <%= render :partial => 'footer' -%>
index 4dcf2f4b37e329b411603dfbaa4ce7af00b51bcb..576ebdca4db1032ddf6d4217e72178b7533c22c2 100644 (file)
@@ -2578,15 +2578,18 @@ metric.confirmed_issues.description=Confirmed issues
 #--------------------------------------------------------------------------------------------------------------------
 
 metric.sqale_index.name=Technical Debt
+metric.sqale_index.short_name=Debt
 metric.sqale_index.description=Total effort (in days) to fix all the issues on the component and therefore to comply to all the requirements.
 
 metric.new_technical_debt.name=Added Technical Debt
+metric.new_technical_debt.short_name=Added Debt
 metric.new_technical_debt.description=Added Technical Debt
 
 metric.sqale_rating.name=SQALE Rating
 metric.sqale_rating.description=Rating of the technical debt ratio based on the SQALE Governance Model.
 
 metric.sqale_debt_ratio.name=Technical Debt Ratio
+metric.sqale_debt_ratio.short_name=Debt Ratio
 metric.sqale_debt_ratio.description=Ratio of the actual technical debt compared to the estimated cost to develop the whole source code from scratch.
 
 
@@ -2741,6 +2744,7 @@ component_viewer.transition.duplication=Duplicated By
 component_viewer.tests.ordered_by=ordered by
 component_viewer.tests.duration=duration
 component_viewer.tests.test_name=name
+component_viewer.tests.status=status
 
 component_viewer.x_lines_are_covered={0} lines are covered
 component_viewer.details=Details
@@ -2761,6 +2765,7 @@ component_viewer.lines_limit_reached=For performance reasons, only the {0} first
 component_viewer.issues_limit_reached=For usability reasons, only the {0} first issues will be fully displayed. Remaining issues will simply be underlined.
 component_viewer.issues_limit_reached_tooltip={0}\n\nRefine your filter to be able to see the details of this issue.
 component_viewer.cannot_show=We're sorry, but something went wrong. Please try back in a few minutes and contact support if the problem persists.
+component_viewer.show_measures=Show Measures
 
 component_viewer.workspace=Workspace
 component_viewer.workspace.tooltip=Keeps track of history of navigation