From d88d443bbe5c5dabe45b44760108fa7b506cd7d9 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Thu, 18 Feb 2016 20:11:12 +0100 Subject: [PATCH] SONAR-7364 Remove SQALE characteristics from measures and rules --- .../src/test/java/it/dbCleaner/PurgeTest.java | 14 +- .../it/debt/TechnicalDebtMeasureTest.java | 88 ---- .../java/it/debt/TechnicalDebtPurgeTest.java | 6 +- .../java/it/debt/TechnicalDebtWidgetTest.java | 13 - .../display-differential-values.html | 99 ---- .../should-have-correct-values.html | 109 ---- ...hould-open-links-on-drilldown-service.html | 34 -- .../xoo/rule/XooRulesDefinitionTest.java | 1 - ...ReportComputeEngineContainerPopulator.java | 2 - .../computation/debt/Characteristic.java | 31 -- .../computation/debt/CharacteristicImpl.java | 85 --- .../computation/debt/DebtModelHolder.java | 47 -- .../computation/debt/DebtModelHolderImpl.java | 74 --- .../debt/MutableDebtModelHolder.java | 34 -- .../server/computation/debt/package-info.java | 23 - .../computation/issue/DebtAggregator.java | 34 +- .../computation/issue/DebtCalculator.java | 2 +- .../sonar/server/computation/issue/Rule.java | 3 - .../server/computation/issue/RuleImpl.java | 8 - .../measure/MapBasedRawMeasureRepository.java | 13 +- .../server/computation/measure/Measure.java | 53 +- .../measure/MeasureDtoToMeasure.java | 5 - .../computation/measure/MeasureKey.java | 12 +- .../measure/MeasureRepositoryImpl.java | 1 - .../measure/MeasureToMeasureDto.java | 1 - .../step/ComputeMeasureVariationsStep.java | 6 +- .../computation/step/LoadDebtModelStep.java | 127 ----- .../step/ReportComputationSteps.java | 1 - .../widget/TechnicalDebtPyramidWidget.java | 32 -- .../debt/DebtCharacteristicsXMLImporter.java | 115 ---- .../sonar/server/debt/DebtModelBackup.java | 191 +------ .../sonar/server/debt/DebtModelLookup.java | 68 --- .../server/debt/DebtModelOperations.java | 266 ---------- .../sonar/server/debt/DebtModelService.java | 51 +- .../server/debt/DebtModelXMLExporter.java | 121 +---- .../org/sonar/server/debt/DebtPredicates.java | 104 ---- .../server/debt/DebtRulesXMLImporter.java | 23 +- .../org/sonar/server/issue/ws/ShowAction.java | 34 +- .../platformlevel/PlatformLevel4.java | 8 - .../platformlevel/PlatformLevelStartup.java | 2 - .../sonar/server/rule/DefaultRuleFinder.java | 4 - .../rule/DeprecatedRulesDefinitionLoader.java | 3 +- .../org/sonar/server/rule/RegisterRules.java | 80 +-- .../sonar/server/rule/RubyRuleService.java | 3 - .../main/java/org/sonar/server/rule/Rule.java | 12 - .../org/sonar/server/rule/RuleCreator.java | 1 - .../org/sonar/server/rule/RuleOperations.java | 62 +-- .../org/sonar/server/rule/RuleUpdate.java | 41 +- .../org/sonar/server/rule/RuleUpdater.java | 58 +-- .../org/sonar/server/rule/index/RuleDoc.java | 42 +- .../sonar/server/rule/index/RuleIndex.java | 109 +--- .../server/rule/index/RuleNormalizer.java | 69 +-- .../sonar/server/rule/index/RuleQuery.java | 22 - .../org/sonar/server/rule/ws/AppAction.java | 72 +-- .../org/sonar/server/rule/ws/RuleMapping.java | 127 +---- .../sonar/server/rule/ws/SearchAction.java | 28 - .../sonar/server/rule/ws/UpdateAction.java | 11 +- .../server/startup/RegisterDebtModel.java | 46 -- .../dashboard/widget/hotspot_metric.html.erb | 4 +- .../widget/technical_debt_pyramid.html.erb | 156 ------ .../dashboard/widget/time_machine.html.erb | 2 +- .../platform/ws/l10n-index-example.json | 1 - .../debt/CharacteristicImplTest.java | 71 --- .../debt/DebtModelHolderImplTest.java | 110 ---- .../computation/debt/DebtModelHolderRule.java | 81 --- .../computation/issue/DebtAggregatorTest.java | 69 +-- .../computation/issue/DebtCalculatorTest.java | 5 +- .../server/computation/issue/DumbRule.java | 11 - .../issue/RuleRepositoryImplTest.java | 1 - .../MapBasedRawMeasureRepositoryTest.java | 41 -- .../measure/MeasureDtoToMeasureTest.java | 7 - .../computation/measure/MeasureKeyTest.java | 45 +- .../measure/MeasureRepositoryImplTest.java | 37 +- .../measure/MeasureRepositoryRule.java | 90 +--- .../computation/measure/MeasureTest.java | 40 -- .../measure/MeasureToMeasureDtoTest.java | 13 - .../step/LoadDebtModelStepTest.java | 84 --- .../step/PersistMeasuresStepTest.java | 29 -- .../DebtCharacteristicsXMLImporterTest.java | 113 ---- .../org/sonar/server/debt/DebtMediumTest.java | 94 ---- .../server/debt/DebtModelBackupTest.java | 378 ++------------ .../server/debt/DebtModelLookupTest.java | 95 ---- .../server/debt/DebtModelOperationsTest.java | 491 ------------------ .../debt/DebtModelPluginRepositoryTest.java | 13 +- .../server/debt/DebtModelServiceTest.java | 74 +-- .../server/debt/DebtModelXMLExporterTest.java | 105 +--- .../server/debt/DebtRulesXMLImporterTest.java | 80 +-- .../org/sonar/server/debt/DebtTesting.java | 36 -- .../sonar/server/issue/ws/ShowActionTest.java | 33 +- .../DeprecatedRulesDefinitionLoaderTest.java | 3 - .../server/rule/RegisterRulesMediumTest.java | 21 - .../sonar/server/rule/RegisterRulesTest.java | 3 +- .../server/rule/RubyRuleServiceTest.java | 4 - .../server/rule/RuleBackendMediumTest.java | 62 --- .../server/rule/RuleCreatorMediumTest.java | 6 - .../sonar/server/rule/RuleOperationsTest.java | 198 +------ .../server/rule/RuleUpdaterMediumTest.java | 94 +--- .../rule/index/RuleIndexMediumTest.java | 307 +---------- .../sonar/server/rule/ws/AppActionTest.java | 27 +- .../sonar/server/rule/ws/RuleMappingTest.java | 31 +- .../rule/ws/SearchActionMediumTest.java | 122 +---- .../server/rule/ws/ShowActionMediumTest.java | 71 +-- .../server/startup/RegisterDebtModelTest.java | 69 --- .../step/LoadDebtModelStepTest/shared.xml | 15 - .../DebtModelXMLExporterTest/export_xml.xml | 44 +- .../DebtRulesXMLImporterTest/import_rules.xml | 79 +-- ...s_with_deprecated_quality_model_format.xml | 58 +++ ..._rule_is_linked_on_root_characteristic.xml | 17 - .../not_disable_already_disabled_rules.xml | 2 - ...teristic_when_characteristic_not_found.xml | 2 - ...and_overriding_characteristic_disabled.xml | 2 - ...but_characteristic_has_been_overridden.xml | 4 - .../server/rule/RegisterRulesTest/shared.xml | 2 - .../RegisterRulesTest/update_rule_fields.xml | 2 - .../update_template_rule_language.xml | 2 - .../select_by_sub_characteristic_id.xml | 28 - .../server/rule/ws/AppActionTest/app.json | 11 +- ...th_default_and_overridden_debt_values.json | 6 - ...r_offset_and_overridden_constant_debt.json | 6 - ...ear_offset_and_overridden_linear_debt.json | 6 - ...ith_default_and_overridden_debt_infos.json | 6 - .../show_rule_with_default_debt_infos.json | 6 - .../show_rule_with_overridden_debt_infos.json | 4 - ...how_rule_with_overridden_disable_debt.json | 14 - .../controllers/api/resources_controller.rb | 31 +- .../controllers/api/timemachine_controller.rb | 46 +- .../app/controllers/drilldown_controller.rb | 6 - .../WEB-INF/app/helpers/components_helper.rb | 2 +- .../webapp/WEB-INF/app/models/drilldown.rb | 7 - .../WEB-INF/app/models/measure_filter.rb | 4 +- .../WEB-INF/app/models/project_measure.rb | 3 - .../webapp/WEB-INF/app/models/snapshot.rb | 15 +- .../webapp/WEB-INF/app/models/trends_chart.rb | 2 +- .../app/views/drilldown/measures.html.erb | 14 +- ...delete_measures_with_characteristic_id.rb} | 39 +- .../1103_drop_table_characteristics.rb | 30 ++ .../resources/org/sonar/l10n/core.properties | 6 - .../src/main/java/org/sonar/db/DaoModule.java | 2 - .../src/main/java/org/sonar/db/DbClient.java | 7 - .../src/main/java/org/sonar/db/MyBatis.java | 5 +- .../org/sonar/db/debt/CharacteristicDao.java | 220 -------- .../org/sonar/db/debt/CharacteristicDto.java | 137 ----- .../sonar/db/debt/CharacteristicMapper.java | 52 -- .../java/org/sonar/db/measure/MeasureDto.java | 12 - .../org/sonar/db/measure/PastMeasureDto.java | 11 - .../org/sonar/db/version/DatabaseVersion.java | 3 +- .../sonar/db/version/MigrationStepModule.java | 4 +- .../DeleteMeasuresWithCharacteristicId.java | 54 ++ .../sonar/db/debt/CharacteristicMapper.xml | 137 ----- .../org/sonar/db/measure/MeasureMapper.xml | 7 +- .../org/sonar/db/version/rows-h2.sql | 2 + .../org/sonar/db/version/schema-h2.ddl | 20 - .../test/java/org/sonar/db/DaoModuleTest.java | 2 +- .../sonar/db/debt/CharacteristicDaoTest.java | 233 --------- .../sonar/db/debt/CharacteristicDtoTest.java | 83 --- .../org/sonar/db/measure/MeasureDaoTest.java | 49 -- .../sonar/db/measure/PastMeasureDtoTest.java | 4 - .../java/org/sonar/db/rule/RuleDaoTest.java | 2 - .../java/org/sonar/db/rule/RuleDtoTest.java | 33 -- .../db/version/MigrationStepModuleTest.java | 2 +- ...eleteMeasuresWithCharacteristicIdTest.java | 56 ++ .../insert_characteristic-result.xml | 7 - .../select_enabled_root_characteristics.xml | 24 - ...eristics_order_by_characteristic_order.xml | 15 - ..._when_characteristics_are_all_disabled.xml | 14 - ...elect_sub_characteristics_by_parent_id.xml | 35 -- .../db/debt/CharacteristicDaoTest/shared.xml | 26 - .../update_characteristic-result.xml | 7 - .../update_characteristic.xml | 7 - .../RequirementDaoTest/select_requirement.xml | 10 - .../db/debt/RequirementDaoTest/shared.xml | 17 - .../measure/MeasureDaoTest/insert-result.xml | 2 +- .../past_measures_with_characteristic_id.xml | 28 - ...stedMeasuresWhenPurgingSnapshot-result.xml | 4 - ...eleteWastedMeasuresWhenPurgingSnapshot.xml | 4 - .../before.xml | 7 + .../schema.sql | 25 + .../main/java/org/sonar/api/rules/Rule.java | 40 +- .../org/sonar/api/server/debt/DebtModel.java | 8 +- .../api/server/rule/RulesDefinition.java | 20 +- .../server/rule/RulesDefinitionXmlLoader.java | 7 +- .../api/server/rule/RulesDefinitionTest.java | 37 +- .../rule/RulesDefinitionXmlLoaderTest.java | 37 +- sonar-ws/src/main/protobuf/ws-rules.proto | 15 +- 184 files changed, 720 insertions(+), 7492 deletions(-) delete mode 100644 it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/display-differential-values.html delete mode 100644 it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-have-correct-values.html delete mode 100644 it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-open-links-on-drilldown-service.html delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/debt/Characteristic.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/debt/CharacteristicImpl.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolder.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolderImpl.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/debt/MutableDebtModelHolder.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/debt/package-info.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/step/LoadDebtModelStep.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/dashboard/widget/TechnicalDebtPyramidWidget.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/debt/DebtCharacteristicsXMLImporter.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelLookup.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelOperations.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/debt/DebtPredicates.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java delete mode 100644 server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/technical_debt_pyramid.html.erb delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/debt/CharacteristicImplTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderImplTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderRule.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/step/LoadDebtModelStepTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/debt/DebtCharacteristicsXMLImporterTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/debt/DebtMediumTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelLookupTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelOperationsTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/debt/DebtTesting.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/startup/RegisterDebtModelTest.java delete mode 100644 server/sonar-server/src/test/resources/org/sonar/server/computation/step/LoadDebtModelStepTest/shared.xml create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules_with_deprecated_quality_model_format.xml delete mode 100644 server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic.xml delete mode 100644 server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionMediumTest/show_rule_with_overridden_disable_debt.json rename server/sonar-web/src/main/webapp/WEB-INF/{app/models/characteristic.rb => db/migrate/1102_delete_measures_with_characteristic_id.rb} (53%) create mode 100644 server/sonar-web/src/main/webapp/WEB-INF/db/migrate/1103_drop_table_characteristics.rb delete mode 100644 sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDao.java delete mode 100644 sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDto.java delete mode 100644 sonar-db/src/main/java/org/sonar/db/debt/CharacteristicMapper.java create mode 100644 sonar-db/src/main/java/org/sonar/db/version/v55/DeleteMeasuresWithCharacteristicId.java delete mode 100644 sonar-db/src/main/resources/org/sonar/db/debt/CharacteristicMapper.xml delete mode 100644 sonar-db/src/test/java/org/sonar/db/debt/CharacteristicDaoTest.java delete mode 100644 sonar-db/src/test/java/org/sonar/db/debt/CharacteristicDtoTest.java create mode 100644 sonar-db/src/test/java/org/sonar/db/version/v55/DeleteMeasuresWithCharacteristicIdTest.java delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/insert_characteristic-result.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/select_enabled_root_characteristics.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/select_enabled_root_characteristics_order_by_characteristic_order.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/select_max_characteristic_order_when_characteristics_are_all_disabled.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/select_sub_characteristics_by_parent_id.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/shared.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/update_characteristic-result.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/CharacteristicDaoTest/update_characteristic.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/RequirementDaoTest/select_requirement.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/debt/RequirementDaoTest/shared.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/measure/MeasureDaoTest/past_measures_with_characteristic_id.xml create mode 100644 sonar-db/src/test/resources/org/sonar/db/version/v55/DeleteMeasuresWithCharacteristicIdTest/before.xml create mode 100644 sonar-db/src/test/resources/org/sonar/db/version/v55/DeleteMeasuresWithCharacteristicIdTest/schema.sql diff --git a/it/it-tests/src/test/java/it/dbCleaner/PurgeTest.java b/it/it-tests/src/test/java/it/dbCleaner/PurgeTest.java index e6a38f28b71..430a2834d9f 100644 --- a/it/it-tests/src/test/java/it/dbCleaner/PurgeTest.java +++ b/it/it-tests/src/test/java/it/dbCleaner/PurgeTest.java @@ -76,10 +76,10 @@ public class PurgeTest { collector.checkThat("Wrong number of files", count("projects where qualifier in ('FIL')"), equalTo(4)); collector.checkThat("Wrong number of unit test files", count("projects where qualifier in ('UTS')"), equalTo(0)); - int measuresOnTrk = 47; - int measuresOnBrc = 234; - int measuresOnDir = 117; - int measuresOnFil = 69; + int measuresOnTrk = 37; + int measuresOnBrc = 174; + int measuresOnDir = 109; + int measuresOnFil = 61; // count measures  assertMeasuresCountForQualifier("TRK", measuresOnTrk); @@ -105,8 +105,8 @@ public class PurgeTest { // must be a different date, else a single snapshot is kept per day scan(PROJECT_SAMPLE_PATH, DateFormatUtils.ISO_DATE_FORMAT.format(today)); - int newMeasuresOnTrk = 53; - int newMeasuresOnBrc = 274; + int newMeasuresOnTrk = 43; + int newMeasuresOnBrc = 214; int newMeasuresOnDir = 32; int newMeasuresOnFil = 0; @@ -280,7 +280,7 @@ public class PurgeTest { } private void logMeasures(String title, String qualifier) { - String sql = "SELECT m.name as metricName, pm.value as value, pm.text_value as textValue, pm.variation_value_1, pm.variation_value_2, pm.variation_value_3, pm.rule_id, pm.characteristic_id " + String sql = "SELECT m.name as metricName, pm.value as value, pm.text_value as textValue, pm.variation_value_1, pm.variation_value_2, pm.variation_value_3, pm.rule_id " + "FROM project_measures pm, snapshots s, metrics m " + "WHERE pm.snapshot_id=s.id and pm.metric_id=m.id and s.qualifier='" diff --git a/it/it-tests/src/test/java/it/debt/TechnicalDebtMeasureTest.java b/it/it-tests/src/test/java/it/debt/TechnicalDebtMeasureTest.java index 46adf4cb4f1..71f4f47c575 100644 --- a/it/it-tests/src/test/java/it/debt/TechnicalDebtMeasureTest.java +++ b/it/it-tests/src/test/java/it/debt/TechnicalDebtMeasureTest.java @@ -66,84 +66,6 @@ public class TechnicalDebtMeasureTest { assertThat(getMeasure(FILE, TECHNICAL_DEBT_MEASURE).getValue()).isEqualTo(28); } - @Test - public void technical_debt_measures_on_characteristics_on_project() { - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "PORTABILITY").getValue()).isEqualTo(0); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "MAINTAINABILITY").getValue()).isEqualTo(4); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "SECURITY").getValue()).isEqualTo(340); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "EFFICIENCY").getValue()).isEqualTo(61); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "CHANGEABILITY").getValue()).isEqualTo(40); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "RELIABILITY").getValue()).isEqualTo(0); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "READABILITY").getValue()).isEqualTo(4); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "TESTABILITY").getValue()).isEqualTo(0); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "REUSABILITY").getValue()).isEqualTo(0); - - // sub characteristics - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "API_ABUSE").getValue()).isEqualTo(340); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "ARCHITECTURE_CHANGEABILITY").getValue()).isEqualTo(40); - assertThat(getCharacteristicMeasure(PROJECT, TECHNICAL_DEBT_MEASURE, "MEMORY_EFFICIENCY").getValue()).isEqualTo(61); - } - - @Test - public void technical_debt_measures_on_characteristics_on_modules() { - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "MAINTAINABILITY").getValue()).isEqualTo(4); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "PORTABILITY").getValue()).isEqualTo(0); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "SECURITY").getValue()).isEqualTo(170); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "EFFICIENCY").getValue()).isEqualTo(37); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "CHANGEABILITY").getValue()).isEqualTo(20); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "RELIABILITY").getValue()).isEqualTo(0); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "READABILITY").getValue()).isEqualTo(4); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "TESTABILITY").getValue()).isEqualTo(0); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "REUSABILITY").getValue()).isEqualTo(0); - - // sub characteristics - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "API_ABUSE").getValue()).isEqualTo(170); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "ARCHITECTURE_CHANGEABILITY").getValue()).isEqualTo(20); - assertThat(getCharacteristicMeasure(MODULE, TECHNICAL_DEBT_MEASURE, "MEMORY_EFFICIENCY").getValue()).isEqualTo(37); - } - - @Test - public void technical_debt_measures_on_characteristics_on_directory() { - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "PORTABILITY")).isNull(); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "MAINTAINABILITY").getValue()).isEqualTo(2); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "SECURITY")).isNull(); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "EFFICIENCY").getValue()).isEqualTo(16); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "CHANGEABILITY").getValue()).isEqualTo(10); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "RELIABILITY")).isNull(); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "READABILITY").getValue()).isEqualTo(2); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "TESTABILITY")).isNull(); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "REUSABILITY")).isNull(); - - // sub characteristics - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "API_ABUSE")).isNull(); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "ARCHITECTURE_CHANGEABILITY").getValue()).isEqualTo(10); - assertThat(getCharacteristicMeasure(DIRECTORY, TECHNICAL_DEBT_MEASURE, "MEMORY_EFFICIENCY").getValue()).isEqualTo(16); - } - - @Test - public void technical_debt_measures_on_characteristics_on_file() { - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "PORTABILITY")).isNull(); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "MAINTAINABILITY").getValue()).isEqualTo(2); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "SECURITY")).isNull(); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "EFFICIENCY").getValue()).isEqualTo(16); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "CHANGEABILITY").getValue()).isEqualTo(10); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "RELIABILITY")).isNull(); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "READABILITY").getValue()).isEqualTo(2); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "TESTABILITY")).isNull(); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "REUSABILITY")).isNull(); - - // sub characteristics - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "API_ABUSE")).isNull(); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "ARCHITECTURE_CHANGEABILITY").getValue()).isEqualTo(10); - assertThat(getCharacteristicMeasure(FILE, TECHNICAL_DEBT_MEASURE, "MEMORY_EFFICIENCY").getValue()).isEqualTo(16); - } - - @Test - public void not_save_zero_value_on_non_top_characteristics() throws Exception { - String sqlRequest = "SELECT count(*) FROM project_measures WHERE characteristic_id IN (select id from characteristics where parent_id IS NOT NULL) AND value = 0"; - assertThat(orchestrator.getDatabase().countSql(sqlRequest)).isEqualTo(0); - } - private Measure getMeasure(String resource, String metricKey) { Resource res = orchestrator.getServer().getWsClient().find(ResourceQuery.createForMetrics(resource, metricKey)); if (res == null) { @@ -151,14 +73,4 @@ public class TechnicalDebtMeasureTest { } return res.getMeasure(metricKey); } - - private Measure getCharacteristicMeasure(String resource, String metricKey, String characteristicKey) { - Resource res = orchestrator.getServer().getWsClient().find( - ResourceQuery.createForMetrics(resource, metricKey).setCharacteristics(characteristicKey)); - if (res == null) { - return null; - } - return res.getMeasure(metricKey); - } - } diff --git a/it/it-tests/src/test/java/it/debt/TechnicalDebtPurgeTest.java b/it/it-tests/src/test/java/it/debt/TechnicalDebtPurgeTest.java index ea713265b18..c329e732b97 100644 --- a/it/it-tests/src/test/java/it/debt/TechnicalDebtPurgeTest.java +++ b/it/it-tests/src/test/java/it/debt/TechnicalDebtPurgeTest.java @@ -61,12 +61,12 @@ public class TechnicalDebtPurgeTest { scanProject("2012-01-01"); int onCharacteristicsCount = orchestrator.getDatabase().countSql(SQL_COUNT_MEASURES_ON_CHARACTERISTICS); int onRequirementsCount = orchestrator.getDatabase().countSql(SQL_COUNT_MEASURES_ON_DEBT_MEASURES_WITH_RULES); - assertThat(onCharacteristicsCount).isGreaterThan(0); assertThat(onRequirementsCount).isGreaterThan(0); + // no more characteristics since 5.5 + assertThat(onCharacteristicsCount).isEqualTo(0); scanProject("2012-02-02"); - // past measures on characteristics are not purged - assertThat(orchestrator.getDatabase().countSql(SQL_COUNT_MEASURES_ON_CHARACTERISTICS)).isGreaterThan(onCharacteristicsCount); + assertThat(orchestrator.getDatabase().countSql(SQL_COUNT_MEASURES_ON_CHARACTERISTICS)).isEqualTo(0); // past measures on debt with rules are purged assertThat(orchestrator.getDatabase().countSql(SQL_COUNT_MEASURES_ON_DEBT_MEASURES_WITH_RULES)).isEqualTo(onRequirementsCount); diff --git a/it/it-tests/src/test/java/it/debt/TechnicalDebtWidgetTest.java b/it/it-tests/src/test/java/it/debt/TechnicalDebtWidgetTest.java index 89f10f8a918..973800cb8d2 100644 --- a/it/it-tests/src/test/java/it/debt/TechnicalDebtWidgetTest.java +++ b/it/it-tests/src/test/java/it/debt/TechnicalDebtWidgetTest.java @@ -80,19 +80,6 @@ public class TechnicalDebtWidgetTest { ).build()).runOn(orchestrator); } - /** - * SONAR-4718 - */ - @Test - public void technical_debt_pyramid_widget() { - new SeleneseTest(Selenese.builder() - .setHtmlTestsInClasspath("technical-debt-pyramid-widget", - "/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-have-correct-values.html", - "/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-open-links-on-drilldown-service.html", - "/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/display-differential-values.html" - ).build()).runOn(orchestrator); - } - /** * SONAR-5450 */ diff --git a/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/display-differential-values.html b/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/display-differential-values.html deleted file mode 100644 index c39a4f0f69a..00000000000 --- a/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/display-differential-values.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - display-differential-values - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
open/widget?id=technical_debt_pyramid&resource=com.sonarsource.it.samples:multi-modules-sample&period=1
assertTextcss=.value-debt-REUSABILITY*0*(+0)*
assertTextcss=.value-total-REUSABILITY*7h 25min*(+1h 58min)*
assertTextcss=.value-debt-PORTABILITY*0*(+0)*
assertTextcss=.value-total-PORTABILITY*7h 25min*(+1h 58min)*
assertTextcss=.value-debt-MAINTAINABILITY*4min*(+2min)*
assertTextcss=.value-total-MAINTAINABILITY*7h 25min*(+1h 58min)*
assertTextcss=.value-debt-SECURITY*5h 40min*(+1h 25min)*
assertTextcss=.value-total-SECURITY*7h 21min*(+1h 56min)*
assertTextcss=.value-debt-EFFICIENCY*1h 1min*(+21min)*
assertTextcss=.value-total-EFFICIENCY*1h 41min*(+31min)*
assertTextcss=.value-debt-CHANGEABILITY*40min*(+10min)*
assertTextcss=.value-total-CHANGEABILITY*40min*(+10min)*
assertTextcss=.value-debt-RELIABILITY*0*(+0)*
assertTextcss=.value-total-RELIABILITY*0*(+0)*
assertTextcss=.value-debt-TESTABILITY*0*(+0)*
assertTextcss=.value-total-TESTABILITY*0*(+0)*
- - diff --git a/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-have-correct-values.html b/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-have-correct-values.html deleted file mode 100644 index abfc0b053da..00000000000 --- a/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-have-correct-values.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - should-have-correct-values - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
should-have-correct-values
open/widget?id=technical_debt_pyramid&resource=com.sonarsource.it.samples:multi-modules-sample
assertTextblock_1*Reusability*Portability*Maintainability*Security*Efficiency*Changeability*Reliability*Testability*
assertTextcss=.value-debt-REUSABILITY*0*
assertTextcss=.value-total-REUSABILITY*7h 25min*
assertTextcss=.value-debt-PORTABILITY*0*
assertTextcss=.value-total-PORTABILITY*7h 25min*
assertTextcss=.value-debt-MAINTAINABILITY*4min*
assertTextcss=.value-total-MAINTAINABILITY*7h 25min*
assertTextcss=.value-debt-SECURITY*5h 40min*
assertTextcss=.value-total-SECURITY*7h 21min*
assertTextcss=.value-debt-EFFICIENCY*1h 1min*
assertTextcss=.value-total-EFFICIENCY*1h 41min*
assertTextcss=.value-debt-CHANGEABILITY*40min*
assertTextcss=.value-total-CHANGEABILITY*40min*
assertTextcss=.value-debt-RELIABILITY*0*
assertTextcss=.value-total-RELIABILITY*0*
assertTextcss=.value-debt-TESTABILITY*0*
assertTextcss=.value-total-TESTABILITY*0*
- - diff --git a/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-open-links-on-drilldown-service.html b/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-open-links-on-drilldown-service.html deleted file mode 100644 index fcbbb88282f..00000000000 --- a/it/it-tests/src/test/resources/debt/TechnicalDebtWidgetTest/technical-debt-pyramid/should-open-links-on-drilldown-service.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - should-open-links-on-drilldown-service - - - - - - - - - - - - - - - - - - - - - - - - - -
should-open-links-on-drilldown-service
open/widget?id=technical_debt_pyramid&resource=com.sonarsource.it.samples:multi-modules-sample
clickAndWaitcss=.link-debt-SECURITY
assertTextcontent*Technical Debt / Security*5h 40min*
- - diff --git a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/rule/XooRulesDefinitionTest.java b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/rule/XooRulesDefinitionTest.java index ab45f7130af..985bf936dff 100644 --- a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/rule/XooRulesDefinitionTest.java +++ b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/rule/XooRulesDefinitionTest.java @@ -46,7 +46,6 @@ public class XooRulesDefinitionTest { RulesDefinition.Rule rule = repo.rule(OneIssuePerLineSensor.RULE_KEY); assertThat(rule.name()).isNotEmpty(); - assertThat(rule.debtSubCharacteristic()).isEqualTo(RulesDefinition.SubCharacteristics.MEMORY_EFFICIENCY); assertThat(rule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR); assertThat(rule.debtRemediationFunction().coefficient()).isEqualTo("1min"); assertThat(rule.debtRemediationFunction().offset()).isNull(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java index 234ce90bcb8..c35f5b8a634 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java @@ -30,7 +30,6 @@ import org.sonar.server.computation.batch.BatchReportReaderImpl; import org.sonar.server.computation.component.DbIdsRepositoryImpl; import org.sonar.server.computation.component.SettingsRepositoryImpl; import org.sonar.server.computation.component.TreeRootHolderImpl; -import org.sonar.server.computation.debt.DebtModelHolderImpl; import org.sonar.server.computation.duplication.CrossProjectDuplicationStatusHolderImpl; import org.sonar.server.computation.duplication.DuplicationRepositoryImpl; import org.sonar.server.computation.duplication.IntegrateCrossProjectDuplications; @@ -132,7 +131,6 @@ public final class ReportComputeEngineContainerPopulator implements ContainerPop TreeRootHolderImpl.class, PeriodsHolderImpl.class, QualityGateHolderImpl.class, - DebtModelHolderImpl.class, SqaleRatingSettings.class, ActiveRulesHolderImpl.class, MeasureComputersHolderImpl.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/Characteristic.java b/server/sonar-server/src/main/java/org/sonar/server/computation/debt/Characteristic.java deleted file mode 100644 index c3b79cd7c55..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/Characteristic.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -import javax.annotation.CheckForNull; - -public interface Characteristic { - int getId(); - - String getKey(); - - @CheckForNull - Integer getParentId(); -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/CharacteristicImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/debt/CharacteristicImpl.java deleted file mode 100644 index 53b78381d59..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/CharacteristicImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; - -import static java.util.Objects.requireNonNull; - -@Immutable -public class CharacteristicImpl implements Characteristic { - private final int id; - private final String key; - private final Integer parentId; - - public CharacteristicImpl(int id, String key, @Nullable Integer parentId) { - this.key = requireNonNull(key, "key cannot be null"); - this.id = id; - this.parentId = parentId; - } - - @Override - public int getId() { - return id; - } - - @Override - public String getKey() { - return key; - } - - @Override - @CheckForNull - public Integer getParentId() { - return parentId; - } - - @Override - public boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - CharacteristicImpl that = (CharacteristicImpl) o; - return id == that.id && key.equals(that.key); - } - - @Override - public int hashCode() { - int result = id; - result = 31 * result + key.hashCode(); - return result; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("Characteristic{"); - sb.append("id=").append(id); - sb.append(", key='").append(key).append('\''); - sb.append(", parentId=").append(parentId); - sb.append('}'); - return sb.toString(); - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolder.java b/server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolder.java deleted file mode 100644 index f745fbbd7fa..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -import java.util.List; - -public interface DebtModelHolder { - - /** - * Return a characteristic by its id - * - * @throws IllegalStateException if no Characteristic with the specified id is found - * @throws IllegalStateException if the holder is not initialized yet - */ - Characteristic getCharacteristicById(int id); - - /** - * Check if a characteristic exists by its id - * - * @throws IllegalStateException if the holder is not initialized yet - */ - boolean hasCharacteristicById(int id); - - /** - * Return list of root characteristics - * - * @throws IllegalStateException if the holder is not initialized yet - */ - List getRootCharacteristics(); -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolderImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolderImpl.java deleted file mode 100644 index 9ba875771fa..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/DebtModelHolderImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; -import static java.util.Objects.requireNonNull; - -public class DebtModelHolderImpl implements MutableDebtModelHolder { - - private final List rootCharacteristics = new ArrayList<>(); - private final Map characteristicById = new HashMap<>(); - - @Override - public DebtModelHolderImpl addCharacteristics(Characteristic rootCharacteristic, Iterable subCharacteristics) { - requireNonNull(rootCharacteristic, "rootCharacteristic cannot be null"); - requireNonNull(subCharacteristics, "subCharacteristics cannot be null"); - checkArgument(subCharacteristics.iterator().hasNext(), "subCharacteristics cannot be empty"); - - rootCharacteristics.add(rootCharacteristic); - characteristicById.put(rootCharacteristic.getId(), rootCharacteristic); - for (Characteristic characteristic : subCharacteristics) { - characteristicById.put(characteristic.getId(), characteristic); - } - return this; - } - - @Override - public Characteristic getCharacteristicById(int id) { - checkInitialized(); - Characteristic characteristic = characteristicById.get(id); - if (characteristic == null) { - throw new IllegalStateException("Debt characteristic with id [" + id + "] does not exist"); - } - return characteristic; - } - - @Override - public boolean hasCharacteristicById(int id) { - return characteristicById.get(id) != null; - } - - @Override - public List getRootCharacteristics() { - checkInitialized(); - return rootCharacteristics; - } - - private void checkInitialized() { - checkState(!characteristicById.isEmpty(), "Characteristics have not been initialized yet"); - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/MutableDebtModelHolder.java b/server/sonar-server/src/main/java/org/sonar/server/computation/debt/MutableDebtModelHolder.java deleted file mode 100644 index d557a1c9146..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/MutableDebtModelHolder.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -public interface MutableDebtModelHolder extends DebtModelHolder { - - /** - * Sets the characteristics in the {@link DebtModelHolder}. - * - * @param rootCharacteristic a root {@link Characteristic}, can not be {@code null} - * @param subCharacteristics list of sub characteristics of the root characteristic, can not be {@code null} - * - * @throws NullPointerException if {@code rootCharacteristic} is {@code null} - * @throws NullPointerException if {@code subCharacteristics} is {@code null} - */ - MutableDebtModelHolder addCharacteristics(Characteristic rootCharacteristic, Iterable subCharacteristics); -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/package-info.java b/server/sonar-server/src/main/java/org/sonar/server/computation/debt/package-info.java deleted file mode 100644 index f8559e8a97b..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/debt/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -@ParametersAreNonnullByDefault -package org.sonar.server.computation.debt; - -import javax.annotation.ParametersAreNonnullByDefault; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtAggregator.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtAggregator.java index 0c49b239bdb..b29e33d48dd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtAggregator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtAggregator.java @@ -27,8 +27,6 @@ import javax.annotation.Nullable; import org.sonar.api.measures.CoreMetrics; import org.sonar.core.issue.DefaultIssue; import org.sonar.server.computation.component.Component; -import org.sonar.server.computation.debt.Characteristic; -import org.sonar.server.computation.debt.DebtModelHolder; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.metric.Metric; @@ -39,17 +37,15 @@ import static com.google.common.collect.Maps.newHashMap; public class DebtAggregator extends IssueVisitor { private final RuleRepository ruleRepository; - private final DebtModelHolder debtModelHolder; private final MetricRepository metricRepository; private final MeasureRepository measureRepository; private final Map debtsByComponentRef = new HashMap<>(); private Debt currentDebt; - public DebtAggregator(RuleRepository ruleRepository, DebtModelHolder debtModelHolder, + public DebtAggregator(RuleRepository ruleRepository, MetricRepository metricRepository, MeasureRepository measureRepository) { this.ruleRepository = ruleRepository; - this.debtModelHolder = debtModelHolder; this.metricRepository = metricRepository; this.measureRepository = measureRepository; } @@ -91,29 +87,12 @@ public class DebtAggregator extends IssueVisitor { measureRepository.add(component, metric, Measure.newMeasureBuilder().forRule(ruleId).create(ruleDebt)); } - // distribution by characteristic/sub-characteristic - for (Map.Entry entry : currentDebt.minutesByCharacteristicId.entrySet()) { - int characteristicId = entry.getKey(); - long characteristicDebt = entry.getValue(); - // debt can't be zero - measureRepository.add(component, metric, Measure.newMeasureBuilder().forCharacteristic(characteristicId).create(characteristicDebt)); - } - - if (!component.getType().isDeeperThan(Component.Type.MODULE)) { - for (Characteristic rootCharacteristic : debtModelHolder.getRootCharacteristics()) { - if (currentDebt.minutesByCharacteristicId.get(rootCharacteristic.getId()) == null) { - measureRepository.add(component, metric, Measure.newMeasureBuilder().forCharacteristic(rootCharacteristic.getId()).create(0L)); - } - } - } - this.currentDebt = null; } private class Debt { private long minutes = 0L; private final SumMap minutesByRuleId = new SumMap<>(); - private final SumMap minutesByCharacteristicId = new SumMap<>(); void add(DefaultIssue issue) { Long issueMinutes = issue.debtInMinutes(); @@ -122,23 +101,12 @@ public class DebtAggregator extends IssueVisitor { Rule rule = ruleRepository.getByKey(issue.ruleKey()); this.minutesByRuleId.add(rule.getId(), issueMinutes); - - Integer subCharacteristicId = rule.getSubCharacteristicId(); - if (subCharacteristicId != null) { - Characteristic characteristic = debtModelHolder.getCharacteristicById(subCharacteristicId); - this.minutesByCharacteristicId.add(characteristic.getId(), issueMinutes); - Integer characteristicParentId = characteristic.getParentId(); - if (characteristicParentId != null) { - this.minutesByCharacteristicId.add(characteristicParentId, issueMinutes); - } - } } } public void add(Debt debt) { this.minutes += debt.minutes; this.minutesByRuleId.add(debt.minutesByRuleId); - this.minutesByCharacteristicId.add(debt.minutesByCharacteristicId); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtCalculator.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtCalculator.java index a7128595a8a..beb4d1ad875 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtCalculator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DebtCalculator.java @@ -42,7 +42,7 @@ public class DebtCalculator { public Duration calculate(DefaultIssue issue) { Rule rule = ruleRepository.getByKey(issue.ruleKey()); DebtRemediationFunction fn = rule.getRemediationFunction(); - if (fn != null && rule.getSubCharacteristicId() != null) { + if (fn != null) { verifyEffortToFix(issue, fn); Duration debt = Duration.create(0); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/Rule.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/Rule.java index fda79adad80..b8573cb1442 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/Rule.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/Rule.java @@ -40,9 +40,6 @@ public interface Rule { */ Set getTags(); - @CheckForNull - Integer getSubCharacteristicId(); - @CheckForNull DebtRemediationFunction getRemediationFunction(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java index d21c7d8c50a..14cc9118a5d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java @@ -39,7 +39,6 @@ public class RuleImpl implements Rule { private final RuleKey key; private final String name; private final RuleStatus status; - private final Integer subCharacteristicId; private final Set tags; private final DebtRemediationFunction remediationFunction; @@ -48,7 +47,6 @@ public class RuleImpl implements Rule { this.key = dto.getKey(); this.name = dto.getName(); this.status = dto.getStatus(); - this.subCharacteristicId = dto.getEffectiveSubCharacteristicId(); this.tags = union(dto.getSystemTags(), dto.getTags()); this.remediationFunction = effectiveRemediationFunction(dto); } @@ -78,11 +76,6 @@ public class RuleImpl implements Rule { return tags; } - @Override - public Integer getSubCharacteristicId() { - return subCharacteristicId; - } - @Override public DebtRemediationFunction getRemediationFunction() { return remediationFunction; @@ -112,7 +105,6 @@ public class RuleImpl implements Rule { .add("key", key) .add("name", name) .add("status", status) - .add("subCharacteristicId", subCharacteristicId) .add("tags", tags) .toString(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepository.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepository.java index fd460ad89af..76bf4ab35a3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepository.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepository.java @@ -114,9 +114,6 @@ public final class MapBasedRawMeasureRepository implements MeasureRepository if (measure.getRuleId() != null) { return " and rule (id=" + measure.getRuleId() + ")"; } - if (measure.getCharacteristicId() != null) { - return " and Characteristic (id=" + measure.getCharacteristicId() + ")"; - } return ""; } @@ -153,7 +150,7 @@ public final class MapBasedRawMeasureRepository implements MeasureRepository if (measuresPerMetric == null) { return Optional.absent(); } - return Optional.fromNullable(measuresPerMetric.get(new MeasureKey(metric.getKey(), (Integer) null, null, null))); + return Optional.fromNullable(measuresPerMetric.get(new MeasureKey(metric.getKey(), null, null))); } private Optional find(Component component, Metric metric, Measure measure) { @@ -162,7 +159,7 @@ public final class MapBasedRawMeasureRepository implements MeasureRepository if (measuresPerMetric == null) { return Optional.absent(); } - return Optional.fromNullable(measuresPerMetric.get(new MeasureKey(metric.getKey(), measure.getRuleId(), measure.getCharacteristicId(), measure.getDeveloper()))); + return Optional.fromNullable(measuresPerMetric.get(new MeasureKey(metric.getKey(), measure.getRuleId(), measure.getDeveloper()))); } public void add(Component component, Metric metric, Measure measure, OverridePolicy overridePolicy) { @@ -177,7 +174,7 @@ public final class MapBasedRawMeasureRepository implements MeasureRepository measuresPerMetric = new HashMap<>(); measures.put(componentKey, measuresPerMetric); } - MeasureKey key = new MeasureKey(metric.getKey(), measure.getRuleId(), measure.getCharacteristicId(), measure.getDeveloper()); + MeasureKey key = new MeasureKey(metric.getKey(), measure.getRuleId(), measure.getDeveloper()); if (!measuresPerMetric.containsKey(key) || overridePolicy == OverridePolicy.OVERRIDE) { measuresPerMetric.put(key, measure); } @@ -200,12 +197,12 @@ public final class MapBasedRawMeasureRepository implements MeasureRepository } } - private enum ToMeasure implements Function, Measure> { + private enum ToMeasure implements Function, Measure> { INSTANCE; @Nullable @Override - public Measure apply(@Nonnull Map.Entry input) { + public Measure apply(@Nonnull Map.Entry input) { return input.getValue(); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java index 759d4fa0ef4..9a54acce1a3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java @@ -70,8 +70,6 @@ public final class Measure { @CheckForNull private final Integer ruleId; @CheckForNull - private final Integer characteristicId; - @CheckForNull private final Developer developer; @CheckForNull private final Double value; @@ -86,12 +84,11 @@ public final class Measure { @CheckForNull private final MeasureVariations variations; - private Measure(ValueType valueType, @Nullable Integer ruleId, @Nullable Integer characteristicId, @Nullable Developer developer, + private Measure(ValueType valueType, @Nullable Integer ruleId, @Nullable Developer developer, @Nullable Double value, @Nullable String data, @Nullable Level dataLevel, @Nullable String description, @Nullable QualityGateStatus qualityGateStatus, @Nullable MeasureVariations variations) { this.valueType = valueType; this.ruleId = ruleId; - this.characteristicId = characteristicId; this.developer = developer; this.value = value; this.data = data; @@ -110,10 +107,7 @@ public final class Measure { } public static final class NewMeasureBuilder { - private static final String RULE_AND_CHARACTERISTIC_ERROR_MSG = "A measure can not be associated to both a Characteristic and a Rule"; - private Integer ruleId; - private Integer characteristicId; private Developer developer; private String description; private QualityGateStatus qualityGateStatus; @@ -123,32 +117,12 @@ public final class Measure { * Sets the rule this measure is associated to. * * @throws UnsupportedOperationException if the characteristicId has already been set - * - * @see #forCharacteristic(int) */ public NewMeasureBuilder forRule(int ruleId) { - if (characteristicId != null) { - throw new UnsupportedOperationException(RULE_AND_CHARACTERISTIC_ERROR_MSG); - } this.ruleId = ruleId; return this; } - /** - * Sets the characteristic this measure is associated to. - * - * @throws UnsupportedOperationException if the ruleId has already been set - * - * @see #forCharacteristic(int) - */ - public NewMeasureBuilder forCharacteristic(int characteristicId) { - if (ruleId != null) { - throw new UnsupportedOperationException(RULE_AND_CHARACTERISTIC_ERROR_MSG); - } - this.characteristicId = characteristicId; - return this; - } - /** * Sets the developer this measure is associated to. * @@ -179,7 +153,7 @@ public final class Measure { } public Measure create(boolean value, @Nullable String data) { - return new Measure(ValueType.BOOLEAN, ruleId, characteristicId, developer, value ? 1.0d : 0.0d, data, null, description, qualityGateStatus, variations); + return new Measure(ValueType.BOOLEAN, ruleId, developer, value ? 1.0d : 0.0d, data, null, description, qualityGateStatus, variations); } public Measure create(boolean value) { @@ -187,7 +161,7 @@ public final class Measure { } public Measure create(int value, @Nullable String data) { - return new Measure(ValueType.INT, ruleId, characteristicId, developer, (double) value, data, null, description, qualityGateStatus, variations); + return new Measure(ValueType.INT, ruleId, developer, (double) value, data, null, description, qualityGateStatus, variations); } public Measure create(int value) { @@ -195,7 +169,7 @@ public final class Measure { } public Measure create(long value, @Nullable String data) { - return new Measure(ValueType.LONG, ruleId, characteristicId, developer, (double) value, data, null, description, qualityGateStatus, variations); + return new Measure(ValueType.LONG, ruleId, developer, (double) value, data, null, description, qualityGateStatus, variations); } public Measure create(long value) { @@ -205,7 +179,7 @@ public final class Measure { public Measure create(double value, int decimalScale, @Nullable String data) { checkArgument(!Double.isNaN(value), "NaN is not allowed as a Measure value"); double scaledValue = scale(value, decimalScale); - return new Measure(ValueType.DOUBLE, ruleId, characteristicId, developer, scaledValue, data, null, description, qualityGateStatus, variations); + return new Measure(ValueType.DOUBLE, ruleId, developer, scaledValue, data, null, description, qualityGateStatus, variations); } public Measure create(double value, int decimalScale) { @@ -213,15 +187,15 @@ public final class Measure { } public Measure create(String value) { - return new Measure(ValueType.STRING, ruleId, characteristicId, developer, null, requireNonNull(value), null, description, qualityGateStatus, variations); + return new Measure(ValueType.STRING, ruleId, developer, null, requireNonNull(value), null, description, qualityGateStatus, variations); } public Measure create(Level level) { - return new Measure(ValueType.LEVEL, ruleId, characteristicId, developer, null, null, requireNonNull(level), description, qualityGateStatus, variations); + return new Measure(ValueType.LEVEL, ruleId, developer, null, null, requireNonNull(level), description, qualityGateStatus, variations); } public Measure createNoValue() { - return new Measure(ValueType.NO_VALUE, ruleId, characteristicId, developer, null, null, null, description, qualityGateStatus, variations); + return new Measure(ValueType.NO_VALUE, ruleId, developer, null, null, null, description, qualityGateStatus, variations); } private static double scale(double value, int decimalScale) { @@ -268,7 +242,7 @@ public final class Measure { } public Measure create() { - return new Measure(source.valueType, source.ruleId, source.characteristicId, source.developer, + return new Measure(source.valueType, source.ruleId, source.developer, source.value, source.data, source.dataLevel, source.description, source.qualityGateStatus == null ? qualityGateStatus : source.qualityGateStatus, @@ -281,11 +255,6 @@ public final class Measure { return ruleId; } - @CheckForNull - public Integer getCharacteristicId() { - return characteristicId; - } - @CheckForNull public Developer getDeveloper() { return developer; @@ -436,13 +405,12 @@ public final class Measure { } Measure measure = (Measure) o; return Objects.equals(ruleId, measure.ruleId) && - Objects.equals(characteristicId, measure.characteristicId) && Objects.equals(developer, measure.developer); } @Override public int hashCode() { - return Objects.hash(ruleId, characteristicId, developer); + return Objects.hash(ruleId, developer); } @Override @@ -450,7 +418,6 @@ public final class Measure { return com.google.common.base.Objects.toStringHelper(this) .add("valueType", valueType) .add("ruleId", ruleId) - .add("characteristicId", characteristicId) .add("developer", developer) .add("value", value) .add("data", data) diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java index f07cb1d1032..9cae7ec05b6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java @@ -123,11 +123,6 @@ public class MeasureDtoToMeasure { if (ruleId != null) { builder.forRule(ruleId); } - Integer characteristicId = measureDto.getCharacteristicId(); - if (characteristicId != null) { - builder.forCharacteristic(characteristicId); - } - return builder; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureKey.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureKey.java index 94639c04b8d..fb1100db72f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureKey.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureKey.java @@ -34,24 +34,18 @@ public final class MeasureKey { private final String metricKey; private final int ruleId; - private final int characteristicId; @CheckForNull private final Developer developer; - public MeasureKey(String metricKey, @Nullable Integer ruleId, @Nullable Integer characteristicId, @Nullable Developer developer) { + public MeasureKey(String metricKey, @Nullable Integer ruleId, @Nullable Developer developer) { // defensive code in case we badly chose the default value, we want to know it right away! checkArgument(ruleId == null || ruleId != DEFAULT_INT_VALUE, "Unsupported rule id"); - checkArgument(characteristicId == null || characteristicId != DEFAULT_INT_VALUE, "Unsupported characteristic id"); this.metricKey = requireNonNull(metricKey, "MetricKey can not be null"); this.ruleId = ruleId == null ? DEFAULT_INT_VALUE : ruleId; - this.characteristicId = characteristicId == null ? DEFAULT_INT_VALUE : characteristicId; this.developer = developer; } - public int getCharacteristicId() { - return characteristicId; - } public String getMetricKey() { return metricKey; @@ -77,13 +71,12 @@ public final class MeasureKey { MeasureKey that = (MeasureKey) o; return metricKey.equals(that.metricKey) && ruleId == that.ruleId - && characteristicId == that.characteristicId && developer == that.developer; } @Override public int hashCode() { - return Objects.hash(metricKey, ruleId, characteristicId); + return Objects.hash(metricKey, ruleId); } @Override @@ -91,7 +84,6 @@ public final class MeasureKey { return "MeasureKey{" + "metricKey='" + metricKey + '\'' + ", ruleId=" + ruleId + - ", characteristicId=" + characteristicId + ", developer=" + developer + '}'; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureRepositoryImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureRepositoryImpl.java index fb2ea664f2a..d9facc5fd67 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureRepositoryImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureRepositoryImpl.java @@ -68,7 +68,6 @@ public class MeasureRepositoryImpl implements MeasureRepository { MeasureDto measureDto = dbClient.measureDao().selectByComponentKeyAndMetricKey(dbSession, component.getKey(), metric.getKey()); Optional measureOptional = underTest.toMeasure(measureDto, metric); if (measureOptional.isPresent()) { - checkArgument(measureOptional.get().getCharacteristicId() == null, "Measures with characteristicId are not supported"); checkArgument(measureOptional.get().getRuleId() == null, "Measures with ruleId are not supported"); } return measureOptional; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureToMeasureDto.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureToMeasureDto.java index 27bd54260fc..f2b23b0ab32 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureToMeasureDto.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureToMeasureDto.java @@ -41,7 +41,6 @@ public class MeasureToMeasureDto { out.setMetricId(metric.getId()); out.setComponentId(dbIdsRepository.getComponentId(component)); out.setSnapshotId(dbIdsRepository.getSnapshotId(component)); - out.setCharacteristicId(measure.getCharacteristicId()); out.setRuleId(measure.getRuleId()); if (measure.hasVariations()) { setVariations(out, measure.getVariations()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeMeasureVariationsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeMeasureVariationsStep.java index 4930fe92fa9..9bb93cdf548 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeMeasureVariationsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeMeasureVariationsStep.java @@ -71,7 +71,7 @@ public class ComputeMeasureVariationsStep implements ComputationStep { @Override public MeasureKey apply(@Nonnull PastMeasureDto input) { Metric metric = metricRepository.getById(input.getMetricId()); - return new MeasureKey(metric.getKey(), input.getCharacteristicId(), input.getRuleId(), null); + return new MeasureKey(metric.getKey(), input.getRuleId(), null); } }; @@ -146,7 +146,7 @@ public class ComputeMeasureVariationsStep implements ComputationStep { for (Map.Entry entry : from(measureRepository.getRawMeasures(component).entries()).filter(NotDeveloperMeasure.INSTANCE)) { String metricKey = entry.getKey(); Measure measure = entry.getValue(); - PastMeasureDto pastMeasure = pastMeasuresByMeasureKey.get(new MeasureKey(metricKey, measure.getCharacteristicId(), measure.getRuleId(), null)); + PastMeasureDto pastMeasure = pastMeasuresByMeasureKey.get(new MeasureKey(metricKey, measure.getRuleId(), null)); if (pastMeasure != null && pastMeasure.hasValue()) { Metric metric = metricByKeys.get(metricKey); measuresWithVariationRepository.add(metric, measure, period, computeVariation(measure, pastMeasure.getValue())); @@ -176,7 +176,7 @@ public class ComputeMeasureVariationsStep implements ComputationStep { public void add(Metric metric, final Measure measure, int variationIndex, double variationValue) { checkArgument(measure.getDeveloper() == null, "%s does not support computing variations of Measures for Developer", getClass().getSimpleName()); - MeasureKey measureKey = new MeasureKey(metric.getKey(), measure.getCharacteristicId(), measure.getRuleId(), null); + MeasureKey measureKey = new MeasureKey(metric.getKey(), measure.getRuleId(), null); MeasureWithVariations measureWithVariations = measuresWithVariations.get(measureKey); if (measureWithVariations == null) { measureWithVariations = new MeasureWithVariations(metric, measure); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/LoadDebtModelStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/LoadDebtModelStep.java deleted file mode 100644 index 3d844160a8b..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/LoadDebtModelStep.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.step; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import org.sonar.db.DbClient; -import org.sonar.db.DbSession; -import org.sonar.db.debt.CharacteristicDto; -import org.sonar.server.computation.debt.Characteristic; -import org.sonar.server.computation.debt.CharacteristicImpl; -import org.sonar.server.computation.debt.MutableDebtModelHolder; - -import static com.google.common.base.Predicates.not; -import static com.google.common.collect.FluentIterable.from; - -/** - * Populates the {@link org.sonar.server.computation.debt.DebtModelHolder} - */ -public class LoadDebtModelStep implements ComputationStep { - - private final DbClient dbClient; - private final MutableDebtModelHolder mutableDebtModelHolder; - - public LoadDebtModelStep(DbClient dbClient, MutableDebtModelHolder mutableDebtModelHolder) { - this.dbClient = dbClient; - this.mutableDebtModelHolder = mutableDebtModelHolder; - } - - @Override - public void execute() { - DbSession session = dbClient.openSession(false); - try { - feedDebtModel(session); - } finally { - session.close(); - } - } - - private void feedDebtModel(DbSession session) { - List characteristicDtos = dbClient.debtCharacteristicDao().selectEnabledCharacteristics(session); - Map rootCharacteristicsById = from(characteristicDtos) - .filter(IsRootPredicate.INSTANCE) - .uniqueIndex(CharacteristicDtoToId.INSTANCE); - - for (Map.Entry> entry : from(characteristicDtos) - .filter(not(IsRootPredicate.INSTANCE)) - .index(CharacteristicDtoToParentId.INSTANCE) - .asMap().entrySet()) { - mutableDebtModelHolder.addCharacteristics( - toCharacteristic(rootCharacteristicsById.get(entry.getKey())), - from(entry.getValue()).transform(CharacteristicDtoToCharacteristic.INSTANCE) - ); - } - } - - private static Characteristic toCharacteristic(CharacteristicDto dto) { - return new CharacteristicImpl(dto.getId(), dto.getKey(), dto.getParentId()); - } - - private enum CharacteristicDtoToId implements Function { - INSTANCE; - - @Nullable - @Override - public Integer apply(@Nonnull CharacteristicDto dto) { - return dto.getId(); - } - } - - private enum CharacteristicDtoToCharacteristic implements Function { - INSTANCE; - - @Nullable - @Override - public Characteristic apply(@Nonnull CharacteristicDto characteristicDto) { - return toCharacteristic(characteristicDto); - } - } - - private enum CharacteristicDtoToParentId implements Function { - INSTANCE; - - @Nullable - @Override - public Integer apply(@Nonnull CharacteristicDto characteristicDto) { - Integer parentId = characteristicDto.getParentId(); - return parentId == null ? characteristicDto.getId() : parentId; - } - } - - private enum IsRootPredicate implements Predicate { - INSTANCE; - - @Override - public boolean apply(@Nonnull CharacteristicDto characteristicDto) { - return characteristicDto.getParentId() == null; - } - } - - @Override - public String getDescription() { - return "Load debt model"; - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java index 0c609dd251f..5baf2e59f27 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java @@ -42,7 +42,6 @@ public class ReportComputationSteps extends AbstractComputationSteps { BuildComponentTreeStep.class, ValidateProjectStep.class, - LoadDebtModelStep.class, LoadQualityProfilesStep.class, // load project related stuffs diff --git a/server/sonar-server/src/main/java/org/sonar/server/dashboard/widget/TechnicalDebtPyramidWidget.java b/server/sonar-server/src/main/java/org/sonar/server/dashboard/widget/TechnicalDebtPyramidWidget.java deleted file mode 100644 index 02306f78c66..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/dashboard/widget/TechnicalDebtPyramidWidget.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.dashboard.widget; - -import org.sonar.api.web.UserRole; -import org.sonar.api.web.WidgetCategory; - -@UserRole(UserRole.USER) -@WidgetCategory("Technical Debt") -public final class TechnicalDebtPyramidWidget extends CoreWidget { - - public TechnicalDebtPyramidWidget() { - super("technical_debt_pyramid", "Technical Debt Pyramid", "/org/sonar/server/dashboard/widget/technical_debt_pyramid.html.erb"); - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtCharacteristicsXMLImporter.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtCharacteristicsXMLImporter.java deleted file mode 100644 index 260424f3f28..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtCharacteristicsXMLImporter.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import java.io.Reader; -import java.io.StringReader; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import org.apache.commons.lang.StringUtils; -import org.codehaus.stax2.XMLInputFactory2; -import org.codehaus.staxmate.SMInputFactory; -import org.codehaus.staxmate.in.SMHierarchicCursor; -import org.codehaus.staxmate.in.SMInputCursor; -import org.sonar.api.server.ServerSide; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; -import org.sonar.api.server.rule.RulesDefinition; -import org.sonar.server.debt.DebtModelXMLExporter.DebtModel; - -import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC; -import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC_KEY; -import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC_NAME; - -/** - * Import characteristics from an xml - */ -@ServerSide -public class DebtCharacteristicsXMLImporter { - - public DebtModel importXML(String xml) { - return importXML(new StringReader(xml)); - } - - public DebtModel importXML(Reader xml) { - DebtModel debtModel = new DebtModel(); - try { - SMInputFactory inputFactory = initStax(); - SMHierarchicCursor cursor = inputFactory.rootElementCursor(xml); - - // advance to - cursor.advance(); - SMInputCursor chcCursor = cursor.childElementCursor(CHARACTERISTIC); - - while (chcCursor.getNext() != null) { - process(debtModel, null, chcCursor); - } - - cursor.getStreamReader().closeCompletely(); - - } catch (XMLStreamException e) { - throw new IllegalStateException("XML is not valid", e); - } - return debtModel; - } - - private static SMInputFactory initStax() { - XMLInputFactory xmlFactory = XMLInputFactory2.newInstance(); - xmlFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE); - xmlFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE); - xmlFactory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); - xmlFactory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.FALSE); - return new SMInputFactory(xmlFactory); - } - - @CheckForNull - private static void process(DebtModel debtModel, @Nullable String parent, SMInputCursor chcCursor) throws XMLStreamException { - DefaultDebtCharacteristic characteristic = new DefaultDebtCharacteristic(); - SMInputCursor cursor = chcCursor.childElementCursor(); - while (cursor.getNext() != null) { - String node = cursor.getLocalName(); - if (StringUtils.equals(node, CHARACTERISTIC_KEY)) { - characteristic.setKey(convertKey(cursor.collectDescendantText().trim())); - if (parent == null) { - characteristic.setOrder(debtModel.rootCharacteristics().size() + 1); - debtModel.addRootCharacteristic(characteristic); - } else { - debtModel.addSubCharacteristic(characteristic, parent); - } - - } else if (StringUtils.equals(node, CHARACTERISTIC_NAME)) { - characteristic.setName(cursor.collectDescendantText().trim()); - - // can contain characteristics or requirements - } else if (StringUtils.equals(node, CHARACTERISTIC)) { - process(debtModel, characteristic.key(), cursor); - } - } - } - - static String convertKey(String key) { - if ("NETWORK_USE_EFFICIENCY".equals(key)) { - return RulesDefinition.SubCharacteristics.NETWORK_USE; - } - return key; - } - -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java index e7b2c198274..0f73e6d850c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java +++ b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java @@ -19,22 +19,16 @@ */ package org.sonar.server.debt; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; -import java.io.Reader; import java.util.Date; import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.ObjectUtils; import org.sonar.api.rule.RuleKey; import org.sonar.api.server.ServerSide; -import org.sonar.api.server.debt.DebtCharacteristic; import org.sonar.api.server.debt.DebtRemediationFunction; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.System2; import org.sonar.api.utils.ValidationMessages; @@ -43,14 +37,9 @@ import org.sonar.api.utils.log.Loggers; import org.sonar.core.permission.GlobalPermissions; import org.sonar.db.DbSession; import org.sonar.db.MyBatis; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.db.rule.RuleDto; import org.sonar.server.db.DbClient; -import org.sonar.server.debt.DebtModelXMLExporter.DebtModel; import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt; -import org.sonar.server.debt.DebtPredicates.CharacteristicDtoMatchKey; -import org.sonar.server.debt.DebtPredicates.CharacteristicDtoParentIdMatchId; -import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.rule.RuleDefinitionsLoader; import org.sonar.server.rule.RuleOperations; import org.sonar.server.user.UserSession; @@ -63,24 +52,18 @@ public class DebtModelBackup { private static final Logger LOG = Loggers.get(DebtModelBackup.class); private final DbClient dbClient; - private final DebtModelOperations debtModelOperations; private final RuleOperations ruleOperations; - private final DebtModelPluginRepository debtModelPluginRepository; - private final DebtCharacteristicsXMLImporter characteristicsXMLImporter; private final DebtRulesXMLImporter rulesXMLImporter; private final DebtModelXMLExporter debtModelXMLExporter; private final RuleDefinitionsLoader defLoader; private final System2 system2; private final UserSession userSession; - public DebtModelBackup(DbClient dbClient, DebtModelOperations debtModelOperations, RuleOperations ruleOperations, - DebtModelPluginRepository debtModelPluginRepository, DebtCharacteristicsXMLImporter characteristicsXMLImporter, DebtRulesXMLImporter rulesXMLImporter, + public DebtModelBackup(DbClient dbClient, RuleOperations ruleOperations, + DebtRulesXMLImporter rulesXMLImporter, DebtModelXMLExporter debtModelXMLExporter, RuleDefinitionsLoader defLoader, System2 system2, UserSession userSession) { this.dbClient = dbClient; - this.debtModelOperations = debtModelOperations; this.ruleOperations = ruleOperations; - this.debtModelPluginRepository = debtModelPluginRepository; - this.characteristicsXMLImporter = characteristicsXMLImporter; this.rulesXMLImporter = rulesXMLImporter; this.debtModelXMLExporter = debtModelXMLExporter; this.defLoader = defLoader; @@ -101,27 +84,16 @@ public class DebtModelBackup { DbSession session = dbClient.openSession(false); try { - DebtModel debtModel = new DebtModel(); - List characteristicDtos = dbClient.debtCharacteristicDao().selectEnabledCharacteristics(session); - for (CharacteristicDto characteristicDto : characteristicDtos) { - if (characteristicDto.getParentId() == null) { - debtModel.addRootCharacteristic(toDebtCharacteristic(characteristicDto)); - for (CharacteristicDto sub : subCharacteristics(characteristicDto.getId(), characteristicDtos)) { - debtModel.addSubCharacteristic(toDebtCharacteristic(sub), characteristicDto.getKey()); - } - } - } - List rules = newArrayList(); - for (RuleDto rule : dbClient.deprecatedRuleDao().selectEnabledAndNonManual(session)) { + for (RuleDto rule : dbClient.ruleDao().selectEnabledAndNonManual(session)) { if (languageKey == null || languageKey.equals(rule.getLanguage())) { - RuleDebt ruleDebt = toRuleDebt(rule, debtModel); + RuleDebt ruleDebt = toRuleDebt(rule); if (ruleDebt != null) { rules.add(ruleDebt); } } } - return debtModelXMLExporter.export(debtModel, rules); + return debtModelXMLExporter.export(rules); } finally { MyBatis.closeQuietly(session); } @@ -136,11 +108,8 @@ public class DebtModelBackup { Date updateDate = new Date(system2.now()); DbSession session = dbClient.openSession(false); try { - // Restore characteristics - List allCharacteristicDtos = restoreCharacteristics(session, loadModelFromPlugin(DebtModelPluginRepository.DEFAULT_MODEL), updateDate); - // Restore rules - List ruleDtos = dbClient.deprecatedRuleDao().selectEnabledAndNonManual(session); + List ruleDtos = dbClient.ruleDao().selectEnabledAndNonManual(session); if (!ruleDtos.isEmpty()) { // Load default rule definitions @@ -150,7 +119,7 @@ public class DebtModelBackup { rules.addAll(repoDef.rules()); } - resetRules(ruleDtos, rules, allCharacteristicDtos, updateDate, session); + resetRules(ruleDtos, rules, updateDate, session); } session.commit(); @@ -159,7 +128,7 @@ public class DebtModelBackup { } } - private void resetRules(List ruleDtos, List rules, List allCharacteristicDtos, Date updateDate, DbSession session) { + private void resetRules(List ruleDtos, List rules, Date updateDate, DbSession session) { for (RuleDto rule : ruleDtos) { // Restore default debt definitions @@ -173,19 +142,15 @@ public class DebtModelBackup { } if (ruleDef != null) { - String subCharacteristicKey = ruleDef.debtSubCharacteristic(); - CharacteristicDto subCharacteristicDto = characteristicByKey(subCharacteristicKey, allCharacteristicDtos, false); DebtRemediationFunction remediationFunction = ruleDef.debtRemediationFunction(); - boolean hasDebtDefinition = subCharacteristicDto != null && remediationFunction != null; + boolean hasDebtDefinition = remediationFunction != null; - rule.setDefaultSubCharacteristicId(hasDebtDefinition ? subCharacteristicDto.getId() : null); rule.setDefaultRemediationFunction(hasDebtDefinition ? remediationFunction.type().name() : null); rule.setDefaultRemediationCoefficient(hasDebtDefinition ? remediationFunction.coefficient() : null); rule.setDefaultRemediationOffset(hasDebtDefinition ? remediationFunction.offset() : null); } // Reset overridden debt definitions - rule.setSubCharacteristicId(null); rule.setRemediationFunction(null); rule.setRemediationCoefficient(null); rule.setRemediationOffset(null); @@ -215,8 +180,7 @@ public class DebtModelBackup { Date updateDate = new Date(system2.now()); DbSession session = dbClient.openSession(false); try { - List allCharacteristicDtos = restoreCharacteristics(session, characteristicsXMLImporter.importXML(xml), updateDate); - restoreRules(allCharacteristicDtos, rules(languageKey, session), rulesXMLImporter.importXML(xml, validationMessages), validationMessages, updateDate, session); + restoreRules(rules(languageKey, session), rulesXMLImporter.importXML(xml, validationMessages), validationMessages, updateDate, session); session.commit(); } catch (IllegalArgumentException e) { @@ -228,13 +192,11 @@ public class DebtModelBackup { return validationMessages; } - private void restoreRules(List allCharacteristicDtos, List rules, List ruleDebts, + private void restoreRules(List rules, List ruleDebts, ValidationMessages validationMessages, Date updateDate, DbSession session) { for (RuleDto rule : rules) { RuleDebt ruleDebt = ruleDebt(rule.getRepositoryKey(), rule.getRuleKey(), ruleDebts); - String subCharacteristicKey = ruleDebt != null ? ruleDebt.subCharacteristicKey() : null; - CharacteristicDto subCharacteristicDto = subCharacteristicKey != null ? characteristicByKey(ruleDebt.subCharacteristicKey(), allCharacteristicDtos, true) : null; - ruleOperations.updateRule(rule, subCharacteristicDto, + ruleOperations.updateRule(rule, ruleDebt != null ? ruleDebt.function() : null, ruleDebt != null ? ruleDebt.coefficient() : null, ruleDebt != null ? ruleDebt.offset() : null, session); @@ -247,68 +209,12 @@ public class DebtModelBackup { } } - @VisibleForTesting - List restoreCharacteristics(DbSession session, DebtModel targetModel, Date updateDate) { - List sourceCharacteristics = dbClient.debtCharacteristicDao().selectEnabledCharacteristics(session); - - List result = newArrayList(); - - // Create new characteristics - for (DebtCharacteristic characteristic : targetModel.rootCharacteristics()) { - CharacteristicDto rootCharacteristicDto = restoreCharacteristic(characteristic, null, sourceCharacteristics, updateDate, session); - result.add(rootCharacteristicDto); - for (DebtCharacteristic subCharacteristic : targetModel.subCharacteristics(characteristic.key())) { - result.add(restoreCharacteristic(subCharacteristic, rootCharacteristicDto.getId(), sourceCharacteristics, updateDate, session)); - } - } - // Disable no more existing characteristics - for (CharacteristicDto sourceCharacteristic : sourceCharacteristics) { - if (targetModel.characteristicByKey(sourceCharacteristic.getKey()) == null) { - debtModelOperations.delete(sourceCharacteristic, updateDate, session); - } - } - return result; - } - - private CharacteristicDto restoreCharacteristic(DebtCharacteristic targetCharacteristic, @Nullable Integer parentId, List sourceCharacteristics, - Date updateDate, DbSession session) { - CharacteristicDto sourceCharacteristic = characteristicByKey(targetCharacteristic.key(), sourceCharacteristics, false); - if (sourceCharacteristic == null) { - CharacteristicDto newCharacteristic = toDto(targetCharacteristic, parentId).setCreatedAt(updateDate); - dbClient.debtCharacteristicDao().insert(session, newCharacteristic); - return newCharacteristic; - } else { - // Update only if modifications - if (ObjectUtils.notEqual(sourceCharacteristic.getName(), targetCharacteristic.name()) || - ObjectUtils.notEqual(sourceCharacteristic.getOrder(), targetCharacteristic.order()) || - ObjectUtils.notEqual(sourceCharacteristic.getParentId(), parentId)) { - sourceCharacteristic.setName(targetCharacteristic.name()); - sourceCharacteristic.setOrder(targetCharacteristic.order()); - sourceCharacteristic.setParentId(parentId); - sourceCharacteristic.setUpdatedAt(updateDate); - dbClient.debtCharacteristicDao().update(sourceCharacteristic, session); - } - return sourceCharacteristic; - } - } - - private DebtModel loadModelFromPlugin(String pluginKey) { - Reader xmlFileReader = null; - try { - xmlFileReader = debtModelPluginRepository.createReaderForXMLFile(pluginKey); - return characteristicsXMLImporter.importXML(xmlFileReader); - } finally { - IOUtils.closeQuietly(xmlFileReader); - } - } - private List rules(@Nullable String languageKey, DbSession session) { - List rules = dbClient.deprecatedRuleDao().selectEnabledAndNonManual(session); + List rules = dbClient.ruleDao().selectEnabledAndNonManual(session); if (languageKey == null) { return rules; - } else { - return newArrayList(Iterables.filter(rules, new RuleDtoMatchLanguage(languageKey))); } + return newArrayList(Iterables.filter(rules, new RuleDtoMatchLanguage(languageKey))); } @CheckForNull @@ -328,68 +234,25 @@ public class DebtModelBackup { return Iterables.find(rules, new RuleDefMatchRuleRepoAndRuleKey(ruleRepo, ruleKey), null); } - private static CharacteristicDto characteristicByKey(@Nullable final String key, List characteristicDtos, boolean failIfNotFound) { - if (key == null) { - return null; - } - CharacteristicDto dto = Iterables.find(characteristicDtos, new CharacteristicDtoMatchKey(key), null); - if (dto == null && failIfNotFound) { - throw new NotFoundException(String.format("Characteristic '%s' has not been found", key)); - } - return dto; - } - - private static List subCharacteristics(Integer parentId, List allCharacteristics) { - return newArrayList(Iterables.filter(allCharacteristics, new CharacteristicDtoParentIdMatchId(parentId))); - } - @CheckForNull - private static RuleDebt toRuleDebt(RuleDto rule, DebtModel debtModel) { + private static RuleDebt toRuleDebt(RuleDto rule) { RuleDebt ruleDebt = new RuleDebt().setRuleKey(RuleKey.of(rule.getRepositoryKey(), rule.getRuleKey())); - Integer effectiveSubCharacteristicId = rule.getEffectiveSubCharacteristicId(); - DebtCharacteristic subCharacteristic = effectiveSubCharacteristicId != null ? debtModel.characteristicById(effectiveSubCharacteristicId) : null; - if (subCharacteristic != null) { - ruleDebt.setSubCharacteristicKey(subCharacteristic.key()); - - String overriddenFunction = rule.getRemediationFunction(); - String defaultFunction = rule.getDefaultRemediationFunction(); - if (overriddenFunction != null) { - ruleDebt.setFunction(overriddenFunction); - ruleDebt.setCoefficient(rule.getRemediationCoefficient()); - ruleDebt.setOffset(rule.getRemediationOffset()); - return ruleDebt; - } else if (defaultFunction != null) { - ruleDebt.setFunction(defaultFunction); - ruleDebt.setCoefficient(rule.getDefaultRemediationCoefficient()); - ruleDebt.setOffset(rule.getDefaultRemediationOffset()); - return ruleDebt; - } + String overriddenFunction = rule.getRemediationFunction(); + String defaultFunction = rule.getDefaultRemediationFunction(); + if (overriddenFunction != null) { + ruleDebt.setFunction(overriddenFunction); + ruleDebt.setCoefficient(rule.getRemediationCoefficient()); + ruleDebt.setOffset(rule.getRemediationOffset()); + return ruleDebt; + } else if (defaultFunction != null) { + ruleDebt.setFunction(defaultFunction); + ruleDebt.setCoefficient(rule.getDefaultRemediationCoefficient()); + ruleDebt.setOffset(rule.getDefaultRemediationOffset()); + return ruleDebt; } return null; } - private static CharacteristicDto toDto(DebtCharacteristic characteristic, @Nullable Integer parentId) { - return new CharacteristicDto() - .setKey(characteristic.key()) - .setName(characteristic.name()) - .setOrder(characteristic.order()) - .setParentId(parentId) - .setEnabled(true) - .setCreatedAt(((DefaultDebtCharacteristic) characteristic).createdAt()) - .setUpdatedAt(((DefaultDebtCharacteristic) characteristic).updatedAt()); - } - - private static DebtCharacteristic toDebtCharacteristic(CharacteristicDto characteristic) { - return new DefaultDebtCharacteristic() - .setId(characteristic.getId()) - .setKey(characteristic.getKey()) - .setName(characteristic.getName()) - .setOrder(characteristic.getOrder()) - .setParentId(characteristic.getParentId()) - .setCreatedAt(characteristic.getCreatedAt()) - .setUpdatedAt(characteristic.getUpdatedAt()); - } - private void checkPermission() { userSession.checkPermission(GlobalPermissions.SYSTEM_ADMIN); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelLookup.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelLookup.java deleted file mode 100644 index 9e9dfbbd561..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelLookup.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import com.google.common.collect.Iterables; -import java.util.Collection; -import java.util.List; -import javax.annotation.CheckForNull; -import org.sonar.api.server.ServerSide; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; - -import static com.google.common.collect.Lists.newArrayList; -import static org.sonar.server.debt.DebtPredicates.ToDebtCharacteristic.INSTANCE; -import static org.sonar.server.debt.DebtPredicates.toDebtCharacteristic; - -@ServerSide -public class DebtModelLookup { - - private final CharacteristicDao dao; - - public DebtModelLookup(CharacteristicDao dao) { - this.dao = dao; - } - - public List rootCharacteristics() { - return toCharacteristics(dao.selectEnabledRootCharacteristics()); - } - - public List allCharacteristics() { - return toCharacteristics(dao.selectEnabledCharacteristics()); - } - - @CheckForNull - public DebtCharacteristic characteristicById(int id) { - CharacteristicDto dto = dao.selectById(id); - return dto != null ? toDebtCharacteristic(dto) : null; - } - - @CheckForNull - public DebtCharacteristic characteristicByKey(String key) { - CharacteristicDto dto = dao.selectByKey(key); - return dto != null ? toDebtCharacteristic(dto) : null; - } - - private static List toCharacteristics(Collection dtos) { - return newArrayList(Iterables.transform(dtos, INSTANCE)); - } - -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelOperations.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelOperations.java deleted file mode 100644 index 6c8c76adaa0..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelOperations.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import com.google.common.collect.Iterables; -import java.util.Date; -import java.util.List; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.apache.ibatis.session.SqlSession; -import org.sonar.api.server.ServerSide; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; -import org.sonar.api.utils.System2; -import org.sonar.core.permission.GlobalPermissions; -import org.sonar.db.DbSession; -import org.sonar.db.MyBatis; -import org.sonar.db.debt.CharacteristicDto; -import org.sonar.db.rule.RuleDto; -import org.sonar.server.db.DbClient; -import org.sonar.server.debt.DebtPredicates.CharacteristicDtoMatchKey; -import org.sonar.server.exceptions.BadRequestException; -import org.sonar.server.exceptions.NotFoundException; -import org.sonar.server.user.UserSession; -import org.sonar.server.util.Validation; - -@ServerSide -public class DebtModelOperations { - - private final DbClient dbClient; - private final System2 system2; - private final UserSession userSession; - - public DebtModelOperations(DbClient dbClient, System2 system2, UserSession userSession) { - this.dbClient = dbClient; - this.system2 = system2; - this.userSession = userSession; - } - - public DebtCharacteristic create(String name, @Nullable Integer parentId) { - checkPermission(); - - SqlSession session = dbClient.openSession(false); - try { - checkNotAlreadyExists(name, session); - - CharacteristicDto newCharacteristic = new CharacteristicDto() - .setKey(name.toUpperCase().replace(" ", "_")) - .setName(name) - .setEnabled(true) - .setCreatedAt(new Date(system2.now())); - - // New sub characteristic - if (parentId != null) { - CharacteristicDto parent = findCharacteristic(parentId, session); - if (parent.getParentId() != null) { - throw new BadRequestException("A sub characteristic can not have a sub characteristic as parent."); - } - newCharacteristic.setParentId(parent.getId()); - } else { - // New root characteristic - newCharacteristic.setOrder(dbClient.debtCharacteristicDao().selectMaxCharacteristicOrder(session) + 1); - } - dbClient.debtCharacteristicDao().insert(session, newCharacteristic); - session.commit(); - return toCharacteristic(newCharacteristic); - } finally { - MyBatis.closeQuietly(session); - } - } - - public DebtCharacteristic rename(int characteristicId, String newName) { - checkPermission(); - - SqlSession session = dbClient.openSession(false); - try { - checkNotAlreadyExists(newName, session); - - CharacteristicDto dto = findCharacteristic(characteristicId, session); - if (!dto.getName().equals(newName)) { - dto.setName(newName); - dto.setUpdatedAt(new Date(system2.now())); - dbClient.debtCharacteristicDao().update(dto, session); - session.commit(); - } - return toCharacteristic(dto); - } finally { - MyBatis.closeQuietly(session); - } - } - - public DebtCharacteristic moveUp(int characteristicId) { - return move(characteristicId, true); - } - - public DebtCharacteristic moveDown(int characteristicId) { - return move(characteristicId, false); - } - - private DebtCharacteristic move(int characteristicId, boolean moveUpOrDown) { - checkPermission(); - - SqlSession session = dbClient.openSession(false); - try { - final CharacteristicDto dto = findCharacteristic(characteristicId, session); - if (dto.getParentId() != null) { - throw new BadRequestException("Sub characteristics can not be moved."); - } - int currentOrder = getOrder(dto); - CharacteristicDto dtoToSwitchOrderWith = findCharacteristicToSwitchWith(dto, moveUpOrDown, session); - - // Do nothing when characteristic is already to the good location - if (dtoToSwitchOrderWith == null) { - return toCharacteristic(dto); - } - - int nextOrder = getOrder(dtoToSwitchOrderWith); - dtoToSwitchOrderWith.setOrder(currentOrder); - dtoToSwitchOrderWith.setUpdatedAt(new Date(system2.now())); - dbClient.debtCharacteristicDao().update(dtoToSwitchOrderWith, session); - - dto.setOrder(nextOrder); - dto.setUpdatedAt(new Date(system2.now())); - dbClient.debtCharacteristicDao().update(dto, session); - - session.commit(); - return toCharacteristic(dto); - } finally { - MyBatis.closeQuietly(session); - } - } - - private static int getOrder(CharacteristicDto characteristicDto) { - Integer order = characteristicDto.getOrder(); - if (order == null) { - throw new IllegalArgumentException(String.format("The order of the characteristic '%s' should not be null", characteristicDto.getKey())); - } - return order; - } - - @CheckForNull - private CharacteristicDto findCharacteristicToSwitchWith(final CharacteristicDto dto, final boolean moveUpOrDown, SqlSession session) { - // characteristics should be sort by 'order' - List rootCharacteristics = dbClient.debtCharacteristicDao().selectEnabledRootCharacteristics(session); - int currentPosition = Iterables.indexOf(rootCharacteristics, new CharacteristicDtoMatchKey(dto.getKey())); - Integer nextPosition = moveUpOrDown ? - (currentPosition > 0 ? (currentPosition - 1) : null) : - ((currentPosition < rootCharacteristics.size() - 1) ? (currentPosition + 1) : null); - return (nextPosition != null) ? Iterables.get(rootCharacteristics, nextPosition) : null; - } - - /** - * Disable characteristic and its sub characteristics or only sub characteristic. - * Will also update every rules linked to sub characteristics by setting characteristic id to -1 and remove function, coefficient and offset. - */ - public void delete(int characteristicId) { - checkPermission(); - - Date updateDate = new Date(system2.now()); - DbSession session = dbClient.openSession(true); - try { - delete(findCharacteristic(characteristicId, session), updateDate, session); - session.commit(); - } finally { - MyBatis.closeQuietly(session); - } - } - - /** - * Disabled a characteristic or a sub characteristic. - * If it has already been disabled, do nothing (for instance when call on a list of characteristics and sub-characteristics in random order) - */ - public void delete(CharacteristicDto characteristicOrSubCharacteristic, Date updateDate, DbSession session) { - // Do nothing is the characteristic is already disabled - if (characteristicOrSubCharacteristic.isEnabled()) { - // When root characteristic, browse sub characteristics and disable rule debt on each sub characteristic then disable it - if (characteristicOrSubCharacteristic.getParentId() == null) { - List subCharacteristics = dbClient.debtCharacteristicDao().selectCharacteristicsByParentId(characteristicOrSubCharacteristic.getId(), session); - for (CharacteristicDto subCharacteristic : subCharacteristics) { - disableSubCharacteristic(subCharacteristic, updateDate, session); - } - disableCharacteristic(characteristicOrSubCharacteristic, updateDate, session); - } else { - // When sub characteristic, disable rule debt on the sub characteristic then disable it - disableSubCharacteristic(characteristicOrSubCharacteristic, updateDate, session); - } - } - } - - private void disableSubCharacteristic(CharacteristicDto subCharacteristic, Date updateDate, DbSession session) { - // Disable debt on all rules (even REMOVED ones, in order to have no issue if they are reactivated) linked to the sub characteristic - disableRulesDebt(dbClient.deprecatedRuleDao().selectRulesByDebtSubCharacteristicId(session, subCharacteristic.getId()), subCharacteristic.getId(), updateDate, session); - disableCharacteristic(subCharacteristic, updateDate, session); - } - - private void disableCharacteristic(CharacteristicDto characteristic, Date updateDate, SqlSession session) { - characteristic.setEnabled(false); - characteristic.setUpdatedAt(updateDate); - dbClient.debtCharacteristicDao().update(characteristic, session); - } - - private void disableRulesDebt(List ruleDtos, Integer subCharacteristicId, Date updateDate, DbSession session) { - for (RuleDto ruleDto : ruleDtos) { - if (subCharacteristicId.equals(ruleDto.getSubCharacteristicId())) { - ruleDto.setSubCharacteristicId(RuleDto.DISABLED_CHARACTERISTIC_ID); - ruleDto.setRemediationFunction(null); - ruleDto.setRemediationCoefficient(null); - ruleDto.setRemediationOffset(null); - ruleDto.setUpdatedAt(updateDate); - } - if (subCharacteristicId.equals(ruleDto.getDefaultSubCharacteristicId())) { - ruleDto.setDefaultSubCharacteristicId(null); - ruleDto.setDefaultRemediationFunction(null); - ruleDto.setDefaultRemediationCoefficient(null); - ruleDto.setDefaultRemediationOffset(null); - } - dbClient.deprecatedRuleDao().update(session, ruleDto); - } - } - - private CharacteristicDto findCharacteristic(Integer id, SqlSession session) { - CharacteristicDto dto = dbClient.debtCharacteristicDao().selectById(session, id); - if (dto == null) { - throw new NotFoundException(String.format("Characteristic with id %s does not exists.", id)); - } - return dto; - } - - private void checkNotAlreadyExists(String name, SqlSession session) { - if (dbClient.debtCharacteristicDao().selectByName(session, name) != null) { - throw new BadRequestException(Validation.IS_ALREADY_USED_MESSAGE, name); - } - } - - private void checkPermission() { - userSession.checkPermission(GlobalPermissions.SYSTEM_ADMIN); - } - - private static DebtCharacteristic toCharacteristic(CharacteristicDto dto) { - return new DefaultDebtCharacteristic() - .setId(dto.getId()) - .setKey(dto.getKey()) - .setName(dto.getName()) - .setOrder(dto.getOrder()) - .setParentId(dto.getParentId()) - .setCreatedAt(dto.getCreatedAt()) - .setUpdatedAt(dto.getUpdatedAt()); - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelService.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelService.java index 21ad2e8f144..a4cf7b2b756 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelService.java @@ -19,76 +19,39 @@ */ package org.sonar.server.debt; +import java.util.Collections; +import java.util.List; +import javax.annotation.CheckForNull; import org.sonar.api.server.debt.DebtCharacteristic; import org.sonar.api.server.debt.DebtModel; import org.sonar.api.utils.ValidationMessages; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; - -import java.util.List; - /** * Used through ruby code
Internal.debt
* Also used by SQALE plugin. */ public class DebtModelService implements DebtModel { - private final DebtModelOperations debtModelOperations; - private final DebtModelLookup debtModelLookup; private final DebtModelBackup debtModelBackup; - public DebtModelService(DebtModelOperations debtModelOperations, DebtModelLookup debtModelLookup, DebtModelBackup debtModelBackup) { - this.debtModelOperations = debtModelOperations; - this.debtModelLookup = debtModelLookup; + public DebtModelService(DebtModelBackup debtModelBackup) { this.debtModelBackup = debtModelBackup; } @Override public List characteristics() { - return debtModelLookup.rootCharacteristics(); + return Collections.emptyList(); } @Override public List allCharacteristics() { - return debtModelLookup.allCharacteristics(); - } - - @CheckForNull - public DebtCharacteristic characteristicById(int id) { - return debtModelLookup.characteristicById(id); + return Collections.emptyList(); } @Override @CheckForNull public DebtCharacteristic characteristicByKey(String key) { - return debtModelLookup.characteristicByKey(key); - } - - public DebtCharacteristic create(String name, @Nullable Integer parentId) { - return debtModelOperations.create(name, parentId); - } - - public DebtCharacteristic rename(int characteristicId, String newName) { - return debtModelOperations.rename(characteristicId, newName); - } - - public DebtCharacteristic moveUp(int characteristicId) { - return debtModelOperations.moveUp(characteristicId); - } - - public DebtCharacteristic moveDown(int characteristicId) { - return debtModelOperations.moveDown(characteristicId); - } - - /** - * Delete a characteristic or a sub characteristic. - *
- * If a characteristic is selected, all its sub characteristics will also be deleted. - * Every rules linked to sub characteristics will have their debt definitions reset. - */ - public void delete(int characteristicId) { - debtModelOperations.delete(characteristicId); + return null; } /** diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelXMLExporter.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelXMLExporter.java index 4fdcd1eeef6..1df20276b18 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelXMLExporter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelXMLExporter.java @@ -19,20 +19,14 @@ */ package org.sonar.server.debt; -import com.google.common.base.Predicate; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Multimap; import com.google.common.collect.Ordering; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; -import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; @@ -46,12 +40,8 @@ import org.apache.commons.lang.StringUtils; import org.sonar.api.rule.RuleKey; import org.sonar.api.server.ServerSide; import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.server.debt.DebtPredicates.DebtCharacteristicMatchId; -import org.sonar.server.debt.DebtPredicates.DebtCharacteristicMatchKey; import org.xml.sax.InputSource; -import static com.google.common.collect.Lists.newArrayList; - /** * Export characteristics and rule debt definitions to XML */ @@ -62,8 +52,6 @@ public class DebtModelXMLExporter { private static final String DEFAULT_INDENT = "2"; public static final String CHARACTERISTIC = "chc"; - public static final String CHARACTERISTIC_KEY = "key"; - public static final String CHARACTERISTIC_NAME = "name"; public static final String PROPERTY = "prop"; public static final String PROPERTY_KEY = "key"; public static final String PROPERTY_VALUE = "val"; @@ -76,11 +64,11 @@ public class DebtModelXMLExporter { public static final String PROPERTY_COEFFICIENT = "remediationFactor"; public static final String PROPERTY_OFFSET = "offset"; - protected String export(DebtModel debtModel, List allRules) { + protected String export(List allRules) { StringBuilder sb = new StringBuilder(); sb.append("<" + ROOT + ">"); - for (DebtCharacteristic characteristic : debtModel.rootCharacteristics()) { - processCharacteristic(debtModel, characteristic, allRules, sb); + for (RuleDebt rule : allRules) { + processRule(rule, sb); } sb.append(""); String xml = sb.toString(); @@ -88,29 +76,6 @@ public class DebtModelXMLExporter { return xml; } - private void processCharacteristic(DebtModel debtModel, DebtCharacteristic characteristic, List allRules, StringBuilder xml) { - xml.append("<" + CHARACTERISTIC + ">"); - if (StringUtils.isNotBlank(characteristic.key())) { - xml.append("<" + CHARACTERISTIC_KEY + ">"); - xml.append(StringEscapeUtils.escapeXml(characteristic.key())); - xml.append("<" + CHARACTERISTIC_NAME + ">"); - xml.append(StringEscapeUtils.escapeXml(characteristic.name())); - xml.append(""); - } - - if (characteristic.isSub()) { - List rules = rules(allRules, characteristic.key()); - for (RuleDebt ruleDto : rules) { - processRule(ruleDto, xml); - } - } else { - for (DebtCharacteristic child : debtModel.subCharacteristics(characteristic.key())) { - processCharacteristic(debtModel, child, allRules, xml); - } - } - xml.append(""); - } - private static void processRule(RuleDebt rule, StringBuilder xml) { xml.append("<" + CHARACTERISTIC + ">"); xml.append("<" + REPOSITORY_KEY + ">"); @@ -180,65 +145,8 @@ public class DebtModelXMLExporter { return xml; } - private List rules(List rules, String parentKey) { - return newArrayList(Iterables.filter(rules, new RuleDebtSubCharKeyMatchKey(parentKey))); - } - - public static class DebtModel { - - private Multimap characteristicsByKey; - - public DebtModel() { - characteristicsByKey = ArrayListMultimap.create(); - } - - public DebtModel addRootCharacteristic(DebtCharacteristic characteristic) { - characteristicsByKey.put(null, characteristic); - return this; - } - - public DebtModel addSubCharacteristic(DebtCharacteristic subCharacteristic, String characteristicKey) { - characteristicsByKey.put(characteristicKey, subCharacteristic); - return this; - } - - /** - * @return root characteristics sorted by order - */ - public List rootCharacteristics() { - return sortByOrder(newArrayList(characteristicsByKey.get(null))); - } - - /** - * @return root characteristics sorted by name - */ - public List subCharacteristics(String characteristicKey) { - return sortByName(newArrayList(characteristicsByKey.get(characteristicKey))); - } - - @CheckForNull - public DebtCharacteristic characteristicByKey(String key) { - return Iterables.find(characteristicsByKey.values(), new DebtCharacteristicMatchKey(key), null); - } - - public DebtCharacteristic characteristicById(int id) { - return Iterables.find(characteristicsByKey.values(), new DebtCharacteristicMatchId(id)); - } - - private static List sortByOrder(List characteristics) { - Collections.sort(characteristics, new SortByOrder()); - return characteristics; - } - - private static List sortByName(List characteristics) { - Collections.sort(characteristics, new SortByName()); - return characteristics; - } - } - public static class RuleDebt { private RuleKey ruleKey; - private String subCharacteristicKey; private String function; private String coefficient; private String offset; @@ -252,15 +160,6 @@ public class DebtModelXMLExporter { return this; } - public String subCharacteristicKey() { - return subCharacteristicKey; - } - - public RuleDebt setSubCharacteristicKey(String subCharacteristicKey) { - this.subCharacteristicKey = subCharacteristicKey; - return this; - } - public String function() { return function; } @@ -294,7 +193,6 @@ public class DebtModelXMLExporter { public String toString() { return "RuleDebt{" + "ruleKey=" + ruleKey + - ", subCharacteristicKey='" + subCharacteristicKey + '\'' + ", function=" + function + ", coefficient='" + coefficient + '\'' + ", offset='" + offset + '\'' + @@ -302,19 +200,6 @@ public class DebtModelXMLExporter { } } - private static class RuleDebtSubCharKeyMatchKey implements Predicate { - private final String key; - - public RuleDebtSubCharKeyMatchKey(String key) { - this.key = key; - } - - @Override - public boolean apply(@Nonnull RuleDebt input) { - return key.equals(input.subCharacteristicKey()); - } - } - private static class SortByOrder extends Ordering { @Override public int compare(@Nullable DebtCharacteristic left, @Nullable DebtCharacteristic right) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtPredicates.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtPredicates.java deleted file mode 100644 index 47cb673fe14..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtPredicates.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import javax.annotation.Nonnull; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; -import org.sonar.db.debt.CharacteristicDto; - -public class DebtPredicates { - - private DebtPredicates() { - // Only static stuff - } - - public static class CharacteristicDtoMatchKey implements Predicate { - private final String key; - - public CharacteristicDtoMatchKey(String key) { - this.key = key; - } - - @Override - public boolean apply(@Nonnull CharacteristicDto input) { - return input.getKey().equals(key); - } - } - - public static class CharacteristicDtoParentIdMatchId implements Predicate { - private final Integer id; - - public CharacteristicDtoParentIdMatchId(Integer id) { - this.id = id; - } - - @Override - public boolean apply(@Nonnull CharacteristicDto input) { - return id.equals(input.getParentId()); - } - } - - public static class DebtCharacteristicMatchKey implements Predicate { - private final String key; - - public DebtCharacteristicMatchKey(String key) { - this.key = key; - } - - @Override - public boolean apply(@Nonnull DebtCharacteristic input) { - return input.key().equals(key); - } - } - - public static class DebtCharacteristicMatchId implements Predicate { - private final int id; - - public DebtCharacteristicMatchId(int id) { - this.id = id; - } - - @Override - public boolean apply(@Nonnull DebtCharacteristic input) { - return id == ((DefaultDebtCharacteristic) input).id(); - } - } - - public enum ToDebtCharacteristic implements Function { - INSTANCE; - - @Override - public DebtCharacteristic apply(@Nonnull CharacteristicDto input) { - return toDebtCharacteristic(input); - } - } - - public static DebtCharacteristic toDebtCharacteristic(CharacteristicDto dto) { - return new DefaultDebtCharacteristic() - .setId(dto.getId()) - .setKey(dto.getKey()) - .setName(dto.getName()) - .setOrder(dto.getOrder()) - .setParentId(dto.getParentId()); - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtRulesXMLImporter.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtRulesXMLImporter.java index 15ea26d0e0a..8525f0c192f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtRulesXMLImporter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtRulesXMLImporter.java @@ -53,9 +53,7 @@ import static org.apache.commons.lang.StringUtils.isNotBlank; import static org.sonar.api.server.debt.DebtRemediationFunction.Type.CONSTANT_ISSUE; import static org.sonar.api.server.debt.DebtRemediationFunction.Type.LINEAR; import static org.sonar.api.utils.Duration.MINUTE; -import static org.sonar.server.debt.DebtCharacteristicsXMLImporter.convertKey; import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC; -import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC_KEY; import static org.sonar.server.debt.DebtModelXMLExporter.PROPERTY; import static org.sonar.server.debt.DebtModelXMLExporter.PROPERTY_COEFFICIENT; import static org.sonar.server.debt.DebtModelXMLExporter.PROPERTY_FUNCTION; @@ -86,7 +84,7 @@ public class DebtRulesXMLImporter { cursor.advance(); SMInputCursor rootCursor = cursor.childElementCursor(CHARACTERISTIC); while (rootCursor.getNext() != null) { - process(ruleDebts, null, null, validationMessages, rootCursor); + process(ruleDebts, validationMessages, rootCursor); } cursor.getStreamReader().closeCompletely(); @@ -105,25 +103,17 @@ public class DebtRulesXMLImporter { return new SMInputFactory(xmlFactory); } - private void process(List ruleDebts, @Nullable String rootKey, @Nullable String parentKey, + private void process(List ruleDebts, ValidationMessages validationMessages, SMInputCursor chcCursor) throws XMLStreamException { - String currentCharacteristicKey = null; SMInputCursor cursor = chcCursor.childElementCursor(); while (cursor.getNext() != null) { String node = cursor.getLocalName(); - if (StringUtils.equals(node, CHARACTERISTIC_KEY)) { - currentCharacteristicKey = cursor.collectDescendantText().trim(); - } else if (StringUtils.equals(node, CHARACTERISTIC)) { - process(ruleDebts, parentKey, currentCharacteristicKey, validationMessages, cursor); + if (StringUtils.equals(node, CHARACTERISTIC)) { + process(ruleDebts, validationMessages, cursor); } else if (StringUtils.equals(node, REPOSITORY_KEY)) { RuleDebt ruleDebt = processRule(validationMessages, cursor); - if (ruleDebt != null && parentKey != null) { - if (rootKey != null) { - ruleDebt.setSubCharacteristicKey(convertKey(parentKey)); - ruleDebts.add(ruleDebt); - } else { - validationMessages.addWarningText("Rule '" + ruleDebt.ruleKey() + "' is ignored because it's defined directly under a root characteristic."); - } + if (ruleDebt != null) { + ruleDebts.add(ruleDebt); } } } @@ -131,7 +121,6 @@ public class DebtRulesXMLImporter { @CheckForNull private RuleDebt processRule(ValidationMessages validationMessages, SMInputCursor cursor) throws XMLStreamException { - String ruleRepositoryKey = cursor.collectDescendantText().trim(); String ruleKey = null; Properties properties = new Properties(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/ShowAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/ShowAction.java index 4c70781badf..1f32fc8bb01 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/ShowAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/ShowAction.java @@ -30,8 +30,6 @@ import org.sonar.api.i18n.I18n; import org.sonar.api.issue.ActionPlan; import org.sonar.api.issue.Issue; import org.sonar.api.issue.IssueComment; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; @@ -47,7 +45,6 @@ import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; import org.sonar.markdown.Markdown; -import org.sonar.server.debt.DebtModelService; import org.sonar.server.issue.IssueChangelog; import org.sonar.server.issue.IssueChangelogService; import org.sonar.server.issue.IssueCommentService; @@ -71,14 +68,13 @@ public class ShowAction implements IssuesWsAction { private final IssueActionsWriter actionsWriter; private final ActionPlanService actionPlanService; private final UserFinder userFinder; - private final DebtModelService debtModel; private final RuleService ruleService; private final I18n i18n; private final Durations durations; private final UserSession userSession; public ShowAction(DbClient dbClient, IssueService issueService, IssueChangelogService issueChangelogService, IssueCommentService commentService, - IssueActionsWriter actionsWriter, ActionPlanService actionPlanService, UserFinder userFinder, DebtModelService debtModel, RuleService ruleService, + IssueActionsWriter actionsWriter, ActionPlanService actionPlanService, UserFinder userFinder, RuleService ruleService, I18n i18n, Durations durations, UserSession userSession) { this.dbClient = dbClient; this.issueService = issueService; @@ -87,7 +83,6 @@ public class ShowAction implements IssuesWsAction { this.actionsWriter = actionsWriter; this.actionPlanService = actionPlanService; this.userFinder = userFinder; - this.debtModel = debtModel; this.ruleService = ruleService; this.i18n = i18n; this.durations = durations; @@ -165,7 +160,6 @@ public class ShowAction implements IssuesWsAction { addComponents(session, issue, json); addUserWithLabel(issue.assignee(), "assignee", json); addUserWithLabel(issue.reporter(), "reporter", json); - addCharacteristics(rule, json); } private void addComponents(DbSession session, Issue issue, JsonWriter json) { @@ -278,30 +272,4 @@ public class ShowAction implements IssuesWsAction { } return null; } - - private void addCharacteristics(Rule rule, JsonWriter json) { - String subCharacteristicKey = rule.debtCharacteristicKey(); - DebtCharacteristic subCharacteristic = characteristicByKey(subCharacteristicKey); - if (subCharacteristic != null) { - json.prop("subCharacteristic", subCharacteristic.name()); - DebtCharacteristic characteristic = characteristicById(((DefaultDebtCharacteristic) subCharacteristic).parentId()); - json.prop("characteristic", characteristic != null ? characteristic.name() : null); - } - } - - @CheckForNull - private DebtCharacteristic characteristicById(@Nullable Integer id) { - if (id != null) { - return debtModel.characteristicById(id); - } - return null; - } - - @CheckForNull - private DebtCharacteristic characteristicByKey(@Nullable String key) { - if (key != null) { - return debtModel.characteristicByKey(key); - } - return null; - } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java index 3a896ad2cee..66132486453 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java @@ -89,16 +89,12 @@ import org.sonar.server.dashboard.widget.MeasureFilterListWidget; import org.sonar.server.dashboard.widget.ProjectFileCloudWidget; import org.sonar.server.dashboard.widget.ProjectIssueFilterWidget; import org.sonar.server.dashboard.widget.SizeWidget; -import org.sonar.server.dashboard.widget.TechnicalDebtPyramidWidget; import org.sonar.server.dashboard.widget.TimeMachineWidget; import org.sonar.server.dashboard.widget.TimelineWidget; import org.sonar.server.dashboard.widget.TreemapWidget; import org.sonar.server.dashboard.widget.WelcomeWidget; import org.sonar.server.dashboard.ws.DashboardsWs; -import org.sonar.server.debt.DebtCharacteristicsXMLImporter; import org.sonar.server.debt.DebtModelBackup; -import org.sonar.server.debt.DebtModelLookup; -import org.sonar.server.debt.DebtModelOperations; import org.sonar.server.debt.DebtModelPluginRepository; import org.sonar.server.debt.DebtModelService; import org.sonar.server.debt.DebtModelXMLExporter; @@ -369,7 +365,6 @@ public class PlatformLevel4 extends PlatformLevel { WelcomeWidget.class, DocumentationCommentsWidget.class, DuplicationsWidget.class, - TechnicalDebtPyramidWidget.class, MeasureFilterAsPieChartWidget.class, MeasureFilterAsCloudWidget.class, MeasureFilterAsHistogramWidget.class, @@ -619,13 +614,10 @@ public class PlatformLevel4 extends PlatformLevel { // technical debt DebtModelService.class, - DebtModelOperations.class, - DebtModelLookup.class, DebtModelBackup.class, DebtModelPluginRepository.class, DebtModelXMLExporter.class, DebtRulesXMLImporter.class, - DebtCharacteristicsXMLImporter.class, // source HtmlSourceDecorator.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java index e4d92734ee5..fcd79320669 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java @@ -31,7 +31,6 @@ import org.sonar.server.startup.DisplayLogOnDeprecatedProjects; import org.sonar.server.startup.GeneratePluginIndex; import org.sonar.server.startup.LogServerId; import org.sonar.server.startup.RegisterDashboards; -import org.sonar.server.startup.RegisterDebtModel; import org.sonar.server.startup.RegisterMetrics; import org.sonar.server.startup.RegisterNewMeasureFilters; import org.sonar.server.startup.RegisterPermissionTemplates; @@ -54,7 +53,6 @@ public class PlatformLevelStartup extends PlatformLevel { RegisterQualityGates.class, RegisterRules.class, RegisterQualityProfiles.class, - RegisterDebtModel.class, GeneratePluginIndex.class, RegisterNewMeasureFilters.class, RegisterDashboards.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java b/server/sonar-server/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java index 988a58f485e..21306469fba 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java @@ -134,10 +134,6 @@ public class DefaultRuleFinder implements RuleFinder { .setRepositoryKey(rule.key().repository()) .setSeverity(rule.severity() != null ? RulePriority.valueOf(rule.severity()) : null) .setStatus(rule.status().name()) - .setDefaultCharacteristicKey(rule.defaultDebtCharacteristicKey()) - .setDefaultSubCharacteristicKey(rule.defaultDebtSubCharacteristicKey()) - .setCharacteristicKey(rule.debtCharacteristicKey()) - .setSubCharacteristicKey(rule.debtSubCharacteristicKey()) .setTags(rule.tags().toArray(new String[rule.tags().size()])) .setId(((RuleDoc) rule).id()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java b/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java index dd140abd08f..3a70ef06371 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java @@ -87,7 +87,7 @@ public class DeprecatedRulesDefinitionLoader { newRepository = context.createRepository(repository.getKey(), repository.getLanguage()); newRepository.setName(repository.getName()); } else { - newRepository = (RulesDefinition.NewRepository) context.extendRepository(repository.getKey(), repository.getLanguage()); + newRepository = context.extendRepository(repository.getKey(), repository.getLanguage()); } for (org.sonar.api.rules.Rule rule : repository.createRules()) { RulesDefinition.NewRule newRule = newRepository.createRule(rule.getKey()); @@ -113,7 +113,6 @@ public class DeprecatedRulesDefinitionLoader { private void updateRuleDebtDefinitions(RulesDefinition.NewRule newRule, String repoKey, String ruleKey, List ruleDebts) { RuleDebt ruleDebt = findRequirement(ruleDebts, repoKey, ruleKey); if (ruleDebt != null) { - newRule.setDebtSubCharacteristic(ruleDebt.subCharacteristicKey()); newRule.setDebtRemediationFunction(remediationFunction(DebtRemediationFunction.Type.valueOf(ruleDebt.function()), ruleDebt.coefficient(), ruleDebt.offset(), diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java index c1fd8e78c02..22b4bee3c06 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java @@ -19,7 +19,6 @@ */ package org.sonar.server.rule; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -31,7 +30,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; @@ -41,7 +39,6 @@ import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; import org.sonar.api.server.debt.DebtRemediationFunction; import org.sonar.api.server.rule.RulesDefinition; -import org.sonar.api.utils.MessageException; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.api.utils.log.Profiler; @@ -51,11 +48,8 @@ import org.sonar.db.qualityprofile.ActiveRuleParamDto; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto.Format; import org.sonar.db.rule.RuleParamDto; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.server.db.DbClient; import org.sonar.server.qualityprofile.RuleActivator; -import org.sonar.server.startup.RegisterDebtModel; import static com.google.common.collect.Lists.newArrayList; @@ -70,23 +64,12 @@ public class RegisterRules implements Startable { private final RuleActivator ruleActivator; private final DbClient dbClient; private final Languages languages; - private final CharacteristicDao characteristicDao; - /** - * @param registerDebtModel used only to be started after init of the technical debt model - */ - public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, Languages languages, RegisterDebtModel registerDebtModel) { - this(defLoader, ruleActivator, dbClient, languages); - } - - @VisibleForTesting - RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, - DbClient dbClient, Languages languages) { + public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, Languages languages) { this.defLoader = defLoader; this.ruleActivator = ruleActivator; this.dbClient = dbClient; this.languages = languages; - this.characteristicDao = dbClient.debtCharacteristicDao(); } @Override @@ -95,13 +78,12 @@ public class RegisterRules implements Startable { DbSession session = dbClient.openSession(false); try { Map allRules = loadRules(session); - Map allCharacteristics = loadCharacteristics(session); RulesDefinition.Context context = defLoader.load(); for (RulesDefinition.ExtendedRepository repoDef : getRepositories(context)) { if (languages.get(repoDef.language()) != null) { for (RulesDefinition.Rule ruleDef : repoDef.rules()) { - registerRule(ruleDef, allRules, allCharacteristics, session); + registerRule(ruleDef, allRules, session); } session.commit(); } @@ -120,7 +102,7 @@ public class RegisterRules implements Startable { // nothing } - private void registerRule(RulesDefinition.Rule ruleDef, Map allRules, Map allCharacteristics, DbSession session) { + private void registerRule(RulesDefinition.Rule ruleDef, Map allRules, DbSession session) { RuleKey ruleKey = RuleKey.of(ruleDef.repository().key(), ruleDef.key()); RuleDto rule = allRules.containsKey(ruleKey) ? allRules.remove(ruleKey) : createRuleDto(ruleDef, session); @@ -130,8 +112,7 @@ public class RegisterRules implements Startable { executeUpdate = true; } - CharacteristicDto subCharacteristic = characteristic(ruleDef, rule.getSubCharacteristicId(), allCharacteristics); - if (mergeDebtDefinitions(ruleDef, rule, subCharacteristic)) { + if (mergeDebtDefinitions(ruleDef, rule)) { executeUpdate = true; } @@ -154,36 +135,6 @@ public class RegisterRules implements Startable { return rules; } - private Map loadCharacteristics(DbSession session) { - Map characteristics = new HashMap<>(); - for (CharacteristicDto characteristicDto : characteristicDao.selectEnabledCharacteristics(session)) { - characteristics.put(characteristicDto.getKey(), characteristicDto); - } - return characteristics; - } - - @CheckForNull - private static CharacteristicDto characteristic(RulesDefinition.Rule ruleDef, @Nullable Integer overridingCharacteristicId, Map allCharacteristics) { - String subCharacteristic = ruleDef.debtSubCharacteristic(); - String repo = ruleDef.repository().key(); - String ruleKey = ruleDef.key(); - - // Rule is not linked to a default characteristic or characteristic has been disabled by user - if (subCharacteristic == null) { - return null; - } - CharacteristicDto characteristicDto = allCharacteristics.get(subCharacteristic); - if (characteristicDto == null) { - // Log a warning only if rule has not been overridden by user - if (overridingCharacteristicId == null) { - LOG.warn(String.format("Unknown Characteristic '%s' was found on rule '%s:%s'", subCharacteristic, repo, ruleKey)); - } - } else if (characteristicDto.getParentId() == null) { - throw MessageException.of(String.format("Rule '%s:%s' cannot be linked on the root characteristic '%s'", repo, ruleKey, subCharacteristic)); - } - return characteristicDto; - } - private List getRepositories(RulesDefinition.Context context) { List repositories = new ArrayList<>(); for (RulesDefinition.Repository repoDef : context.repositories()) { @@ -228,7 +179,7 @@ public class RegisterRules implements Startable { changed = true; } if (mergeDescription(def, dto)) { - changed= true; + changed = true; } if (!dto.getSystemTags().containsAll(def.tags())) { dto.setSystemTags(def.tags()); @@ -273,29 +224,24 @@ public class RegisterRules implements Startable { return changed; } - private boolean mergeDebtDefinitions(RulesDefinition.Rule def, RuleDto dto, @Nullable CharacteristicDto subCharacteristic) { + private boolean mergeDebtDefinitions(RulesDefinition.Rule def, RuleDto dto) { // Debt definitions are set to null if the sub-characteristic and the remediation function are null - DebtRemediationFunction debtRemediationFunction = subCharacteristic != null ? def.debtRemediationFunction() : null; - boolean hasDebt = subCharacteristic != null && debtRemediationFunction != null; + DebtRemediationFunction debtRemediationFunction = def.debtRemediationFunction(); + boolean hasDebt = debtRemediationFunction != null; if (hasDebt) { - return mergeDebtDefinitions(def, dto, - subCharacteristic.getId(), + return mergeDebtDefinitions(dto, debtRemediationFunction.type().name(), debtRemediationFunction.coefficient(), debtRemediationFunction.offset(), def.effortToFixDescription()); } - return mergeDebtDefinitions(def, dto, null, null, null, null, null); + return mergeDebtDefinitions(dto, null, null, null, null); } - private boolean mergeDebtDefinitions(RulesDefinition.Rule def, RuleDto dto, @Nullable Integer characteristicId, @Nullable String remediationFunction, + private boolean mergeDebtDefinitions(RuleDto dto, @Nullable String remediationFunction, @Nullable String remediationCoefficient, @Nullable String remediationOffset, @Nullable String effortToFixDescription) { boolean changed = false; - if (!ObjectUtils.equals(dto.getDefaultSubCharacteristicId(), characteristicId)) { - dto.setDefaultSubCharacteristicId(characteristicId); - changed = true; - } if (!StringUtils.equals(dto.getDefaultRemediationFunction(), remediationFunction)) { dto.setDefaultRemediationFunction(remediationFunction); changed = true; @@ -436,10 +382,6 @@ public class RegisterRules implements Startable { customRule.setConfigKey(templateRule.getConfigKey()); changed = true; } - if (!ObjectUtils.equals(customRule.getDefaultSubCharacteristicId(), templateRule.getDefaultSubCharacteristicId())) { - customRule.setDefaultSubCharacteristicId(templateRule.getDefaultSubCharacteristicId()); - changed = true; - } if (!StringUtils.equals(customRule.getDefaultRemediationFunction(), templateRule.getDefaultRemediationFunction())) { customRule.setDefaultRemediationFunction(templateRule.getDefaultRemediationFunction()); changed = true; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RubyRuleService.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RubyRuleService.java index 6f531b80047..1bafcec918e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RubyRuleService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RubyRuleService.java @@ -81,8 +81,6 @@ public class RubyRuleService implements Startable { query.setSeverities(RubyUtils.toStrings(params.get("severities"))); query.setStatuses(RubyUtils.toEnums(params.get("statuses"), RuleStatus.class)); query.setTags(RubyUtils.toStrings(params.get("tags"))); - query.setDebtCharacteristics(RubyUtils.toStrings(params.get("debtCharacteristics"))); - query.setHasDebtCharacteristic(RubyUtils.toBoolean(params.get("hasDebtCharacteristic"))); query.setSortField(RuleNormalizer.RuleField.NAME); String profile = Strings.emptyToNull((String) params.get("profile")); if (profile != null) { @@ -116,7 +114,6 @@ public class RubyRuleService implements Startable { // sqale public void updateRule(Map params) { RuleUpdate update = RuleUpdate.createForPluginRule(RuleKey.parse((String) params.get("ruleKey"))); - update.setDebtSubCharacteristic(Strings.emptyToNull((String) params.get("debtCharacteristicKey"))); String fn = (String) params.get("debtRemediationFunction"); if (fn == null) { update.setDebtRemediationFunction(null); diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java b/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java index cd1a8530d22..459963c20aa 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java @@ -81,18 +81,6 @@ public interface Rule { boolean debtOverloaded(); - @CheckForNull - String debtCharacteristicKey(); - - @CheckForNull - String defaultDebtCharacteristicKey(); - - @CheckForNull - String debtSubCharacteristicKey(); - - @CheckForNull - String defaultDebtSubCharacteristicKey(); - @CheckForNull DebtRemediationFunction debtRemediationFunction(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java index 4217ee66e27..11b28a75d1a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java @@ -202,7 +202,6 @@ public class RuleCreator { .setSeverity(newRule.severity()) .setStatus(newRule.status()) .setLanguage(templateRuleDto.getLanguage()) - .setDefaultSubCharacteristicId(templateRuleDto.getDefaultSubCharacteristicId()) .setDefaultRemediationFunction(templateRuleDto.getDefaultRemediationFunction()) .setDefaultRemediationCoefficient(templateRuleDto.getDefaultRemediationCoefficient()) .setDefaultRemediationOffset(templateRuleDto.getDefaultRemediationOffset()) diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java index 4a57dca1617..729f44d3529 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java @@ -19,7 +19,6 @@ */ package org.sonar.server.rule; -import com.google.common.base.Strings; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.apache.commons.lang.builder.EqualsBuilder; @@ -30,7 +29,6 @@ import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction; import org.sonar.core.permission.GlobalPermissions; import org.sonar.db.DbSession; import org.sonar.db.MyBatis; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.db.rule.RuleDto; import org.sonar.server.db.DbClient; import org.sonar.server.exceptions.BadRequestException; @@ -58,18 +56,8 @@ public class RuleOperations { if (ruleDto == null) { throw new NotFoundException(String.format("Unknown rule '%s'", ruleChange.ruleKey())); } - String subCharacteristicKey = ruleChange.debtCharacteristicKey(); - CharacteristicDto subCharacteristic = null; - - // A sub-characteristic is given -> update rule debt if given values are different from overridden ones and from default ones - if (!Strings.isNullOrEmpty(subCharacteristicKey)) { - subCharacteristic = dbClient.debtCharacteristicDao().selectByKey(subCharacteristicKey, session); - if (subCharacteristic == null) { - throw new NotFoundException(String.format("Unknown sub characteristic '%s'", ruleChange.debtCharacteristicKey())); - } - } - boolean needUpdate = updateRule(ruleDto, subCharacteristic, ruleChange.debtRemediationFunction(), ruleChange.debtRemediationCoefficient(), + boolean needUpdate = updateRule(ruleDto, ruleChange.debtRemediationFunction(), ruleChange.debtRemediationCoefficient(), ruleChange.debtRemediationOffset(), session); if (needUpdate) { @@ -82,24 +70,21 @@ public class RuleOperations { } } - public boolean updateRule(RuleDto ruleDto, @Nullable CharacteristicDto newSubCharacteristic, @Nullable String newFunction, + public boolean updateRule(RuleDto ruleDto, @Nullable String newFunction, @Nullable String newCoefficient, @Nullable String newOffset, DbSession session) { boolean needUpdate = false; // A sub-characteristic and a remediation function is given -> update rule debt - if (newSubCharacteristic != null && newFunction != null) { + if (newFunction != null) { // New values are the same as the default values -> set overridden values to null - if (isRuleDebtSameAsDefaultValues(ruleDto, newSubCharacteristic, newFunction, newCoefficient, newOffset)) { - ruleDto.setSubCharacteristicId(null); + if (isRuleDebtSameAsDefaultValues(ruleDto, newFunction, newCoefficient, newOffset)) { ruleDto.setRemediationFunction(null); ruleDto.setRemediationCoefficient(null); ruleDto.setRemediationOffset(null); needUpdate = true; // New values are not the same as the overridden values -> update overridden values with new values - } else if (!isRuleDebtSameAsOverriddenValues(ruleDto, newSubCharacteristic, newFunction, newCoefficient, newOffset)) { - ruleDto.setSubCharacteristicId(newSubCharacteristic.getId()); - + } else if (!isRuleDebtSameAsOverriddenValues(ruleDto, newFunction, newCoefficient, newOffset)) { DefaultDebtRemediationFunction debtRemediationFunction = new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.valueOf(newFunction), newCoefficient, newOffset); ruleDto.setRemediationFunction(debtRemediationFunction.type().name()); ruleDto.setRemediationCoefficient(debtRemediationFunction.coefficient()); @@ -110,16 +95,10 @@ public class RuleOperations { // No sub-characteristic is given -> disable rule debt if not already disabled } else { // Rule characteristic is not already disabled -> update it - Integer subCharacteristicId = ruleDto.getSubCharacteristicId(); - if (subCharacteristicId == null || subCharacteristicId != RuleDto.DISABLED_CHARACTERISTIC_ID) { - // If default characteristic is not defined, set the overridden characteristic to null in order to be able to track debt plugin - // update - ruleDto.setSubCharacteristicId(ruleDto.getDefaultSubCharacteristicId() != null ? RuleDto.DISABLED_CHARACTERISTIC_ID : null); - ruleDto.setRemediationFunction(null); - ruleDto.setRemediationCoefficient(null); - ruleDto.setRemediationOffset(null); - needUpdate = true; - } + ruleDto.setRemediationFunction(null); + ruleDto.setRemediationCoefficient(null); + ruleDto.setRemediationOffset(null); + needUpdate = true; } if (needUpdate) { @@ -128,17 +107,15 @@ public class RuleOperations { return needUpdate; } - private static boolean isRuleDebtSameAsDefaultValues(RuleDto ruleDto, CharacteristicDto newSubCharacteristic, @Nullable String newFunction, + private static boolean isRuleDebtSameAsDefaultValues(RuleDto ruleDto, @Nullable String newFunction, @Nullable String newCoefficient, @Nullable String newOffset) { - return newSubCharacteristic.getId().equals(ruleDto.getDefaultSubCharacteristicId()) && - isSameRemediationFunction(newFunction, newCoefficient, newOffset, ruleDto.getDefaultRemediationFunction(), ruleDto.getDefaultRemediationCoefficient(), - ruleDto.getDefaultRemediationOffset()); + return isSameRemediationFunction(newFunction, newCoefficient, newOffset, ruleDto.getDefaultRemediationFunction(), ruleDto.getDefaultRemediationCoefficient(), + ruleDto.getDefaultRemediationOffset()); } - private static boolean isRuleDebtSameAsOverriddenValues(RuleDto ruleDto, CharacteristicDto newSubCharacteristic, @Nullable String newFunction, + private static boolean isRuleDebtSameAsOverriddenValues(RuleDto ruleDto, @Nullable String newFunction, @Nullable String newCoefficient, @Nullable String newOffset) { - return newSubCharacteristic.getId().equals(ruleDto.getSubCharacteristicId()) - && isSameRemediationFunction(newFunction, newCoefficient, newOffset, ruleDto.getRemediationFunction(), ruleDto.getRemediationCoefficient(), ruleDto.getRemediationOffset()); + return isSameRemediationFunction(newFunction, newCoefficient, newOffset, ruleDto.getRemediationFunction(), ruleDto.getRemediationCoefficient(), ruleDto.getRemediationOffset()); } private static boolean isSameRemediationFunction(@Nullable String newFunction, @Nullable String newCoefficient, @Nullable String newOffset, @@ -157,7 +134,6 @@ public class RuleOperations { public static class RuleChange { private RuleKey ruleKey; - private String debtCharacteristicKey; private String debtRemediationFunction; private String debtRemediationCoefficient; private String debtRemediationOffset; @@ -171,16 +147,6 @@ public class RuleOperations { return this; } - @CheckForNull - public String debtCharacteristicKey() { - return debtCharacteristicKey; - } - - public RuleChange setDebtCharacteristicKey(@Nullable String debtCharacteristicKey) { - this.debtCharacteristicKey = debtCharacteristicKey; - return this; - } - @CheckForNull public String debtRemediationFunction() { return debtRemediationFunction; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdate.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdate.java index b6e7375d792..6504ffaca1c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdate.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdate.java @@ -20,26 +20,21 @@ package org.sonar.server.rule; import com.google.common.collect.Maps; +import java.util.Map; +import java.util.Set; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; import org.apache.commons.lang.StringUtils; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; import org.sonar.api.server.debt.DebtRemediationFunction; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; - -import java.util.Map; -import java.util.Set; - public class RuleUpdate { - public static final String DEFAULT_DEBT_CHARACTERISTIC = "_default"; - private final RuleKey ruleKey; private boolean changeTags = false; private boolean changeMarkdownNote = false; - private boolean changeDebtSubCharacteristic = false; private boolean changeDebtRemediationFunction = false; private boolean changeName = false; private boolean changeDescription = false; @@ -50,7 +45,6 @@ public class RuleUpdate { private boolean isManual; private Set tags; private String markdownNote; - private String debtSubCharacteristicKey; private DebtRemediationFunction debtRemediationFunction; private String name; @@ -95,21 +89,6 @@ public class RuleUpdate { return this; } - @CheckForNull - public String getDebtSubCharacteristicKey() { - return debtSubCharacteristicKey; - } - - /** - * Set to null or blank to force the characteristic "NONE". Set to value of {@link #DEFAULT_DEBT_CHARACTERISTIC} - * to reset to default characteristic. - */ - public RuleUpdate setDebtSubCharacteristic(@Nullable String c) { - this.debtSubCharacteristicKey = c == null ? null : StringUtils.defaultIfBlank(c, null); - this.changeDebtSubCharacteristic = true; - return this; - } - @CheckForNull public DebtRemediationFunction getDebtRemediationFunction() { return debtRemediationFunction; @@ -201,10 +180,6 @@ public class RuleUpdate { return changeMarkdownNote; } - public boolean isChangeDebtSubCharacteristic() { - return changeDebtSubCharacteristic; - } - public boolean isChangeDebtRemediationFunction() { return changeDebtRemediationFunction; } @@ -230,20 +205,20 @@ public class RuleUpdate { } public boolean isEmpty() { - return !changeMarkdownNote && !changeTags && !changeDebtSubCharacteristic && !changeDebtRemediationFunction && isCustomRuleFieldsEmpty(); + return !changeMarkdownNote && !changeTags && !changeDebtRemediationFunction && isCustomRuleFieldsEmpty(); } - private boolean isCustomRuleFieldsEmpty(){ + private boolean isCustomRuleFieldsEmpty() { return !changeName && !changeDescription && !changeSeverity && !changeStatus && !changeParameters; } - private void checkCustomRule(){ + private void checkCustomRule() { if (!isCustomRule) { throw new IllegalStateException("Not a custom rule"); } } - private void checkCustomOrManualRule(){ + private void checkCustomOrManualRule() { if (!isCustomRule && !isManual) { throw new IllegalStateException("Not a custom or a manual rule"); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java index 98a028c67be..1d0424c1ba2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java @@ -26,7 +26,6 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; -import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.EqualsBuilder; import org.sonar.api.rule.RuleStatus; @@ -39,7 +38,6 @@ import org.sonar.db.qualityprofile.ActiveRuleDto; import org.sonar.db.qualityprofile.ActiveRuleParamDto; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleParamDto; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.server.db.DbClient; import org.sonar.server.user.UserSession; @@ -90,21 +88,6 @@ public class RuleUpdater { if (RuleStatus.REMOVED == context.rule.getStatus()) { throw new IllegalArgumentException("Rule with REMOVED status cannot be updated: " + change.getRuleKey()); } - String subCharacteristicKey = change.getDebtSubCharacteristicKey(); - if (subCharacteristicKey != null && - !subCharacteristicKey.equals(RuleUpdate.DEFAULT_DEBT_CHARACTERISTIC)) { - CharacteristicDto characteristicDto = dbClient.debtCharacteristicDao().selectByKey(subCharacteristicKey, dbSession); - if (characteristicDto == null) { - throw new IllegalArgumentException("Unknown debt sub-characteristic: " + subCharacteristicKey); - } - if (!characteristicDto.isEnabled()) { - throw new IllegalArgumentException("Debt sub-characteristic is disabled: " + subCharacteristicKey); - } - if (characteristicDto.getParentId() == null) { - throw new IllegalArgumentException("Not a sub-characteristic: " + subCharacteristicKey); - } - context.newCharacteristic = characteristicDto; - } return context; } finally { @@ -131,9 +114,6 @@ public class RuleUpdater { if (update.isChangeTags()) { updateTags(update, context); } - if (update.isChangeDebtSubCharacteristic()) { - updateDebtSubCharacteristic(update, context); - } // order is important -> sub-characteristic must be set if (update.isChangeDebtRemediationFunction()) { updateDebtRemediationFunction(update, context); @@ -185,44 +165,9 @@ public class RuleUpdater { } } - private static void updateDebtSubCharacteristic(RuleUpdate update, Context context) { - if (update.getDebtSubCharacteristicKey() == null) { - // set to "none" - Integer id = context.rule.getDefaultSubCharacteristicId() != null ? RuleDto.DISABLED_CHARACTERISTIC_ID : null; - context.rule.setSubCharacteristicId(id); - context.rule.setRemediationFunction(null); - context.rule.setRemediationCoefficient(null); - context.rule.setRemediationOffset(null); - - } else if (StringUtils.equals(update.getDebtSubCharacteristicKey(), RuleUpdate.DEFAULT_DEBT_CHARACTERISTIC)) { - // reset to default - context.rule.setSubCharacteristicId(null); - context.rule.setRemediationFunction(null); - context.rule.setRemediationCoefficient(null); - context.rule.setRemediationOffset(null); - - } else { - if (ObjectUtils.equals(context.newCharacteristic.getId(), context.rule.getDefaultSubCharacteristicId())) { - // reset to default -> compatibility with SQALE - context.rule.setSubCharacteristicId(null); - context.rule.setRemediationFunction(null); - context.rule.setRemediationCoefficient(null); - context.rule.setRemediationOffset(null); - } else { - // override default - context.rule.setSubCharacteristicId(context.newCharacteristic.getId()); - } - } - } - private static void updateDebtRemediationFunction(RuleUpdate update, Context context) { - Integer subChar = context.rule.getSubCharacteristicId(); - boolean noChar = - (context.rule.getDefaultSubCharacteristicId() == null && subChar == null) || - (subChar != null && subChar.intValue() == RuleDto.DISABLED_CHARACTERISTIC_ID); - DebtRemediationFunction function = update.getDebtRemediationFunction(); - if (noChar || function == null) { + if (function == null) { context.rule.setRemediationFunction(null); context.rule.setRemediationCoefficient(null); context.rule.setRemediationOffset(null); @@ -328,7 +273,6 @@ public class RuleUpdater { */ private static class Context { private RuleDto rule; - private CharacteristicDto newCharacteristic; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleDoc.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleDoc.java index 9343e1e3b49..1a9d8c61098 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleDoc.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleDoc.java @@ -31,7 +31,6 @@ import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; -import org.sonar.api.server.debt.DebtCharacteristic; import org.sonar.api.server.debt.DebtRemediationFunction; import org.sonar.api.server.rule.RuleParamType; import org.sonar.server.rule.Rule; @@ -179,51 +178,12 @@ public class RuleDoc extends BaseDoc implements Rule { @Override public boolean debtOverloaded() { - return BooleanUtils.isTrue(isDebtCharacteristicOverridden()) || - BooleanUtils.isTrue(isDebtSubCharacteristicOverridden()) || - BooleanUtils.isTrue(isDebtRemediationFunctionOverridden()); - } - - @Override - @CheckForNull - public String defaultDebtCharacteristicKey() { - return (String) getNullableField(RuleNormalizer.RuleField.DEFAULT_CHARACTERISTIC.field()); - } - - @Override - @CheckForNull - public String defaultDebtSubCharacteristicKey() { - return (String) getNullableField(RuleNormalizer.RuleField.DEFAULT_SUB_CHARACTERISTIC.field()); - } - - @Override - @CheckForNull - public String debtCharacteristicKey() { - return (String) getNullableField(RuleNormalizer.RuleField.CHARACTERISTIC.field()); - } - - @Override - @CheckForNull - public String debtSubCharacteristicKey() { - return (String) getNullableField(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field()); - } - - @CheckForNull - public Boolean isDebtCharacteristicOverridden() { - return (Boolean) getNullableField(RuleNormalizer.RuleField.CHARACTERISTIC_OVERLOADED.field()); - } - - @CheckForNull - public Boolean isDebtSubCharacteristicOverridden() { - return (Boolean) getNullableField(RuleNormalizer.RuleField.SUB_CHARACTERISTIC_OVERLOADED.field()); + return BooleanUtils.isTrue(isDebtRemediationFunctionOverridden()); } @Override @CheckForNull public DebtRemediationFunction debtRemediationFunction() { - if (DebtCharacteristic.NONE.equals(getNullableField(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field()))) { - return null; - } final String function = getNullableField(RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.field()); if (function == null || function.isEmpty()) { return null; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java index 95e839b2fa4..4589a8fec2a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java @@ -54,7 +54,6 @@ import org.elasticsearch.index.query.SimpleQueryStringBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.elasticsearch.search.aggregations.bucket.global.GlobalBuilder; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder; import org.elasticsearch.search.sort.FieldSortBuilder; @@ -63,7 +62,6 @@ import org.elasticsearch.search.sort.SortOrder; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; -import org.sonar.api.server.debt.DebtCharacteristic; import org.sonar.db.rule.RuleDto; import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer; import org.sonar.server.rule.Rule; @@ -79,15 +77,12 @@ import static com.google.common.collect.Lists.newArrayList; public class RuleIndex extends BaseIndex { - private static final String FILTER_DEBT_CHARACTERISTICS = "debtCharacteristics"; - private static final String FILTER_HAS_DEBT_CHARACTERISTICS = "hasDebtCharacteristic"; public static final String FACET_LANGUAGES = "languages"; public static final String FACET_TAGS = "tags"; public static final String FACET_REPOSITORIES = "repositories"; public static final String FACET_SEVERITIES = "severities"; public static final String FACET_ACTIVE_SEVERITIES = "active_severities"; public static final String FACET_STATUSES = "statuses"; - public static final String FACET_DEBT_CHARACTERISTICS = "debt_characteristics"; public static final String FACET_OLD_DEFAULT = "true"; public static final List ALL_STATUSES_EXCEPT_REMOVED = ImmutableList.copyOf( @@ -216,11 +211,7 @@ public class RuleIndex extends BaseIndex { qb.should(this.termQuery(RuleNormalizer.RuleField.KEY, queryString, 15f)); qb.should(this.termQuery(RuleNormalizer.RuleField._KEY, queryString, 35f)); qb.should(this.termQuery(RuleNormalizer.RuleField.LANGUAGE, queryString, 3f)); - qb.should(this.termQuery(RuleNormalizer.RuleField.CHARACTERISTIC, queryString, 5f)); - qb.should(this.termQuery(RuleNormalizer.RuleField.SUB_CHARACTERISTIC, queryString, 5f)); qb.should(this.termQuery(RuleNormalizer.RuleField.ALL_TAGS, queryString, 10f)); - qb.should(this.termAnyQuery(RuleNormalizer.RuleField.CHARACTERISTIC, queryString, 1f)); - qb.should(this.termAnyQuery(RuleNormalizer.RuleField.SUB_CHARACTERISTIC, queryString, 1f)); qb.should(this.termAnyQuery(RuleNormalizer.RuleField.ALL_TAGS, queryString, 1f)); return qb; @@ -272,46 +263,6 @@ public class RuleIndex extends BaseIndex { FilterBuilders.termsFilter(RuleNormalizer.RuleField.ALL_TAGS.field(), query.getTags())); } - // Construct the debt filter on effective char and subChar - Collection debtCharacteristics = query.getDebtCharacteristics(); - if (debtCharacteristics != null && !debtCharacteristics.isEmpty()) { - filters.put(FILTER_DEBT_CHARACTERISTICS, - FilterBuilders.boolFilter().must( - FilterBuilders.orFilter( - // Match only when NONE (overridden) - FilterBuilders.andFilter( - FilterBuilders.notFilter( - FilterBuilders.termsFilter(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field(), DebtCharacteristic.NONE)), - FilterBuilders.orFilter( - FilterBuilders.termsFilter(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field(), debtCharacteristics), - FilterBuilders.termsFilter(RuleNormalizer.RuleField.CHARACTERISTIC.field(), debtCharacteristics)) - )) - )); - } - - // Debt char exist filter - Boolean hasDebtCharacteristic = query.getHasDebtCharacteristic(); - if (hasDebtCharacteristic != null) { - if (hasDebtCharacteristic) { - filters.put(FILTER_HAS_DEBT_CHARACTERISTICS, - // Match either characteristic is not disabled, either characteristic or default characteristic is defined on the rule - FilterBuilders.boolFilter() - .mustNot(FilterBuilders.termsFilter(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field(), DebtCharacteristic.NONE)) - .should(FilterBuilders.existsFilter(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field())) - .should(FilterBuilders.existsFilter(RuleNormalizer.RuleField.DEFAULT_SUB_CHARACTERISTIC.field()))); - } else { - filters.put(FILTER_HAS_DEBT_CHARACTERISTICS, - // Match either characteristic is disabled, either no characteristic or default characteristic is defined on the rule - FilterBuilders.orFilter( - FilterBuilders.termsFilter(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field(), DebtCharacteristic.NONE), - FilterBuilders.andFilter( - FilterBuilders.missingFilter(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field()), - FilterBuilders.missingFilter(RuleNormalizer.RuleField.DEFAULT_SUB_CHARACTERISTIC.field()) - ) - )); - } - } - if (query.getAvailableSince() != null) { filters.put("availableSince", FilterBuilders.rangeFilter(RuleNormalizer.RuleField.CREATED_AT.field()) .gte(query.getAvailableSince())); @@ -374,7 +325,7 @@ public class RuleIndex extends BaseIndex { addDefaultFacets(query, options, queryBuilder, filters, aggregations, stickyFacetBuilder); - addStatusFacetIfNeeded(query, options, aggregations, stickyFacetBuilder); + addStatusFacetIfNeeded(options, aggregations, stickyFacetBuilder); if (options.facets().contains(FACET_SEVERITIES)) { aggregations.put(FACET_SEVERITIES, @@ -382,14 +333,11 @@ public class RuleIndex extends BaseIndex { } addActiveSeverityFacetIfNeeded(query, options, aggregations, stickyFacetBuilder); - - addCharacteristicsFacetIfNeeded(query, options, aggregations, stickyFacetBuilder); - return aggregations; } - private void addStatusFacetIfNeeded(RuleQuery query, QueryContext options, Map aggregations, StickyFacetBuilder stickyFacetBuilder) { + private void addStatusFacetIfNeeded(QueryContext options, Map aggregations, StickyFacetBuilder stickyFacetBuilder) { if (options.facets().contains(FACET_STATUSES)) { BoolFilterBuilder facetFilter = stickyFacetBuilder.getStickyFacetFilter(RuleNormalizer.RuleField.STATUS.field()); AggregationBuilder statuses = AggregationBuilders.filter(FACET_STATUSES + "_filter") @@ -441,59 +389,6 @@ public class RuleIndex extends BaseIndex { } } - private void addCharacteristicsFacetIfNeeded(RuleQuery query, QueryContext options, Map aggregations, StickyFacetBuilder stickyFacetBuilder) { - - if (options.facets().contains(FACET_DEBT_CHARACTERISTICS)) { - /* - * Since this facet concerns 2 fields, we're using an aggregation structure like this: - * global aggregation - * |- sub-aggregation on characteristics: filter - * | |- classic sub-aggregation with top-n terms, excluding NONE - * | |- classic sub-aggregation with selected terms - * | |- terms aggregation on "NONE" - * | |- missing aggregation - * |- sub-aggregation on sub-characteristics: filter, excluding NONE - * |- classic sub-aggregation with top-n terms - * |- classic sub-aggregation with selected terms - */ - int characsSize = 10; - int subCharacsSize = 300; - Collection characsFromQuery = query.getDebtCharacteristics(); - Object[] selectedChars = characsFromQuery == null ? new Object[0] : characsFromQuery.toArray(); - BoolFilterBuilder stickyFacetFilter = stickyFacetBuilder.getStickyFacetFilter(FILTER_DEBT_CHARACTERISTICS, FILTER_HAS_DEBT_CHARACTERISTICS); - AggregationBuilder debtChar = AggregationBuilders.filter(FACET_DEBT_CHARACTERISTICS + "__chars") - .filter(stickyFacetFilter) - .subAggregation( - AggregationBuilders.terms(FACET_DEBT_CHARACTERISTICS + "__chars_top").field(RuleNormalizer.RuleField.CHARACTERISTIC.field()) - .exclude(DebtCharacteristic.NONE) - .size(characsSize)) - .subAggregation( - AggregationBuilders.terms(FACET_DEBT_CHARACTERISTICS + "__chars_selected").field(RuleNormalizer.RuleField.CHARACTERISTIC.field()) - .include(Joiner.on('|').join(selectedChars)) - .size(characsSize)) - .subAggregation( - AggregationBuilders.terms(FACET_DEBT_CHARACTERISTICS + "__chars_none").field(RuleNormalizer.RuleField.CHARACTERISTIC.field()) - .include(DebtCharacteristic.NONE) - .size(characsSize)) - .subAggregation( - AggregationBuilders.missing(FACET_DEBT_CHARACTERISTICS + "__chars_missing").field(RuleNormalizer.RuleField.CHARACTERISTIC.field())); - AggregationBuilder debtSubChar = AggregationBuilders.filter(FACET_DEBT_CHARACTERISTICS + "__subchars") - .filter(stickyFacetFilter) - .subAggregation( - AggregationBuilders.terms(FACET_DEBT_CHARACTERISTICS + "__subchars_top").field(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field()) - .exclude(DebtCharacteristic.NONE) - .size(subCharacsSize)) - .subAggregation( - AggregationBuilders.terms(FACET_DEBT_CHARACTERISTICS + "__chars_selected").field(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field()) - .include(Joiner.on('|').join(selectedChars)) - .size(subCharacsSize)); - GlobalBuilder debtCharTopLevel = AggregationBuilders.global(FACET_DEBT_CHARACTERISTICS) - .subAggregation(debtChar) - .subAggregation(debtSubChar); - aggregations.put(FACET_DEBT_CHARACTERISTICS, debtCharTopLevel); - } - } - protected void addDefaultFacets(RuleQuery query, QueryContext options, QueryBuilder queryBuilder, Map filters, Map aggregations, StickyFacetBuilder stickyFacetBuilder) { if (options.facets().contains(FACET_LANGUAGES) || options.facets().contains(FACET_OLD_DEFAULT)) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleNormalizer.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleNormalizer.java index fe508bd02a2..1ae6050a094 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleNormalizer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleNormalizer.java @@ -23,14 +23,17 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.elasticsearch.action.update.UpdateRequest; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; -import org.sonar.api.server.debt.DebtCharacteristic; import org.sonar.db.DbSession; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleParamDto; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.markdown.Markdown; import org.sonar.process.ProcessProperties; import org.sonar.server.db.DbClient; @@ -38,12 +41,6 @@ import org.sonar.server.search.BaseNormalizer; import org.sonar.server.search.IndexField; import org.sonar.server.search.Indexable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class RuleNormalizer extends BaseNormalizer { public static final class RuleParamField extends Indexable { @@ -190,62 +187,6 @@ public class RuleNormalizer extends BaseNormalizer { } update.put(RuleField.TEMPLATE_KEY.field(), templateKeyFieldValue); - // TODO Legacy ID in DTO should be Key - update.put(RuleField.CHARACTERISTIC.field(), null); - update.put(RuleField.SUB_CHARACTERISTIC.field(), null); - update.put(RuleField.DEFAULT_CHARACTERISTIC.field(), null); - update.put(RuleField.DEFAULT_SUB_CHARACTERISTIC.field(), null); - - update.put(RuleField.DEFAULT_CHARACTERISTIC.field(), null); - update.put(RuleField.DEFAULT_SUB_CHARACTERISTIC.field(), null); - - String defaultCharacteristicKey = null; - String defaultSubCharacteristicKey = null; - - Integer defaultSubCharacteristicId = rule.getDefaultSubCharacteristicId(); - if (defaultSubCharacteristicId != null) { - CharacteristicDto subCharacteristic = db.debtCharacteristicDao().selectById(session, defaultSubCharacteristicId); - if (subCharacteristic != null) { - Integer characteristicId = subCharacteristic.getParentId(); - if (characteristicId != null) { - CharacteristicDto characteristic = db.debtCharacteristicDao().selectById(characteristicId); - if (characteristic != null) { - defaultCharacteristicKey = characteristic.getKey(); - update.put(RuleField.DEFAULT_CHARACTERISTIC.field(), defaultCharacteristicKey); - defaultSubCharacteristicKey = subCharacteristic.getKey(); - update.put(RuleField.DEFAULT_SUB_CHARACTERISTIC.field(), defaultSubCharacteristicKey); - } - } - } - } - - Integer subCharacteristicId = rule.getSubCharacteristicId(); - if (subCharacteristicId != null) { - if (subCharacteristicId.equals(-1)) { - update.put(RuleField.CHARACTERISTIC.field(), DebtCharacteristic.NONE); - update.put(RuleField.SUB_CHARACTERISTIC.field(), DebtCharacteristic.NONE); - } else { - CharacteristicDto subCharacteristic = db.debtCharacteristicDao().selectById(session, subCharacteristicId); - if (subCharacteristic != null) { - Integer characteristicId = subCharacteristic.getParentId(); - if (characteristicId != null) { - CharacteristicDto characteristic = db.debtCharacteristicDao().selectById(characteristicId); - if (characteristic != null) { - update.put(RuleField.CHARACTERISTIC.field(), characteristic.getKey()); - update.put(RuleField.SUB_CHARACTERISTIC.field(), subCharacteristic.getKey()); - } - } - } - } - update.put(RuleField.CHARACTERISTIC_OVERLOADED.field(), true); - update.put(RuleField.SUB_CHARACTERISTIC_OVERLOADED.field(), true); - } else { - update.put(RuleField.CHARACTERISTIC.field(), defaultCharacteristicKey); - update.put(RuleField.SUB_CHARACTERISTIC.field(), defaultSubCharacteristicKey); - update.put(RuleField.CHARACTERISTIC_OVERLOADED.field(), false); - update.put(RuleField.SUB_CHARACTERISTIC_OVERLOADED.field(), false); - } - if (rule.getDefaultRemediationFunction() != null) { update.put(RuleField.DEFAULT_DEBT_FUNCTION_TYPE.field(), rule.getDefaultRemediationFunction()); update.put(RuleField.DEFAULT_DEBT_FUNCTION_COEFFICIENT.field(), rule.getDefaultRemediationCoefficient()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleQuery.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleQuery.java index a09f9d78d08..45c1d847f4f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleQuery.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleQuery.java @@ -39,8 +39,6 @@ public class RuleQuery { private Collection severities; private Collection statuses; private Collection tags; - private Collection debtCharacteristics; - private Boolean hasDebtCharacteristic; private Boolean activation; private String qProfileKey; private Collection inheritance; @@ -160,26 +158,6 @@ public class RuleQuery { return this; } - @CheckForNull - public Collection getDebtCharacteristics() { - return debtCharacteristics; - } - - public RuleQuery setDebtCharacteristics(@Nullable Collection debtCharacteristics) { - this.debtCharacteristics = debtCharacteristics; - return this; - } - - @CheckForNull - public Boolean getHasDebtCharacteristic() { - return hasDebtCharacteristic; - } - - public RuleQuery setHasDebtCharacteristic(@Nullable Boolean b) { - this.hasDebtCharacteristic = b; - return this; - } - @CheckForNull public Collection getInheritance() { return inheritance; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java index 268b1ba805a..4a78923cef9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java @@ -19,21 +19,11 @@ */ package org.sonar.server.rule.ws; -import com.google.common.collect.LinkedListMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; import java.util.Locale; -import org.apache.commons.lang.builder.CompareToBuilder; import org.sonar.api.i18n.I18n; import org.sonar.api.resources.Language; import org.sonar.api.resources.Languages; import org.sonar.api.rule.RuleStatus; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.DebtModel; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; @@ -53,16 +43,14 @@ public class AppAction implements RulesWsAction { private final Languages languages; private final RuleRepositories ruleRepositories; private final I18n i18n; - private final DebtModel debtModel; private final QProfileLoader profileLoader; private final UserSession userSession; public AppAction(Languages languages, RuleRepositories ruleRepositories, I18n i18n, - DebtModel debtModel, QProfileLoader profileLoader, UserSession userSession) { + QProfileLoader profileLoader, UserSession userSession) { this.languages = languages; this.ruleRepositories = ruleRepositories; this.i18n = i18n; - this.debtModel = debtModel; this.profileLoader = profileLoader; this.userSession = userSession; } @@ -86,7 +74,6 @@ public class AppAction implements RulesWsAction { addLanguages(json); addRuleRepositories(json); addStatuses(json); - addCharacteristics(json); json.endObject().close(); } @@ -144,61 +131,4 @@ public class AppAction implements RulesWsAction { json.endObject(); } - private void addCharacteristics(JsonWriter json) { - - List rootCharacs = sortRootCaracs(); - - Multimap subByCaracId = ventilateSubCaracs(rootCharacs); - - json.name("characteristics").beginArray(); - for (DebtCharacteristic rootCarac : rootCharacs) { - json.beginObject() - .prop("key", rootCarac.key()) - .prop("name", rootCarac.name()) - .endObject(); - for (DefaultDebtCharacteristic child : sortSubCaracs(subByCaracId, rootCarac)) { - json.beginObject() - .prop("key", child.key()) - .prop("name", child.name()) - .prop("parent", rootCarac.key()) - .endObject(); - } - } - json.endArray(); - } - - private List sortRootCaracs() { - List rootCharacs = Lists.newArrayList(debtModel.characteristics()); - Collections.sort(rootCharacs, new Comparator() { - @Override - public int compare(DebtCharacteristic o1, DebtCharacteristic o2) { - return new CompareToBuilder().append(o1.order(), o2.order()).toComparison(); - } - }); - return rootCharacs; - - } - - private Multimap ventilateSubCaracs(List rootCharacs) { - Multimap subByCaracId = LinkedListMultimap.create(rootCharacs.size()); - - for (DebtCharacteristic carac : debtModel.allCharacteristics()) { - DefaultDebtCharacteristic fullCarac = (DefaultDebtCharacteristic) carac; - if (carac.isSub()) { - subByCaracId.put(fullCarac.parentId(), fullCarac); - } - } - return subByCaracId; - } - - private List sortSubCaracs(Multimap subByCaracId, DebtCharacteristic rootCarac) { - List subCaracs = Lists.newArrayList(subByCaracId.get(((DefaultDebtCharacteristic) rootCarac).id())); - Collections.sort(subCaracs, new Comparator() { - @Override - public int compare(DefaultDebtCharacteristic o1, DefaultDebtCharacteristic o2) { - return o1.name().compareTo(o2.name()); - } - }); - return subCaracs; - } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleMapping.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleMapping.java index ae6b011f533..88219d1e768 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleMapping.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleMapping.java @@ -20,12 +20,13 @@ package org.sonar.server.rule.ws; import com.google.common.base.Function; -import com.google.common.collect.Maps; +import java.util.Collections; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.sonar.api.resources.Language; import org.sonar.api.resources.Languages; import org.sonar.api.rule.RuleKey; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.DebtModel; import org.sonar.api.server.debt.DebtRemediationFunction; import org.sonar.api.utils.text.JsonWriter; import org.sonar.markdown.Markdown; @@ -41,14 +42,6 @@ import org.sonar.server.user.UserSession; import org.sonarqube.ws.Common; import org.sonarqube.ws.Rules; -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import java.util.Collections; -import java.util.Map; -import java.util.Set; - import static com.google.common.collect.FluentIterable.from; import static org.sonar.api.utils.DateUtils.formatDateTime; @@ -57,13 +50,11 @@ import static org.sonar.api.utils.DateUtils.formatDateTime; */ public class RuleMapping extends BaseMapping { - private final DebtModel debtModel; private final Languages languages; private final MacroInterpreter macroInterpreter; - public RuleMapping(final Languages languages, final MacroInterpreter macroInterpreter, final DebtModel debtModel, UserSession userSession) { + public RuleMapping(final Languages languages, final MacroInterpreter macroInterpreter, UserSession userSession) { super(userSession); - this.debtModel = debtModel; this.languages = languages; this.macroInterpreter = macroInterpreter; @@ -110,8 +101,6 @@ public class RuleMapping extends BaseMapping { map("defaultDebtRemFn", new IndexStringMapper("defaultDebtRemFnOffset", RuleNormalizer.RuleField.DEFAULT_DEBT_FUNCTION_OFFSET.field())); map("effortToFixDescription", RuleNormalizer.RuleField.FIX_DESCRIPTION.field()); map("debtOverloaded", new SimpleMapper( - RuleNormalizer.RuleField.CHARACTERISTIC_OVERLOADED.field(), - RuleNormalizer.RuleField.SUB_CHARACTERISTIC_OVERLOADED.field(), RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE_OVERLOADED.field())); map("debtRemFn", new IndexStringMapper("debtRemFnType", RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.field())); @@ -131,8 +120,6 @@ public class RuleMapping extends BaseMapping { ruleResponse.setKey(ruleDoc.key().toString()); setRepository(ruleResponse, ruleDoc, fieldsToReturn); - setDebtCharacteristicNames(ruleResponse, ruleDoc, queryContext, context); - setDebtSubCharacteristicNames(ruleResponse, ruleDoc, queryContext, context); setName(ruleResponse, ruleDoc, fieldsToReturn); setStatus(ruleResponse, ruleDoc, fieldsToReturn); setTags(ruleResponse, ruleDoc, fieldsToReturn); @@ -150,8 +137,6 @@ public class RuleMapping extends BaseMapping { setDebtRemediationFunctionFields(ruleResponse, ruleDoc, fieldsToReturn); setDefaultDebtRemediationFunctionFields(ruleResponse, ruleDoc, fieldsToReturn); setIsDebtOverloaded(ruleResponse, ruleDoc, fieldsToReturn); - setDefaultDebtChar(ruleResponse, ruleDoc, fieldsToReturn); - setDefaultDebtSubChar(ruleResponse, ruleDoc, fieldsToReturn); setEffortToFixDescription(ruleResponse, ruleDoc, fieldsToReturn); return ruleResponse.build(); @@ -169,18 +154,6 @@ public class RuleMapping extends BaseMapping { } } - private static void setDefaultDebtSubChar(Rules.Rule.Builder ruleResponse, Rule ruleDoc, Set fieldsToReturn) { - if (shouldReturnField(fieldsToReturn, "defaultDebtSubChar") && ruleDoc.defaultDebtSubCharacteristicKey() != null) { - ruleResponse.setDefaultDebtSubChar(ruleDoc.defaultDebtSubCharacteristicKey()); - } - } - - private static void setDefaultDebtChar(Rules.Rule.Builder ruleResponse, Rule ruleDoc, Set fieldsToReturn) { - if (shouldReturnField(fieldsToReturn, "defaultDebtChar") && ruleDoc.defaultDebtCharacteristicKey() != null) { - ruleResponse.setDefaultDebtChar(ruleDoc.defaultDebtCharacteristicKey()); - } - } - private static void setIsDebtOverloaded(Rules.Rule.Builder ruleResponse, Rule ruleDoc, Set fieldsToReturn) { if (shouldReturnField(fieldsToReturn, "debtOverloaded")) { ruleResponse.setDebtOverloaded(ruleToOverloaded(ruleDoc)); @@ -221,27 +194,6 @@ public class RuleMapping extends BaseMapping { } } - private void setDebtCharacteristicNames(Rules.Rule.Builder ruleResponse, Rule ruleDoc, @Nullable QueryContext queryContext, RuleMappingContext context) { - if (needDebtCharacteristicNames(queryContext)) { - String debtCharacteristicKey = ruleDoc.debtCharacteristicKey(); - if (debtCharacteristicKey != null) { - // load debt characteristics if requested - context.add(debtModel.characteristicByKey(debtCharacteristicKey)); - buildCharacteristicRuleResponse(ruleResponse, ruleDoc, context); - } - } - } - - private void setDebtSubCharacteristicNames(Rules.Rule.Builder ruleResponse, Rule ruleDoc, @Nullable QueryContext queryContext, RuleMappingContext context) { - if (needDebtSubCharacteristicNames(queryContext)) { - String debtSubCharacteristicKey = ruleDoc.debtSubCharacteristicKey(); - if (debtSubCharacteristicKey != null) { - context.add(debtModel.characteristicByKey(debtSubCharacteristicKey)); - buildDebtSubCharacteristicRuleResponse(ruleResponse, ruleDoc, context); - } - } - } - private static Set fieldsToReturn(@Nullable QueryContext queryContext) { return queryContext == null ? Collections.emptySet() : queryContext.getFieldsToReturn(); } @@ -358,63 +310,6 @@ public class RuleMapping extends BaseMapping { return fieldsToReturn.isEmpty() || fieldsToReturn.contains(fieldName); } - private static void buildCharacteristicRuleResponse(Rules.Rule.Builder ruleResponse, Rule ruleDoc, RuleMappingContext context) { - String ruleCharacteristic = ruleToCharacteristic(ruleDoc); - if (ruleCharacteristic != null) { - ruleResponse.setDebtChar(ruleCharacteristic); - String ruleCharacteristicName = ruleToCharacteristicName(ruleDoc, context); - if (ruleCharacteristicName != null) { - ruleResponse.setDebtCharName(ruleCharacteristicName); - } - } - } - - private static void buildDebtSubCharacteristicRuleResponse(Rules.Rule.Builder ruleResponse, Rule ruleDoc, RuleMappingContext context) { - String ruleSubCharacteristic = ruleToSubCharacteristic(ruleDoc); - if (ruleSubCharacteristic != null) { - ruleResponse.setDebtSubChar(ruleSubCharacteristic); - String ruleSubCharacteristicName = ruleToSubCharacteristicName(ruleDoc, context); - if (ruleSubCharacteristicName != null) { - ruleResponse.setDebtSubCharName(ruleSubCharacteristicName); - } - } - } - - private static boolean needDebtCharacteristicNames(@Nullable QueryContext context) { - return context == null || context.getFieldsToReturn().contains("debtCharName"); - } - - private static boolean needDebtSubCharacteristicNames(@Nullable QueryContext context) { - return context == null || context.getFieldsToReturn().contains("debtSubCharName"); - } - - @CheckForNull - private static String ruleToCharacteristic(Rule rule) { - String debtCharacteristicKey = rule.debtCharacteristicKey(); - if (debtCharacteristicKey != null && !DebtCharacteristic.NONE.equals(debtCharacteristicKey)) { - return debtCharacteristicKey; - } - return null; - } - - @CheckForNull - private static String ruleToSubCharacteristic(Rule rule) { - String debtSubCharacteristicKey = rule.debtSubCharacteristicKey(); - if (debtSubCharacteristicKey != null && !DebtCharacteristic.NONE.equals(debtSubCharacteristicKey)) { - return debtSubCharacteristicKey; - } - - return null; - } - - private static String ruleToCharacteristicName(Rule rule, RuleMappingContext context) { - return context.debtCharacteristicName(rule.debtCharacteristicKey()); - } - - private static String ruleToSubCharacteristicName(Rule rule, RuleMappingContext context) { - return context.debtCharacteristicName(rule.debtSubCharacteristicKey()); - } - private static boolean ruleToOverloaded(Rule rule) { return rule.debtOverloaded(); } @@ -453,16 +348,4 @@ public class RuleMapping extends BaseMapping { } class RuleMappingContext { - private final Map debtCharacteristicNamesByKey = Maps.newHashMap(); - - @CheckForNull - public String debtCharacteristicName(@Nullable String key) { - return debtCharacteristicNamesByKey.get(key); - } - - void add(@Nullable DebtCharacteristic c) { - if (c != null) { - debtCharacteristicNamesByKey.put(c.key(), c.name()); - } - } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/SearchAction.java index ed55300bff9..e504a565e8a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/SearchAction.java @@ -164,7 +164,6 @@ public class SearchAction implements RulesWsAction { RuleIndex.FACET_LANGUAGES, RuleIndex.FACET_REPOSITORIES, RuleIndex.FACET_TAGS, - RuleIndex.FACET_DEBT_CHARACTERISTICS, RuleIndex.FACET_SEVERITIES, RuleIndex.FACET_ACTIVE_SEVERITIES, RuleIndex.FACET_STATUSES, @@ -289,8 +288,6 @@ public class SearchAction implements RulesWsAction { query.setAvailableSince(request.paramAsDate(PARAM_AVAILABLE_SINCE)); query.setStatuses(request.paramAsEnums(PARAM_STATUSES, RuleStatus.class)); query.setLanguages(request.paramAsStrings(PARAM_LANGUAGES)); - query.setDebtCharacteristics(request.paramAsStrings(PARAM_DEBT_CHARACTERISTICS)); - query.setHasDebtCharacteristic(request.paramAsBoolean(PARAM_HAS_DEBT_CHARACTERISTIC)); query.setActivation(request.paramAsBoolean(PARAM_ACTIVATION)); query.setQProfileKey(request.param(PARAM_QPROFILE)); query.setTags(request.paramAsStrings(PARAM_TAGS)); @@ -378,7 +375,6 @@ public class SearchAction implements RulesWsAction { } protected void writeFacets(SearchResponse.Builder response, Request request, QueryContext context, Result results) { - addMandatoryFacetValues(results, RuleIndex.FACET_DEBT_CHARACTERISTICS, request.paramAsStrings(PARAM_DEBT_CHARACTERISTICS)); addMandatoryFacetValues(results, RuleIndex.FACET_LANGUAGES, request.paramAsStrings(PARAM_LANGUAGES)); addMandatoryFacetValues(results, RuleIndex.FACET_REPOSITORIES, request.paramAsStrings(PARAM_REPOSITORIES)); addMandatoryFacetValues(results, RuleIndex.FACET_STATUSES, RuleIndex.ALL_STATUSES_EXCEPT_REMOVED); @@ -386,8 +382,6 @@ public class SearchAction implements RulesWsAction { addMandatoryFacetValues(results, RuleIndex.FACET_ACTIVE_SEVERITIES, Severity.ALL); addMandatoryFacetValues(results, RuleIndex.FACET_TAGS, request.paramAsStrings(PARAM_TAGS)); - mergeNoneAndEmptyBucketOnCharacteristics(results); - Common.Facet.Builder facet = Common.Facet.newBuilder(); Common.FacetValue.Builder value = Common.FacetValue.newBuilder(); for (String facetName : context.facets()) { @@ -407,28 +401,6 @@ public class SearchAction implements RulesWsAction { } } - protected void mergeNoneAndEmptyBucketOnCharacteristics(Result results) { - if (results.getFacets().containsKey(RuleIndex.FACET_DEBT_CHARACTERISTICS)) { - Collection characValues = results.getFacetValues(RuleIndex.FACET_DEBT_CHARACTERISTICS); - if (characValues == null) { - return; - } - - long mergedCount = 0L; - Iterator characIterator = characValues.iterator(); - while (characIterator.hasNext()) { - FacetValue characValue = characIterator.next(); - if ("".equals(characValue.getKey()) || DebtCharacteristic.NONE.equals(characValue.getKey())) { - mergedCount += characValue.getValue(); - characIterator.remove(); - } - } - - FacetValue mergedNoneValue = new FacetValue(DebtCharacteristic.NONE, mergedCount); - characValues.add(mergedNoneValue); - } - } - private static void addZeroFacetsForSelectedItems(Common.Facet.Builder facet, Request request, String facetName, Set itemsFromFacets) { List requestParams = request.paramAsStrings(facetName); if (requestParams != null) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/UpdateAction.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/UpdateAction.java index 44039b5cdb0..7a2380c10b2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/UpdateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/UpdateAction.java @@ -87,9 +87,8 @@ public class UpdateAction implements RulesWsAction { .setExampleValue("my *note*"); action.createParam(PARAM_DEBT_SUB_CHARACTERISTIC) - .setDescription("Optional key of the debt sub-characteristic. Use empty value to unset (-> none) or '" + - RuleUpdate.DEFAULT_DEBT_CHARACTERISTIC + "' to revert to default sub-characteristic.") - .setExampleValue("FAULT_TOLERANCE"); + .setDescription("Debt characteristics are no more supported. This parameter is ignored.") + .setDeprecatedSince("5.5"); action.createParam(PARAM_DEBT_REMEDIATION_FN_TYPE) .setPossibleValues(DebtRemediationFunction.Type.values()); @@ -198,11 +197,7 @@ public class UpdateAction implements RulesWsAction { } private void readDebt(Request request, RuleUpdate update) { - String value = request.param(PARAM_DEBT_SUB_CHARACTERISTIC); - if (value != null) { - update.setDebtSubCharacteristic(value); - } - value = request.param(PARAM_DEBT_REMEDIATION_FN_TYPE); + String value = request.param(PARAM_DEBT_REMEDIATION_FN_TYPE); if (value != null) { if (StringUtils.isBlank(value)) { update.setDebtRemediationFunction(null); diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java deleted file mode 100644 index 7d5e97308cb..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.startup; - - -import org.sonar.api.utils.log.Loggers; -import org.sonar.api.utils.log.Profiler; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.server.debt.DebtModelBackup; - -public class RegisterDebtModel { - - private final CharacteristicDao dao; - private final DebtModelBackup debtModelBackup; - - public RegisterDebtModel(CharacteristicDao dao, DebtModelBackup debtModelBackup) { - this.dao = dao; - this.debtModelBackup = debtModelBackup; - } - - public void start() { - Profiler profiler = Profiler.create(Loggers.get(getClass())).startInfo("Register technical debt model"); - if (dao.selectEnabledCharacteristics().isEmpty()) { - debtModelBackup.reset(); - } - profiler.stopDebug(); - } - -} diff --git a/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/hotspot_metric.html.erb b/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/hotspot_metric.html.erb index bf2872762d8..bd08df4bf43 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/hotspot_metric.html.erb +++ b/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/hotspot_metric.html.erb @@ -15,7 +15,7 @@ snapshots_values[:root_sid] = (@snapshot.root_snapshot_id || @snapshot.id) snapshots_values[:path]="#{@snapshot.path}#{@snapshot.id}.%" - measures_conditions = ["project_measures.rule_id IS NULL", "project_measures.characteristic_id IS NULL", "project_measures.person_id IS NULL"] + measures_conditions = ["project_measures.rule_id IS NULL", "project_measures.person_id IS NULL"] measures_values = {} measures_conditions << "project_measures.metric_id = :m_id" measures_values[:m_id] = metric.id @@ -82,4 +82,4 @@ <% end %> -<% end %> \ No newline at end of file +<% end %> diff --git a/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/technical_debt_pyramid.html.erb b/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/technical_debt_pyramid.html.erb deleted file mode 100644 index 6f5464e92ea..00000000000 --- a/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/technical_debt_pyramid.html.erb +++ /dev/null @@ -1,156 +0,0 @@ -<% - technical_debt = measure('sqale_index') - - root_characteristics = Internal.debt.characteristics().to_a - - should_display_diff_measures = dashboard_configuration.selected_period? && technical_debt.variation(dashboard_configuration.period_index)!=nil - if technical_debt.nil? || root_characteristics.empty? -%> - -

<%= message('widget.technical_debt_pyramid.name') -%>

- <%= message('widget.technical_debt_pyramid.no_info_available') -%> - -<% - else -%> - - - - - - - - - - - - <% - measures_by_characteristic_id={} - ProjectMeasure.find(:all, - :conditions => ['characteristic_id IN (?) AND snapshot_id=? AND metric_id=?', - root_characteristics.map{|c| c.id}, @snapshot.id, technical_debt.metric().id]).each do |measure| - measures_by_characteristic_id[measure.characteristic_id]=measure - end - - total = technical_debt.value - cumulated=total - - if should_display_diff_measures - diff_by_characteristic_id={} - total_diff = 0; - root_characteristics.each do |c| - measure = measures_by_characteristic_id[c.id] - if measure && measure.variation(dashboard_configuration.period_index) - diff_by_characteristic_id[c.id] = measure.variation(dashboard_configuration.period_index) - total_diff += measure.variation(dashboard_configuration.period_index) - end - end - end - - root_characteristics.sort_by {|characteristic| characteristic.order}.each do |characteristic| - measure=measures_by_characteristic_id[characteristic.id] - value=(measure && measure.value ? measure.value : 0) - total_size=(total>0 ? (100*cumulated/total).round(3): 0) - value_size=(cumulated>0 ? (100*value/cumulated).round(3): 100) - drilldown_url = url_for_drilldown('sqale_index', :characteristic => characteristic.key) - %> - - - - - - - <% - cumulated-=value - end - %> - -
-

<%= message('widget.technical_debt_pyramid.name') -%>

-
-

 <%= message('widget.technical_debt_pyramid.technical_debt') -%>

-
-

<%= message('widget.technical_debt_pyramid.total') -%>

-
<%= h(characteristic.name) -%> - -
-
-
-
-
- <%= Internal.i18n.formatLongDuration(value.to_i, 'SHORT') -%> - <% if should_display_diff_measures %> - <% if diff_by_characteristic_id[characteristic.id] %> - <%= format_variation(measure) -%> - <% else %> - (+0) - <% end %> - <% end %> - - <%= Internal.i18n.formatLongDuration(cumulated.to_i, 'SHORT') -%> - <% - if should_display_diff_measures - css_style = 'var' - css_style += 'b' if total_diff < 0 - css_style += 'w' if total_diff > 0 - diff_to_display = (total_diff < 0 ? '' : '+') + Internal.i18n.formatLongDuration(total_diff.to_i, 'SHORT') - %> - (<%= diff_to_display -%>) - <% - total_diff -= diff_by_characteristic_id[characteristic.id] if diff_by_characteristic_id[characteristic.id] - end - %> -
- -<% end %> diff --git a/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/time_machine.html.erb b/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/time_machine.html.erb index 3c00988eae9..3271038a2f0 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/time_machine.html.erb +++ b/server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/time_machine.html.erb @@ -28,7 +28,7 @@ sids = snapshots.collect { |s| s.id }.uniq measures=ProjectMeasure.find(:all, :conditions => - ["snapshot_id IN (:snapshot_id) AND metric_id IN (:metric_id) AND rule_id IS NULL AND characteristic_id IS NULL AND person_id IS NULL", + ["snapshot_id IN (:snapshot_id) AND metric_id IN (:metric_id) AND rule_id IS NULL AND person_id IS NULL", {:snapshot_id => sids, :metric_id => metric_ids} ] ) diff --git a/server/sonar-server/src/main/resources/org/sonar/server/platform/ws/l10n-index-example.json b/server/sonar-server/src/main/resources/org/sonar/server/platform/ws/l10n-index-example.json index 855fcf1c0ef..eb7071f7e9d 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/platform/ws/l10n-index-example.json +++ b/server/sonar-server/src/main/resources/org/sonar/server/platform/ws/l10n-index-example.json @@ -78,7 +78,6 @@ "rules.not_found": "The rule \"{0}\" does not exist", "coding_rules.create": "Create", "days": "Days", - "widget.technical_debt_pyramid.total": "Total", "email_configuration.test.send": "Send Test Email", "update_key.replace": "Replace", "views.invalid.criteria": "Only one criteria can be used (regexp, language or manual measure)", diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/debt/CharacteristicImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/debt/CharacteristicImplTest.java deleted file mode 100644 index 880a858264c..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/debt/CharacteristicImplTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CharacteristicImplTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Test - public void test_getter_and_setter() throws Exception { - CharacteristicImpl characteristic = new CharacteristicImpl(1, "PORTABILITY", null); - assertThat(characteristic.getId()).isEqualTo(1); - assertThat(characteristic.getKey()).isEqualTo("PORTABILITY"); - assertThat(characteristic.getParentId()).isNull(); - } - - @Test - public void test_to_string() throws Exception { - assertThat(new CharacteristicImpl(1, "PORTABILITY", null).toString()).isEqualTo("Characteristic{id=1, key='PORTABILITY', parentId=null}"); - } - - @Test - public void test_equals_and_hashcode() throws Exception { - CharacteristicImpl characteristic = new CharacteristicImpl(1, "PORTABILITY", null); - CharacteristicImpl sameCharacteristic = new CharacteristicImpl(1, "PORTABILITY", null); - CharacteristicImpl anotherCharacteristic = new CharacteristicImpl(2, "MAINTABILITY", null); - - assertThat(characteristic).isEqualTo(characteristic); - assertThat(characteristic).isEqualTo(sameCharacteristic); - assertThat(characteristic).isNotEqualTo(anotherCharacteristic); - assertThat(characteristic).isNotEqualTo(null); - assertThat(characteristic).isNotEqualTo("foo"); - - assertThat(characteristic.hashCode()).isEqualTo(characteristic.hashCode()); - assertThat(characteristic.hashCode()).isEqualTo(sameCharacteristic.hashCode()); - assertThat(characteristic.hashCode()).isNotEqualTo(anotherCharacteristic.hashCode()); - } - - @Test - public void creating_a_new_characteristic_with_null_key_throws_a_NPE() { - thrown.expect(NullPointerException.class); - thrown.expectMessage("key cannot be null"); - - new CharacteristicImpl(1, null, null); - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderImplTest.java deleted file mode 100644 index 71f75a34fd3..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderImplTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -import java.util.Arrays; -import java.util.Collections; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; - -public class DebtModelHolderImplTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private static final Characteristic PORTABILITY = new CharacteristicImpl(1, "PORTABILITY", null); - private static final Characteristic COMPILER_RELATED_PORTABILITY = new CharacteristicImpl(2, "COMPILER_RELATED_PORTABILITY", 1); - private static final Characteristic HARDWARE_RELATED_PORTABILITY = new CharacteristicImpl(3, "HARDWARE_RELATED_PORTABILITY", 1); - - private static final Characteristic MAINTAINABILITY = new CharacteristicImpl(4, "MAINTAINABILITY", null); - private static final Characteristic READABILITY = new CharacteristicImpl(5, "READABILITY", null); - - DebtModelHolderImpl underTest = new DebtModelHolderImpl(); - - @Test - public void add_and_get_characteristics() { - underTest.addCharacteristics(PORTABILITY, Arrays.asList(COMPILER_RELATED_PORTABILITY, HARDWARE_RELATED_PORTABILITY)); - underTest.addCharacteristics(MAINTAINABILITY, singletonList(READABILITY)); - - assertThat(underTest.getRootCharacteristics()).hasSize(2); - assertThat(underTest.getCharacteristicById(PORTABILITY.getId()).getKey()).isEqualTo("PORTABILITY"); - assertThat(underTest.getCharacteristicById(COMPILER_RELATED_PORTABILITY.getId()).getKey()).isEqualTo("COMPILER_RELATED_PORTABILITY"); - } - - @Test - public void add_characteristics_fail_with_NPE_if_root_characteristic_is_null() { - thrown.expect(NullPointerException.class); - thrown.expectMessage("rootCharacteristic cannot be null"); - - underTest.addCharacteristics(null, singletonList(COMPILER_RELATED_PORTABILITY)); - } - - @Test - public void add_characteristics_fail_with_NPE_if_sub_characteristics_are_null() { - thrown.expect(NullPointerException.class); - thrown.expectMessage("subCharacteristics cannot be null"); - - underTest.addCharacteristics(PORTABILITY, null); - } - - @Test - public void add_characteristics_fail_with_IAE_if_sub_characteristics_are_empty() { - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage("subCharacteristics cannot be empty"); - - underTest.addCharacteristics(PORTABILITY, Collections.emptyList()); - } - - @Test - public void get_root_characteristics() { - underTest.addCharacteristics(PORTABILITY, Arrays.asList(COMPILER_RELATED_PORTABILITY, READABILITY)); - underTest.addCharacteristics(MAINTAINABILITY, singletonList(READABILITY)); - - assertThat(underTest.getRootCharacteristics()).hasSize(2); - } - - @Test - public void getCharacteristicById_throws_ISE_when_not_initialized() { - thrown.expect(IllegalStateException.class); - thrown.expectMessage("Characteristics have not been initialized yet"); - - underTest.getCharacteristicById(1); - } - - @Test - public void getRootCharacteristics_throws_ISE_when_not_initialized() { - thrown.expect(IllegalStateException.class); - thrown.expectMessage("Characteristics have not been initialized yet"); - - underTest.getRootCharacteristics(); - } - - @Test - public void has_characteristic() throws Exception { - underTest.addCharacteristics(PORTABILITY, Arrays.asList(COMPILER_RELATED_PORTABILITY, READABILITY)); - - assertThat(underTest.hasCharacteristicById(PORTABILITY.getId())).isTrue(); - assertThat(underTest.hasCharacteristicById(123)).isFalse(); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderRule.java deleted file mode 100644 index 413b71eb572..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/debt/DebtModelHolderRule.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.debt; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.junit.After; -import org.junit.rules.ExternalResource; - -import static com.google.common.base.Preconditions.checkArgument; -import static java.util.Objects.requireNonNull; - -/** - * Rule to easily use a {@link DebtModelHolder} in a test. - * List of characteristics will be reset at the end of each test case. - * - * It will not fail if no characteristic have been set. - */ -public class DebtModelHolderRule extends ExternalResource implements DebtModelHolder { - - private final List rootCharacteristics = new ArrayList<>(); - private final Map characteristicById = new HashMap<>(); - - @After - public void after() { - rootCharacteristics.clear(); - characteristicById.clear(); - } - - public DebtModelHolderRule addCharacteristics(Characteristic rootCharacteristic, Iterable subCharacteristics) { - requireNonNull(rootCharacteristic, "rootCharacteristic cannot be null"); - requireNonNull(subCharacteristics, "subCharacteristics cannot be null"); - checkArgument(subCharacteristics.iterator().hasNext(), "subCharacteristics cannot be empty"); - - rootCharacteristics.add(rootCharacteristic); - characteristicById.put(rootCharacteristic.getId(), rootCharacteristic); - for (Characteristic characteristic : subCharacteristics) { - characteristicById.put(characteristic.getId(), characteristic); - } - return this; - } - - @Override - public Characteristic getCharacteristicById(int id) { - Characteristic characteristic = characteristicById.get(id); - if (characteristic == null) { - throw new IllegalStateException("Debt characteristic with id [" + id + "] does not exist"); - } - return characteristic; - } - - @Override - public boolean hasCharacteristicById(int id) { - return characteristicById.get(id) != null; - } - - @Override - public List getRootCharacteristics() { - return rootCharacteristics; - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtAggregatorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtAggregatorTest.java index 490074b8a52..76f6400f7f2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtAggregatorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtAggregatorTest.java @@ -28,13 +28,10 @@ import org.sonar.core.issue.DefaultIssue; import org.sonar.db.rule.RuleTesting; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ReportComponent; -import org.sonar.server.computation.debt.CharacteristicImpl; -import org.sonar.server.computation.debt.DebtModelHolderRule; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepositoryRule; import org.sonar.server.computation.metric.MetricRepositoryRule; -import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat; import static org.sonar.api.issue.Issue.RESOLUTION_FIXED; @@ -42,56 +39,21 @@ import static org.sonar.api.measures.CoreMetrics.TECHNICAL_DEBT_KEY; public class DebtAggregatorTest { - /** - * Root characteristic - */ - static final int PORTABILITY_ID = 1000; - - /** - * Sub-characteristic of {@link #PORTABILITY_ID} - */ - static final int PORTABILITY_SOFT_ID = 1001; - - /** - * Sub-characteristic of {@link #PORTABILITY_ID} - */ - static final int PORTABILITY_HARD_ID = 1002; - - /** - * Root characteristic - */ - static final int RELIABILITY_ID = 1003; - - /** - * Sub-characteristic of {@link #RELIABILITY_ID} - */ - static final int DATA_RELIABILITY_ID = 1004; - static final Component FILE = ReportComponent.builder(Component.Type.FILE, 1).build(); static final Component PROJECT = ReportComponent.builder(Component.Type.PROJECT, 2).addChildren(FILE).build(); - static final DumbRule RULE = new DumbRule(RuleTesting.XOO_X1).setId(100).setSubCharacteristicId(PORTABILITY_SOFT_ID); + static final DumbRule RULE = new DumbRule(RuleTesting.XOO_X1).setId(100); @org.junit.Rule public RuleRepositoryRule ruleRepository = new RuleRepositoryRule().add(RULE); - @org.junit.Rule - public DebtModelHolderRule debtModelHolder = new DebtModelHolderRule() - .addCharacteristics( - new CharacteristicImpl(PORTABILITY_ID, "PORTABILITY", null), - asList(new CharacteristicImpl(PORTABILITY_SOFT_ID, "PORTABILITY_HARDWARE", PORTABILITY_ID), - new CharacteristicImpl(PORTABILITY_HARD_ID, "PORTABILITY_SOFTWARE", PORTABILITY_ID))) - .addCharacteristics(new CharacteristicImpl(RELIABILITY_ID, "RELIABILITY", null), - asList(new CharacteristicImpl(DATA_RELIABILITY_ID, "DATA_RELIABILITY", RELIABILITY_ID)) - ); - @org.junit.Rule public MetricRepositoryRule metricRepository = new MetricRepositoryRule().add(200, CoreMetrics.TECHNICAL_DEBT); @org.junit.Rule public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(PROJECT, metricRepository); - DebtAggregator underTest = new DebtAggregator(ruleRepository, debtModelHolder, metricRepository, measureRepository); + DebtAggregator underTest = new DebtAggregator(ruleRepository, metricRepository, measureRepository); @Test public void sum_debt_of_unresolved_issues() { @@ -112,12 +74,6 @@ public class DebtAggregatorTest { // debt by rule assertThat(debtRuleMeasure(FILE, RULE.getId()).get().getLongValue()).isEqualTo(10 + 30); - - // debt by characteristic. Root characteristics with zero values are not saved for files. - assertThat(debtCharacteristicMeasure(FILE, PORTABILITY_ID).get().getLongValue()).isEqualTo(10 + 30); - assertThat(debtCharacteristicMeasure(FILE, PORTABILITY_SOFT_ID).get().getLongValue()).isEqualTo(10 + 30); - assertThat(debtCharacteristicMeasure(FILE, PORTABILITY_HARD_ID)).isAbsent(); - assertThat(debtCharacteristicMeasure(FILE, RELIABILITY_ID)).isAbsent(); } @Test @@ -137,12 +93,6 @@ public class DebtAggregatorTest { // debt by rule assertThat(debtRuleMeasure(PROJECT, RULE.getId()).get().getLongValue()).isEqualTo(10 + 30); - - // debt by characteristic. Root characteristics with zero values are stored for modules and projects. - assertThat(debtCharacteristicMeasure(PROJECT, PORTABILITY_ID).get().getLongValue()).isEqualTo(10 + 30); - assertThat(debtCharacteristicMeasure(PROJECT, PORTABILITY_SOFT_ID).get().getLongValue()).isEqualTo(10 + 30); - assertThat(debtCharacteristicMeasure(PROJECT, PORTABILITY_HARD_ID)).isAbsent(); - assertThat(debtCharacteristicMeasure(PROJECT, RELIABILITY_ID).get().getLongValue()).isZero(); } @Test @@ -162,12 +112,6 @@ public class DebtAggregatorTest { // debt by rule assertThat(debtRuleMeasure(PROJECT, RULE.getId())).isAbsent(); - - // debt by characteristic. Root characteristics with zero values are stored for modules and projects. - assertThat(debtCharacteristicMeasure(PROJECT, PORTABILITY_ID).get().getLongValue()).isZero(); - assertThat(debtCharacteristicMeasure(PROJECT, PORTABILITY_SOFT_ID)).isAbsent(); - assertThat(debtCharacteristicMeasure(PROJECT, PORTABILITY_HARD_ID)).isAbsent(); - assertThat(debtCharacteristicMeasure(PROJECT, RELIABILITY_ID).get().getLongValue()).isZero(); } @CheckForNull @@ -180,16 +124,11 @@ public class DebtAggregatorTest { return measureRepository.getAddedRawRuleMeasure(component, TECHNICAL_DEBT_KEY, ruleId); } - @CheckForNull - private Optional debtCharacteristicMeasure(Component component, int characteristicId) { - return measureRepository.getAddedRawCharacteristicMeasure(component, TECHNICAL_DEBT_KEY, characteristicId); - } - - private static DefaultIssue newIssue(long debt){ + private static DefaultIssue newIssue(long debt) { return newIssue().setDebt(Duration.create(debt)); } - private static DefaultIssue newIssue(){ + private static DefaultIssue newIssue() { return new DefaultIssue().setRuleKey(RULE.getKey()); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtCalculatorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtCalculatorTest.java index 31d92209133..78625faf798 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtCalculatorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtCalculatorTest.java @@ -33,7 +33,7 @@ import static org.mockito.Mockito.mock; public class DebtCalculatorTest { - DumbRule rule = new DumbRule(RuleTesting.XOO_X1).setSubCharacteristicId(123); + DumbRule rule = new DumbRule(RuleTesting.XOO_X1); DefaultIssue issue = new DefaultIssue().setRuleKey(rule.getKey()); @org.junit.Rule @@ -50,8 +50,7 @@ public class DebtCalculatorTest { @Test public void no_debt_if_no_sqale_characteristic() { - rule.setSubCharacteristicId(null); - rule.setFunction(new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.LINEAR, "2min", null)); + rule.setFunction(null); DefaultIssue issue = new DefaultIssue().setRuleKey(rule.getKey()); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DumbRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DumbRule.java index b35b643a94b..55465a81e2e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DumbRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DumbRule.java @@ -34,7 +34,6 @@ public class DumbRule implements Rule { private String name; private RuleStatus status = RuleStatus.READY; private Set tags = new HashSet<>(); - private Integer subCharacteristicId; private DebtRemediationFunction function; public DumbRule(RuleKey key) { @@ -67,11 +66,6 @@ public class DumbRule implements Rule { return requireNonNull(tags); } - @Override - public Integer getSubCharacteristicId() { - return subCharacteristicId; - } - @Override public DebtRemediationFunction getRemediationFunction() { return function; @@ -92,11 +86,6 @@ public class DumbRule implements Rule { return this; } - public DumbRule setSubCharacteristicId(@Nullable Integer subCharacteristicId) { - this.subCharacteristicId = subCharacteristicId; - return this; - } - public DumbRule setFunction(@Nullable DebtRemediationFunction function) { this.function = function; return this; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/RuleRepositoryImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/RuleRepositoryImplTest.java index a388da03a4f..266c17f6b49 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/RuleRepositoryImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/RuleRepositoryImplTest.java @@ -224,7 +224,6 @@ public class RuleRepositoryImplTest { assertThat(rule.getId()).isEqualTo(AB_RULE.getId()); assertThat(rule.getKey()).isEqualTo(AB_RULE.getKey()); assertThat(rule.getRemediationFunction()).isNull(); - assertThat(rule.getSubCharacteristicId()).isNull(); assertThat(rule.getStatus()).isEqualTo(RuleStatus.REMOVED); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepositoryTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepositoryTest.java index be7643cc9b3..d824f8bc7d3 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepositoryTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MapBasedRawMeasureRepositoryTest.java @@ -46,8 +46,6 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.Developer; import org.sonar.server.computation.component.DumbDeveloper; import org.sonar.server.computation.component.ReportComponent; -import org.sonar.server.computation.debt.Characteristic; -import org.sonar.server.computation.debt.CharacteristicImpl; import org.sonar.server.computation.metric.Metric; import org.sonar.server.computation.metric.MetricImpl; import org.sonar.server.computation.metric.MetricRepository; @@ -83,7 +81,6 @@ public class MapBasedRawMeasureRepositoryTest { private static final Measure SOME_MEASURE = Measure.newMeasureBuilder().create("some value"); private static final RuleDto SOME_RULE = RuleDto.createFor(RuleKey.of("A", "1")).setId(963); - private static final Characteristic SOME_CHARACTERISTIC = new CharacteristicImpl(741, "key", null); private static final Developer SOME_DEVELOPER = new DumbDeveloper("DEV1"); private ReportMetricValidator reportMetricValidator = mock(ReportMetricValidator.class); @@ -248,17 +245,6 @@ public class MapBasedRawMeasureRepositoryTest { assertThat(underTest.getRawMeasures(FILE_COMPONENT).get(metric1.getKey()).iterator().next()).isSameAs(newMeasure); } - @Test - public void update_updates_the_stored_value_for_characteristic() { - Measure initialMeasure = Measure.newMeasureBuilder().forCharacteristic(952).createNoValue(); - Measure newMeasure = Measure.updatedMeasureBuilder(initialMeasure).create(); - - underTest.add(FILE_COMPONENT, metric1, initialMeasure); - underTest.update(FILE_COMPONENT, metric1, newMeasure); - - assertThat(underTest.getRawMeasures(FILE_COMPONENT).get(metric1.getKey()).iterator().next()).isSameAs(newMeasure); - } - @Test public void getRawMeasure_throws_NPE_without_reading_batch_report_if_component_arg_is_null() { try { @@ -319,18 +305,6 @@ public class MapBasedRawMeasureRepositoryTest { assertThat(measures.iterator().next()).isSameAs(ruleMeasure); } - @Test - public void getRawMeasures_for_metric_returns_characteristic_measure() { - when(reportMetricValidator.validate(metric1.getKey())).thenReturn(true); - Measure characteristicMeasure = Measure.newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC.getId()).createNoValue(); - - underTest.add(FILE_COMPONENT, metric1, characteristicMeasure); - - Set measures = underTest.getRawMeasures(FILE_COMPONENT, metric1); - assertThat(measures).hasSize(1); - assertThat(measures.iterator().next()).isSameAs(characteristicMeasure); - } - @Test public void getRawMeasures_for_metric_returns_developer_measure() { Measure devMeasure = Measure.newMeasureBuilder().forDeveloper(SOME_DEVELOPER).createNoValue(); @@ -355,19 +329,4 @@ public class MapBasedRawMeasureRepositoryTest { assertThat(measures).hasSize(1); assertThat(measures.iterator().next()).isSameAs(devMeasure); } - - @Test - public void getRawMeasures_for_metric_returns_developer_with_characteristic_measure() { - Measure devMeasure = Measure.newMeasureBuilder() - .forDeveloper(SOME_DEVELOPER) - .forCharacteristic(SOME_CHARACTERISTIC.getId()) - .createNoValue(); - - underTest.add(FILE_COMPONENT, metric1, devMeasure); - - Set measures = underTest.getRawMeasures(FILE_COMPONENT, metric1); - assertThat(measures).hasSize(1); - assertThat(measures.iterator().next()).isSameAs(devMeasure); - } - } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java index 76ea0d66d62..4c7e8522885 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java @@ -66,13 +66,6 @@ public class MeasureDtoToMeasureTest { assertThat(measure.get().getRuleId()).isEqualTo(10); } - @Test - public void toMeasure_returns_characteristic_measure() { - Optional measure = underTest.toMeasure(new MeasureDto().setCharacteristicId(30), SOME_INT_METRIC); - assertThat(measure).isPresent(); - assertThat(measure.get().getCharacteristicId()).isEqualTo(30); - } - @Test(expected = NullPointerException.class) public void toMeasure_throws_NPE_if_metric_argument_is_null() { underTest.toMeasure(EMPTY_MEASURE_DTO, null); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureKeyTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureKeyTest.java index 93a45d46900..7a36dc365a4 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureKeyTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureKeyTest.java @@ -38,40 +38,28 @@ public class MeasureKeyTest { public void fail_with_NPE_when_metric_key_is_null() { thrown.expect(NullPointerException.class); - new MeasureKey(null, 1, 2, DEVELOPER); + new MeasureKey(null, 1, DEVELOPER); } @Test public void fail_with_IAE_when_rule_id_is_default_value() { thrown.expect(IllegalArgumentException.class); - new MeasureKey("metricKey", -6253, 2, DEVELOPER); - } - - @Test - public void fail_with_IAE_when_characteristic_id_is_default_value() { - thrown.expect(IllegalArgumentException.class); - - new MeasureKey("metricKey", 1, -6253, DEVELOPER); + new MeasureKey("metricKey", -6253, DEVELOPER); } @Test public void test_equals_and_hashcode() throws Exception { - MeasureKey measureKey = new MeasureKey("metricKey", null, null, null); - MeasureKey measureKey2 = new MeasureKey("metricKey", null, null, null); - MeasureKey anotherMeasureKey = new MeasureKey("anotherMetricKey", null, null, null); - - MeasureKey ruleMeasureKey = new MeasureKey("metricKey", 1, null, null); - MeasureKey ruleMeasureKey2 = new MeasureKey("metricKey", 1, null, null); - MeasureKey anotherRuleMeasureKey = new MeasureKey("metricKey", 2, null, null); + MeasureKey measureKey = new MeasureKey("metricKey", null, null); + MeasureKey measureKey2 = new MeasureKey("metricKey", null, null); + MeasureKey anotherMeasureKey = new MeasureKey("anotherMetricKey", null, null); - MeasureKey characteristicMeasureKey = new MeasureKey("metricKey", null, 1, null); - MeasureKey characteristicMeasureKey2 = new MeasureKey("metricKey", null, 1, null); - MeasureKey anotherCharacteristicMeasureKey = new MeasureKey("metricKey", null, 2, null); + MeasureKey ruleMeasureKey = new MeasureKey("metricKey", 1, null); + MeasureKey ruleMeasureKey2 = new MeasureKey("metricKey", 1, null); + MeasureKey anotherRuleMeasureKey = new MeasureKey("metricKey", 2, null); - MeasureKey developerMeasureKey = new MeasureKey("metricKey", null, null, DEVELOPER); - MeasureKey developerMeasureKey2 = new MeasureKey("metricKey", null, null, DEVELOPER); - MeasureKey developerCharacteristicMeasureKey = new MeasureKey("metricKey", null, 2, DEVELOPER); + MeasureKey developerMeasureKey = new MeasureKey("metricKey", null, DEVELOPER); + MeasureKey developerMeasureKey2 = new MeasureKey("metricKey", null, DEVELOPER); assertThat(measureKey).isEqualTo(measureKey); assertThat(measureKey).isEqualTo(measureKey2); @@ -81,26 +69,21 @@ public class MeasureKeyTest { assertThat(ruleMeasureKey).isEqualTo(ruleMeasureKey2); assertThat(ruleMeasureKey).isNotEqualTo(anotherRuleMeasureKey); - assertThat(characteristicMeasureKey).isEqualTo(characteristicMeasureKey2); - assertThat(characteristicMeasureKey).isNotEqualTo(anotherCharacteristicMeasureKey); - assertThat(developerMeasureKey).isEqualTo(developerMeasureKey2); - assertThat(developerMeasureKey).isNotEqualTo(developerCharacteristicMeasureKey); assertThat(measureKey.hashCode()).isEqualTo(measureKey.hashCode()); assertThat(measureKey.hashCode()).isEqualTo(measureKey2.hashCode()); assertThat(measureKey.hashCode()).isNotEqualTo(anotherMeasureKey.hashCode()); assertThat(ruleMeasureKey.hashCode()).isEqualTo(ruleMeasureKey2.hashCode()); - assertThat(characteristicMeasureKey.hashCode()).isEqualTo(characteristicMeasureKey2.hashCode()); assertThat(developerMeasureKey.hashCode()).isEqualTo(developerMeasureKey2.hashCode()); } @Test public void to_string() { - assertThat(new MeasureKey("metricKey", 1, 2, DEVELOPER).toString()).isEqualTo( - "MeasureKey{metricKey='metricKey', ruleId=1, characteristicId=2, developer=Developer{key='DEV1'}}"); - assertThat(new MeasureKey("metricKey", 1, null, null).toString()).isEqualTo("MeasureKey{metricKey='metricKey', ruleId=1, characteristicId=-6253, developer=null}"); - assertThat(new MeasureKey("metricKey", null, 2, null).toString()).isEqualTo("MeasureKey{metricKey='metricKey', ruleId=-6253, characteristicId=2, developer=null}"); + assertThat(new MeasureKey("metricKey", 1, DEVELOPER).toString()).isEqualTo( + "MeasureKey{metricKey='metricKey', ruleId=1, developer=Developer{key='DEV1'}}"); + assertThat(new MeasureKey("metricKey", 1, null).toString()).isEqualTo("MeasureKey{metricKey='metricKey', ruleId=1, developer=null}"); + assertThat(new MeasureKey("metricKey", null, null).toString()).isEqualTo("MeasureKey{metricKey='metricKey', ruleId=-6253, developer=null}"); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryImplTest.java index db194271952..5db038fccc2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryImplTest.java @@ -47,8 +47,6 @@ import org.sonar.server.computation.batch.BatchReportReader; import org.sonar.server.computation.batch.BatchReportReaderRule; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ReportComponent; -import org.sonar.server.computation.debt.Characteristic; -import org.sonar.server.computation.debt.CharacteristicImpl; import org.sonar.server.computation.metric.Metric; import org.sonar.server.computation.metric.MetricImpl; import org.sonar.server.computation.metric.MetricRepository; @@ -90,7 +88,6 @@ public class MeasureRepositoryImplTest { private static final Measure SOME_MEASURE = Measure.newMeasureBuilder().create("some value"); private static final String SOME_DATA = "some data"; private static final RuleDto SOME_RULE = RuleDto.createFor(RuleKey.of("A", "1")).setId(963); - private static final Characteristic SOME_CHARACTERISTIC = new CharacteristicImpl(741, "key", null); private ReportMetricValidator reportMetricValidator = mock(ReportMetricValidator.class); @@ -171,15 +168,6 @@ public class MeasureRepositoryImplTest { assertThat(underTest.getBaseMeasure(FILE_COMPONENT, metric1)).isAbsent(); } - @Test - public void getBaseMeasure_does_not_return_measure_with_characteristic() { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - dbClient.measureDao().insert(dbSession, createMeasureDto(METRIC_ID_1, LAST_SNAPSHOT_ID).setCharacteristicId(100)); - dbSession.commit(); - - assertThat(underTest.getBaseMeasure(FILE_COMPONENT, metric1)).isAbsent(); - } - @Test public void add_throws_NPE_if_Component_argument_is_null() { expectedException.expect(NullPointerException.class); @@ -325,17 +313,6 @@ public class MeasureRepositoryImplTest { assertThat(underTest.getRawMeasures(FILE_COMPONENT).get(metric1.getKey()).iterator().next()).isSameAs(newMeasure); } - @Test - public void update_updates_the_stored_value_for_characteristic() { - Measure initialMeasure = Measure.newMeasureBuilder().forCharacteristic(952).createNoValue(); - Measure newMeasure = Measure.updatedMeasureBuilder(initialMeasure).create(); - - underTest.add(FILE_COMPONENT, metric1, initialMeasure); - underTest.update(FILE_COMPONENT, metric1, newMeasure); - - assertThat(underTest.getRawMeasures(FILE_COMPONENT).get(metric1.getKey()).iterator().next()).isSameAs(newMeasure); - } - @Test public void getRawMeasure_throws_NPE_without_reading_batch_report_if_component_arg_is_null() { try { @@ -460,18 +437,6 @@ public class MeasureRepositoryImplTest { assertThat(measures.iterator().next()).isSameAs(measure); } - @Test - public void getRawMeasures_for_measures_returns_characteristic_measure() { - when(reportMetricValidator.validate(metric1.getKey())).thenReturn(true); - Measure measure = Measure.newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC.getId()).createNoValue(); - - underTest.add(FILE_COMPONENT, metric1, measure); - - Set measures = underTest.getRawMeasures(FILE_COMPONENT, metric1); - assertThat(measures).hasSize(1); - assertThat(measures.iterator().next()).isSameAs(measure); - } - @Test public void getRawMeasures_returns_added_measures_over_batch_measures() { when(reportMetricValidator.validate(METRIC_KEY_1)).thenReturn(true); @@ -482,7 +447,7 @@ public class MeasureRepositoryImplTest { Measure addedMeasure = SOME_MEASURE; underTest.add(FILE_COMPONENT, metric1, addedMeasure); - Measure addedMeasure2 = Measure.newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC.getId()).createNoValue(); + Measure addedMeasure2 = Measure.newMeasureBuilder().forRule(SOME_RULE.getId()).createNoValue(); underTest.add(FILE_COMPONENT, metric1, addedMeasure2); SetMultimap rawMeasures = underTest.getRawMeasures(FILE_COMPONENT); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java index b1b9e735930..7a3038dcb88 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java @@ -122,7 +122,7 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe } private static void checkBaseMeasureArgument(Measure measure) { - checkArgument(measure.getRuleId() == null && measure.getCharacteristicId() == null, "A Base measure can not have ruleId nor a characteristicId"); + checkArgument(measure.getRuleId() == null, "A Base measure can not have ruleId"); } public SetMultimap getRawMeasures(int componentRef) { @@ -155,7 +155,7 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe checkAndInitProvidersState(); Set measures = from(getAddedRawMeasures(componentProvider.getByRef(componentRef)).get(metricKey)) - .filter(IsNotRuleOrCharacteristicMeasure.INSTANCE) + .filter(IsNotRuleMeasure.INSTANCE) .toSet(); if (measures.isEmpty()) { return Optional.absent(); @@ -189,32 +189,6 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe return getAddedRawRuleMeasure(component.getReportAttributes().getRef(), metricKey, ruleId); } - /** - * Return a measure that were added by the step (using {@link #add(Component, Metric, Measure)}). - * It does not contain the one added in the test by {@link #addRawMeasure(int, String, Measure)} - */ - public Optional getAddedRawCharacteristicMeasure(int componentRef, String metricKey, int characteristicId) { - checkAndInitProvidersState(); - - Set measures = from(getAddedRawMeasures(componentProvider.getByRef(componentRef)).get(metricKey)) - .filter(new MatchCharacteristicId(characteristicId)) - .toSet(); - if (measures.isEmpty()) { - return Optional.absent(); - } - checkArgument(measures.size() == 1, String.format("There is more than one measure on metric '%s' for characteristic '%s' for component '%s'", metricKey, characteristicId, - componentRef)); - return Optional.of(measures.iterator().next()); - } - - /** - * Return a measure that were added by the step (using {@link #add(Component, Metric, Measure)}). - * It does not contain the one added in the test by {@link #addRawMeasure(int, String, Measure)} - */ - public Optional getAddedRawCharacteristicMeasure(Component component, String metricKey, int characteristicId) { - return getAddedRawCharacteristicMeasure(component.getReportAttributes().getRef(), metricKey, characteristicId); - } - /** * Return measures that were added by the step (using {@link #add(Component, Metric, Measure)}). * It does not contain the one added in the test by {@link #addRawMeasure(int, String, Measure)} @@ -233,10 +207,10 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe checkAndInitProvidersState(); InternalKey internalKey = new InternalKey(componentProvider.getByRef(componentRef), metricRepositoryRule.getByKey(metricKey), measure.getRuleId(), - measure.getCharacteristicId(), measure.getDeveloper()); + measure.getDeveloper()); checkState(!rawMeasures.containsKey(internalKey), format( - "A measure can only be set once for Component (ref=%s), Metric (key=%s), ruleId=%s, characteristicId=%s", - componentRef, metricKey, measure.getRuleId(), measure.getCharacteristicId())); + "A measure can only be set once for Component (ref=%s), Metric (key=%s), ruleId=%s", + componentRef, metricKey, measure.getRuleId())); rawMeasures.put(internalKey, measure); initialRawMeasures.put(internalKey, measure); @@ -255,17 +229,13 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe } public Optional getRawMeasure(Component component, Metric metric, DumbDeveloper developer) { - return Optional.fromNullable(rawMeasures.get(new InternalKey(component, metric, null, null, developer))); + return Optional.fromNullable(rawMeasures.get(new InternalKey(component, metric, null, developer))); } public Optional getRawRuleMeasure(Component component, Metric metric, int ruleId) { return Optional.fromNullable(rawMeasures.get(new InternalKey(component, metric, ruleId, null))); } - public Optional getRawCharacteristicMeasure(Component component, Metric metric, int characteristicId) { - return Optional.fromNullable(rawMeasures.get(new InternalKey(component, metric, null, characteristicId))); - } - @Override public Set getRawMeasures(Component component, Metric metric) { return from(filterKeys(rawMeasures, hasComponentRef(component)).entrySet()).filter(new MatchMetric(metric)).transform(ToMeasure.INSTANCE).toSet(); @@ -287,11 +257,11 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe @Override public void add(Component component, Metric metric, Measure measure) { String ref = getRef(component); - InternalKey internalKey = new InternalKey(ref, metric.getKey(), measure.getRuleId(), measure.getCharacteristicId(), measure.getDeveloper()); + InternalKey internalKey = new InternalKey(ref, metric.getKey(), measure.getRuleId(), measure.getDeveloper()); if (rawMeasures.containsKey(internalKey)) { throw new UnsupportedOperationException(format( - "A measure can only be set once for Component (ref=%s), Metric (key=%s), ruleId=%s, characteristicId=%s", - ref, metric.getKey(), measure.getRuleId(), measure.getCharacteristicId())); + "A measure can only be set once for Component (ref=%s), Metric (key=%s), ruleId=%s", + ref, metric.getKey(), measure.getRuleId())); } rawMeasures.put(internalKey, measure); } @@ -299,11 +269,11 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe @Override public void update(Component component, Metric metric, Measure measure) { String componentRef = getRef(component); - InternalKey internalKey = new InternalKey(componentRef, metric.getKey(), measure.getRuleId(), measure.getCharacteristicId(), measure.getDeveloper()); + InternalKey internalKey = new InternalKey(componentRef, metric.getKey(), measure.getRuleId(), measure.getDeveloper()); if (!rawMeasures.containsKey(internalKey)) { throw new UnsupportedOperationException(format( - "A measure can only be updated if it has been added first for Component (ref=%s), Metric (key=%s), ruleId=%s, characteristicId=%s", - componentRef, metric.getKey(), measure.getRuleId(), measure.getCharacteristicId())); + "A measure can only be updated if it has been added first for Component (ref=%s), Metric (key=%s), ruleId=%s", + componentRef, metric.getKey(), measure.getRuleId())); } rawMeasures.put(internalKey, measure); } @@ -323,27 +293,25 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe private final String componentRef; private final String metricKey; private final int ruleId; - private final int characteristicId; @Nullable private final Developer developer; public InternalKey(Component component, Metric metric) { - this(getRef(component), metric.getKey(), null, null, null); + this(getRef(component), metric.getKey(), null, null); } - public InternalKey(Component component, Metric metric, @Nullable Integer ruleId, @Nullable Integer characteristicId) { - this(getRef(component), metric.getKey(), ruleId, characteristicId, null); + public InternalKey(Component component, Metric metric, @Nullable Integer ruleId) { + this(getRef(component), metric.getKey(), ruleId, null); } - public InternalKey(Component component, Metric metric, @Nullable Integer ruleId, @Nullable Integer characteristicId, @Nullable Developer developer) { - this(getRef(component), metric.getKey(), ruleId, characteristicId, null); + public InternalKey(Component component, Metric metric, @Nullable Integer ruleId, @Nullable Developer developer) { + this(getRef(component), metric.getKey(), ruleId, null); } - private InternalKey(String componentRef, String metricKey, @Nullable Integer ruleId, @Nullable Integer characteristicId, @Nullable Developer developer) { + private InternalKey(String componentRef, String metricKey, @Nullable Integer ruleId, @Nullable Developer developer) { this.componentRef = componentRef; this.metricKey = metricKey; this.ruleId = ruleId == null ? DEFAULT_VALUE : ruleId; - this.characteristicId = characteristicId == null ? DEFAULT_VALUE : characteristicId; this.developer = developer; } @@ -367,13 +335,12 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe return Objects.equals(componentRef, that.componentRef) && Objects.equals(metricKey, that.metricKey) && Objects.equals(ruleId, that.ruleId) && - Objects.equals(characteristicId, that.characteristicId) && Objects.equals(developer, that.developer); } @Override public int hashCode() { - return Objects.hash(componentRef, metricKey, ruleId, characteristicId, developer); + return Objects.hash(componentRef, metricKey, ruleId, developer); } @Override @@ -382,7 +349,6 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe "component=" + componentRef + ", metric='" + metricKey + '\'' + ", rule=" + ruleId + - ", characteristic=" + characteristicId + ", developer=" + developer + '}'; } @@ -402,12 +368,12 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe } } - private enum IsNotRuleOrCharacteristicMeasure implements Predicate { + private enum IsNotRuleMeasure implements Predicate { INSTANCE; @Override public boolean apply(@Nonnull Measure input) { - return input.getRuleId() == null && input.getCharacteristicId() == null; + return input.getRuleId() == null; } } @@ -425,20 +391,6 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe } } - private static class MatchCharacteristicId implements Predicate { - private final int characteristicId; - - public MatchCharacteristicId(int characteristicId) { - this.characteristicId = characteristicId; - } - - @Override - public boolean apply(@Nonnull Measure input) { - Integer characteristicId = input.getCharacteristicId(); - return characteristicId != null && characteristicId.equals(this.characteristicId); - } - } - private static String getRef(Component component) { return component.getType().isReportType() ? String.valueOf(component.getReportAttributes().getRef()) : component.getKey(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureTest.java index 93aa6897527..ca25e00da48 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureTest.java @@ -107,26 +107,10 @@ public class MeasureTest { .toArray(Object[].class); } - @Test - public void forRule_throw_UOE_if_characteristicId_is_already_set() { - expectedException.expect(UnsupportedOperationException.class); - expectedException.expectMessage("A measure can not be associated to both a Characteristic and a Rule"); - - newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).forRule(SOME_RULE_ID); - } - - @Test - public void forCharacteristic_throw_UOE_if_ruleKey_is_already_set() { - expectedException.expect(UnsupportedOperationException.class); - expectedException.expectMessage("A measure can not be associated to both a Characteristic and a Rule"); - - newMeasureBuilder().forRule(SOME_RULE_ID).forCharacteristic(SOME_CHARACTERISTIC_ID); - } @Test public void getRuleId_returns_null_when_ruleKey_has_not_been_set() { assertThat(newMeasureBuilder().createNoValue().getRuleId()).isNull(); - assertThat(newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getRuleId()).isNull(); } @Test @@ -134,17 +118,6 @@ public class MeasureTest { assertThat(newMeasureBuilder().forRule(SOME_RULE_ID).createNoValue().getRuleId()).isEqualTo(SOME_RULE_ID); } - @Test - public void getCharacteristicId_returns_null_when_ruleKey_has_not_been_set() { - assertThat(newMeasureBuilder().createNoValue().getCharacteristicId()).isNull(); - assertThat(newMeasureBuilder().forRule(SOME_RULE_ID).createNoValue().getCharacteristicId()).isNull(); - } - - @Test - public void getCharacteristicId_returns_id_set_in_builder() { - assertThat(newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getCharacteristicId()).isEqualTo(SOME_CHARACTERISTIC_ID); - } - @Test public void getDeveloper_returns_dev_set_in_builder() { assertThat(newMeasureBuilder().forDeveloper(SOME_DEVELOPER).createNoValue().getDeveloper()).isEqualTo(SOME_DEVELOPER); @@ -158,18 +131,6 @@ public class MeasureTest { .createNoValue(); assertThat(measure.getDeveloper()).isEqualTo(SOME_DEVELOPER); assertThat(measure.getRuleId()).isEqualTo(SOME_RULE_ID); - assertThat(measure.getCharacteristicId()).isNull(); - } - - @Test - public void create_measure_for_dev_and_characteristic() { - Measure measure = newMeasureBuilder() - .forDeveloper(SOME_DEVELOPER) - .forCharacteristic(SOME_CHARACTERISTIC_ID) - .createNoValue(); - assertThat(measure.getDeveloper()).isEqualTo(SOME_DEVELOPER); - assertThat(measure.getCharacteristicId()).isEqualTo(SOME_CHARACTERISTIC_ID); - assertThat(measure.getRuleId()).isNull(); } @Test(expected = NullPointerException.class) @@ -347,7 +308,6 @@ public class MeasureTest { assertThat(newMeasure.getValueType()).isEqualTo(measure.getValueType()); assertThat(newMeasure.getRuleId()).isEqualTo(measure.getRuleId()); - assertThat(newMeasure.getCharacteristicId()).isEqualTo(measure.getCharacteristicId()); assertThat(newMeasure.getDescription()).isEqualTo(measure.getDescription()); assertThat(newMeasure.hasQualityGateStatus()).isEqualTo(measure.hasQualityGateStatus()); assertThat(newMeasure.hasVariations()).isEqualTo(measure.hasVariations()); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureToMeasureDtoTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureToMeasureDtoTest.java index 02ea5405fd1..21aa5894756 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureToMeasureDtoTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureToMeasureDtoTest.java @@ -142,19 +142,6 @@ public class MeasureToMeasureDtoTest { assertThat(underTest.toMeasureDto(measure, SOME_BOOLEAN_METRIC, SOME_COMPONENT).getRuleId()).isEqualTo(42); } - @Test - @UseDataProvider("all_types_Measures") - public void toMeasureDto_does_no_set_characteristicId_if_not_set_in_Measure(Measure measure, Metric metric) { - assertThat(underTest.toMeasureDto(measure, metric, SOME_COMPONENT).getCharacteristicId()).isNull(); - } - - @Test - public void toMeasureDto_sets_characteristicId_if_set_in_Measure() { - Measure measure = Measure.newMeasureBuilder().forCharacteristic(42).createNoValue(); - - assertThat(underTest.toMeasureDto(measure, SOME_BOOLEAN_METRIC, SOME_COMPONENT).getCharacteristicId()).isEqualTo(42); - } - @Test @UseDataProvider("all_types_Measures") public void toMeasureDto_set_componentId_and_snapshotId_from_method_arguments(Measure measure, Metric metric) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/LoadDebtModelStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/LoadDebtModelStepTest.java deleted file mode 100644 index 6d15e7bbf76..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/LoadDebtModelStepTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.computation.step; - -import java.util.Collection; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.sonar.api.utils.System2; -import org.sonar.db.DbClient; -import org.sonar.db.DbSession; -import org.sonar.db.DbTester; -import org.sonar.server.computation.debt.Characteristic; -import org.sonar.server.computation.debt.DebtModelHolderImpl; -import org.sonar.server.computation.debt.MutableDebtModelHolder; -import org.sonar.test.DbTests; - -import static org.assertj.core.api.Assertions.assertThat; - -@Category(DbTests.class) -public class LoadDebtModelStepTest extends BaseStepTest { - - @Rule - public DbTester dbTester = DbTester.create(System2.INSTANCE); - - DbClient dbClient = dbTester.getDbClient(); - - DbSession dbSession; - - MutableDebtModelHolder debtModelHolder = new DebtModelHolderImpl(); - - LoadDebtModelStep underTest; - - @Before - public void setUp() { - dbTester.truncateTables(); - dbSession = dbClient.openSession(false); - - underTest = new LoadDebtModelStep(dbClient, debtModelHolder); - } - - @After - public void tearDown() { - dbSession.close(); - } - - @Override - protected ComputationStep step() { - return underTest; - } - - @Test - public void feed_characteristics() { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - - underTest.execute(); - - Collection rootChars = debtModelHolder.getRootCharacteristics(); - assertThat(rootChars).extracting("id").containsOnly(1); - assertThat(rootChars).extracting("key").containsOnly("PORTABILITY"); - - Characteristic subChar = debtModelHolder.getCharacteristicById(1); - assertThat(subChar).isNotNull(); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java index ebb319549d7..65c5c85f33d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java @@ -314,35 +314,6 @@ public class PersistMeasuresStepTest extends BaseStepTest { assertThat(dto.get("ruleId")).isEqualTo(10L); } - @Test - public void insert_characteristic_measure_from_report() { - setupReportComponents(); - - insertCharacteristicMeasure(); - } - - @Test - public void insert_characteristic__measure_from_view() { - setupViewsComponents(); - - insertCharacteristicMeasure(); - } - - private void insertCharacteristicMeasure() { - metricRepository.add(1, INT_METRIC); - - measureRepository.addRawMeasure(ROOT_REF, INT_METRIC_KEY, newMeasureBuilder().forCharacteristic(10).create(1)); - - underTest.execute(); - - assertThat(dbTester.countRowsOfTable("project_measures")).isEqualTo(1); - List> dtos = selectSnapshots(); - Map dto = dtos.get(0); - - assertValue(dto, 1d); - assertThat(dto.get("characteristicId")).isEqualTo(10L); - } - @Test public void bestValue_measure_of_bestValueOptimized_metrics_are_not_persisted() { setupReportComponents(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtCharacteristicsXMLImporterTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtCharacteristicsXMLImporterTest.java deleted file mode 100644 index 39c7b132d48..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtCharacteristicsXMLImporterTest.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import com.google.common.io.Resources; -import org.junit.Test; -import org.sonar.api.server.debt.DebtCharacteristic; - -import java.nio.charset.StandardCharsets; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static org.sonar.server.debt.DebtModelXMLExporter.DebtModel; - -public class DebtCharacteristicsXMLImporterTest { - - @Test - public void import_characteristics() throws Exception { - String xml = getFileContent("import_characteristics.xml"); - - DebtModel debtModel = new DebtCharacteristicsXMLImporter().importXML(xml); - List rootCharacteristics = debtModel.rootCharacteristics(); - - assertThat(rootCharacteristics).hasSize(2); - assertThat(rootCharacteristics.get(0).key()).isEqualTo("PORTABILITY"); - assertThat(rootCharacteristics.get(0).name()).isEqualTo("Portability"); - assertThat(rootCharacteristics.get(0).order()).isEqualTo(1); - - assertThat(rootCharacteristics.get(1).key()).isEqualTo("MAINTAINABILITY"); - assertThat(rootCharacteristics.get(1).name()).isEqualTo("Maintainability"); - assertThat(rootCharacteristics.get(1).order()).isEqualTo(2); - - List portabilitySubCharacteristics = debtModel.subCharacteristics("PORTABILITY"); - assertThat(portabilitySubCharacteristics).hasSize(2); - assertThat(portabilitySubCharacteristics.get(0).key()).isEqualTo("COMPILER_RELATED_PORTABILITY"); - assertThat(portabilitySubCharacteristics.get(0).name()).isEqualTo("Compiler related portability"); - assertThat(portabilitySubCharacteristics.get(1).key()).isEqualTo("HARDWARE_RELATED_PORTABILITY"); - assertThat(portabilitySubCharacteristics.get(1).name()).isEqualTo("Hardware related portability"); - - List maintainabilitySubCharacteristics = debtModel.subCharacteristics("MAINTAINABILITY"); - assertThat(maintainabilitySubCharacteristics).hasSize(1); - assertThat(maintainabilitySubCharacteristics.get(0).key()).isEqualTo("READABILITY"); - assertThat(maintainabilitySubCharacteristics.get(0).name()).isEqualTo("Readability"); - } - - @Test - public void import_badly_formatted_xml() throws Exception { - String xml = getFileContent("import_badly_formatted_xml.xml"); - - DebtModel debtModel = new DebtCharacteristicsXMLImporter().importXML(xml); - List rootCharacteristics = debtModel.rootCharacteristics(); - - // characteristics - assertThat(rootCharacteristics).hasSize(2); - assertThat(rootCharacteristics.get(0).key()).isEqualTo("USABILITY"); - assertThat(rootCharacteristics.get(0).name()).isEqualTo("Usability"); - - assertThat(rootCharacteristics.get(1).key()).isEqualTo("EFFICIENCY"); - assertThat(rootCharacteristics.get(1).name()).isEqualTo("Efficiency"); - - // sub-characteristic - assertThat(debtModel.subCharacteristics("EFFICIENCY")).hasSize(1); - assertThat(debtModel.subCharacteristics("EFFICIENCY").get(0).key()).isEqualTo("MEMORY_EFFICIENCY"); - assertThat(debtModel.subCharacteristics("EFFICIENCY").get(0).name()).isEqualTo("Memory use"); - } - - /** - * SONAR-5180 - */ - @Test - public void convert_network_use_key() throws Exception { - String xml = getFileContent("convert_network_use_key.xml"); - - DebtModel debtModel = new DebtCharacteristicsXMLImporter().importXML(xml); - assertThat(debtModel.characteristicByKey("NETWORK_USE_EFFICIENCY")).isNull(); - assertThat(debtModel.characteristicByKey("NETWORK_USE")).isNotNull(); - } - - @Test - public void fail_on_bad_xml() throws Exception { - String xml = getFileContent("fail_on_bad_xml.xml"); - - try { - new DebtCharacteristicsXMLImporter().importXML(xml); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(IllegalStateException.class); - } - } - - private String getFileContent(String file) throws Exception { - return Resources.toString(Resources.getResource(getClass(), "DebtCharacteristicsXMLImporterTest/" + file), StandardCharsets.UTF_8); - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtMediumTest.java deleted file mode 100644 index b1f906874c0..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtMediumTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; -import org.sonar.core.permission.GlobalPermissions; -import org.sonar.server.platform.Platform; -import org.sonar.server.tester.ServerTester; -import org.sonar.server.tester.UserSessionRule; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DebtMediumTest { - - @ClassRule - public static ServerTester serverTester = new ServerTester(); - @Rule - public UserSessionRule userSessionRule = UserSessionRule.forServerTester(serverTester); - - @Before - public void setUp() { - serverTester.clearDbAndIndexes(); - serverTester.get(Platform.class).executeStartupTasks(); - } - - @Test - public void find_default_characteristics() { - DebtModelService debtModelService = serverTester.get(DebtModelService.class); - - // Only root characteristics - assertThat(debtModelService.characteristics()).hasSize(9); - - // Characteristics and sub-characteristics - assertThat(debtModelService.allCharacteristics()).hasSize(51); - } - - @Test - public void create_characteristic() { - userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN); - - DebtModelService debtModelService = serverTester.get(DebtModelService.class); - int nb = debtModelService.characteristics().size(); - - DebtCharacteristic result = debtModelService.create("New characteristic", null); - - assertThat(result.name()).isEqualTo("New characteristic"); - assertThat(result.key()).isEqualTo("NEW_CHARACTERISTIC"); - assertThat(result.isSub()).isFalse(); - assertThat(result.order()).isEqualTo(nb + 1); - - assertThat(debtModelService.characteristicByKey(result.key())).isNotNull(); - } - - @Test - public void create_sub_characteristic() { - userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN); - - DebtModelService debtModelService = serverTester.get(DebtModelService.class); - - DefaultDebtCharacteristic parent = (DefaultDebtCharacteristic) debtModelService.characteristicByKey("REUSABILITY"); - - DebtCharacteristic result = debtModelService.create("New characteristic", parent.id()); - - assertThat(result.name()).isEqualTo("New characteristic"); - assertThat(result.key()).isEqualTo("NEW_CHARACTERISTIC"); - assertThat(result.isSub()).isTrue(); - assertThat(result.order()).isNull(); - - assertThat(debtModelService.characteristicByKey(result.key())).isNotNull(); - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java index db3389327ab..b75c45c2a04 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java @@ -19,7 +19,6 @@ */ package org.sonar.server.debt; -import java.io.Reader; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -31,29 +30,23 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; import org.sonar.api.server.debt.DebtRemediationFunction; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.System2; import org.sonar.api.utils.ValidationMessages; import org.sonar.core.permission.GlobalPermissions; import org.sonar.db.DbSession; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; +import org.sonar.db.rule.RuleDao; import org.sonar.db.rule.RuleDto; import org.sonar.server.db.DbClient; -import org.sonar.server.debt.DebtModelXMLExporter.DebtModel; import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt; import org.sonar.server.rule.RuleDefinitionsLoader; import org.sonar.server.rule.RuleOperations; -import org.sonar.server.rule.db.RuleDao; import org.sonar.server.tester.UserSessionRule; import static com.google.common.collect.Lists.newArrayList; @@ -62,8 +55,6 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isNull; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -82,18 +73,12 @@ public class DebtModelBackupTest { @Mock DbSession session; @Mock - DebtModelPluginRepository debtModelPluginRepository; - @Mock - CharacteristicDao dao; - @Mock RuleDao ruleDao; @Mock - DebtModelOperations debtModelOperations; + org.sonar.server.rule.db.RuleDao deprecatedRuleDao; @Mock RuleOperations ruleOperations; @Mock - DebtCharacteristicsXMLImporter characteristicsXMLImporter; - @Mock DebtRulesXMLImporter rulesXMLImporter; @Mock DebtModelXMLExporter debtModelXMLExporter; @@ -101,15 +86,11 @@ public class DebtModelBackupTest { RuleDefinitionsLoader defLoader; @Mock System2 system2; - - @Captor - ArgumentCaptor characteristicCaptor; @Captor ArgumentCaptor ruleCaptor; @Captor ArgumentCaptor> ruleDebtListCaptor; - Date oldDate = DateUtils.parseDate("2014-01-01"); Date now = DateUtils.parseDate("2014-03-19"); int currentId; @@ -123,62 +104,38 @@ public class DebtModelBackupTest { when(system2.now()).thenReturn(now.getTime()); currentId = 10; - // Associate an id when inserting an object to simulate the db id generator - doAnswer(new Answer() { - public Object answer(InvocationOnMock invocation) { - Object[] args = invocation.getArguments(); - CharacteristicDto dto = (CharacteristicDto) args[1]; - dto.setId(currentId++); - return null; - } - }).when(dao).insert(any(DbSession.class), any(CharacteristicDto.class)); - when(dbClient.openSession(false)).thenReturn(session); - when(dbClient.deprecatedRuleDao()).thenReturn(ruleDao); - when(dbClient.debtCharacteristicDao()).thenReturn(dao); - - Reader defaultModelReader = mock(Reader.class); - when(debtModelPluginRepository.createReaderForXMLFile("technical-debt")).thenReturn(defaultModelReader); + when(dbClient.ruleDao()).thenReturn(ruleDao); + when(dbClient.deprecatedRuleDao()).thenReturn(deprecatedRuleDao); - underTest = new DebtModelBackup(dbClient, debtModelOperations, ruleOperations, debtModelPluginRepository, characteristicsXMLImporter, rulesXMLImporter, + underTest = new DebtModelBackup(dbClient, ruleOperations, rulesXMLImporter, debtModelXMLExporter, defLoader, system2, userSessionRule); } @Test public void backup() { - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn( newArrayList( // Rule with overridden debt values new RuleDto().setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) .setRemediationCoefficient("2h") .setRemediationOffset("15min"), // Rule with default debt values - new RuleDto().setRepositoryKey("squid").setRuleKey("AvoidNPE").setDefaultSubCharacteristicId(2).setDefaultRemediationFunction("LINEAR") - .setDefaultRemediationCoefficient("2h") + new RuleDto().setRepositoryKey("squid").setRuleKey("AvoidNPE") + .setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h") )); underTest.backup(); - ArgumentCaptor debtModelArgument = ArgumentCaptor.forClass(DebtModel.class); - verify(debtModelXMLExporter).export(debtModelArgument.capture(), ruleDebtListCaptor.capture()); - assertThat(debtModelArgument.getValue().rootCharacteristics()).hasSize(1); - assertThat(debtModelArgument.getValue().subCharacteristics("PORTABILITY")).hasSize(1); - + verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture()); List rules = ruleDebtListCaptor.getValue(); assertThat(rules).hasSize(2); RuleDebt rule = rules.get(0); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("UselessImportCheck"); - assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("LINEAR_OFFSET"); assertThat(rule.coefficient()).isEqualTo("2h"); assertThat(rule.offset()).isEqualTo("15min"); @@ -186,7 +143,6 @@ public class DebtModelBackupTest { rule = rules.get(1); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("AvoidNPE"); - assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("LINEAR"); assertThat(rule.coefficient()).isEqualTo("2h"); assertThat(rule.offset()).isNull(); @@ -194,14 +150,9 @@ public class DebtModelBackupTest { @Test public void backup_with_disabled_rules() { - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( // Debt disabled - new RuleDto().setRepositoryKey("squid").setRuleKey("UselessImportCheck").setSubCharacteristicId(RuleDto.DISABLED_CHARACTERISTIC_ID), + new RuleDto().setRepositoryKey("squid").setRuleKey("UselessImportCheck"), // Not debt new RuleDto().setRepositoryKey("squid").setRuleKey("AvoidNPE") @@ -209,37 +160,27 @@ public class DebtModelBackupTest { underTest.backup(); - verify(debtModelXMLExporter).export(any(DebtModel.class), ruleDebtListCaptor.capture()); + verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture()); assertThat(ruleDebtListCaptor.getValue()).isEmpty(); } @Test public void backup_with_rule_having_default_linear_and_overridden_offset() { - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( // Rule with default debt values : default value is linear (only coefficient is set) and overridden value is constant per issue (only // offset is set) // -> Ony offset should be set new RuleDto().setRepositoryKey("squid").setRuleKey("AvoidNPE") - .setDefaultSubCharacteristicId(2) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setDefaultRemediationCoefficient("2h") - .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.toString()) .setRemediationOffset("15min") )); underTest.backup(); - ArgumentCaptor debtModelArgument = ArgumentCaptor.forClass(DebtModel.class); - verify(debtModelXMLExporter).export(debtModelArgument.capture(), ruleDebtListCaptor.capture()); - assertThat(debtModelArgument.getValue().rootCharacteristics()).hasSize(1); - assertThat(debtModelArgument.getValue().subCharacteristics("PORTABILITY")).hasSize(1); + verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture()); List rules = ruleDebtListCaptor.getValue(); assertThat(rules).hasSize(1); @@ -247,7 +188,6 @@ public class DebtModelBackupTest { RuleDebt rule = rules.get(0); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("AvoidNPE"); - assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("CONSTANT_ISSUE"); assertThat(rule.offset()).isEqualTo("15min"); assertThat(rule.coefficient()).isNull(); @@ -255,29 +195,20 @@ public class DebtModelBackupTest { @Test public void backup_from_language() { - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck").setLanguage("java") - .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.toString()) .setRemediationOffset("15min"), - // .setCreatedAt(oldDate).setUpdatedAt(oldDate), // Should be ignored new RuleDto().setId(2).setRepositoryKey("checkstyle") .setLanguage("java2") - .setSubCharacteristicId(3) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setRemediationCoefficient("2h") - // .setCreatedAt(oldDate).setUpdatedAt(oldDate) )); underTest.backup("java"); - verify(debtModelXMLExporter).export(any(DebtModel.class), ruleDebtListCaptor.capture()); + verify(debtModelXMLExporter).export(ruleDebtListCaptor.capture()); List rules = ruleDebtListCaptor.getValue(); assertThat(rules).hasSize(1); @@ -285,141 +216,17 @@ public class DebtModelBackupTest { RuleDebt rule = rules.get(0); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("UselessImportCheck"); - assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("CONSTANT_ISSUE"); assertThat(rule.coefficient()).isNull(); assertThat(rule.offset()).isEqualTo("15min"); } - @Test - public void create_characteristics_when_restoring_characteristics() { - when(dao.selectEnabledCharacteristics(session)).thenReturn(Collections.emptyList()); - - underTest.restoreCharacteristics( - session, - new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY"), - now - ); - - verify(dao, times(2)).insert(eq(session), characteristicCaptor.capture()); - - CharacteristicDto dto1 = characteristicCaptor.getAllValues().get(0); - assertThat(dto1.getId()).isEqualTo(10); - assertThat(dto1.getKey()).isEqualTo("PORTABILITY"); - assertThat(dto1.getName()).isEqualTo("Portability"); - assertThat(dto1.getParentId()).isNull(); - assertThat(dto1.getOrder()).isEqualTo(1); - assertThat(dto1.getCreatedAt()).isEqualTo(now); - assertThat(dto1.getUpdatedAt()).isNull(); - - CharacteristicDto dto2 = characteristicCaptor.getAllValues().get(1); - assertThat(dto2.getId()).isEqualTo(11); - assertThat(dto2.getKey()).isEqualTo("COMPILER"); - assertThat(dto2.getName()).isEqualTo("Compiler"); - assertThat(dto2.getParentId()).isEqualTo(10); - assertThat(dto2.getOrder()).isNull(); - assertThat(dto2.getCreatedAt()).isEqualTo(now); - assertThat(dto2.getUpdatedAt()).isNull(); - } - - @Test - public void update_characteristics_when_restoring_characteristics() { - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - // Order and name have changed - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2).setCreatedAt(oldDate).setUpdatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1).setCreatedAt(oldDate).setUpdatedAt(oldDate) - )); - - underTest.restoreCharacteristics( - session, new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY"), - now - ); - - verify(dao, times(2)).update(characteristicCaptor.capture(), eq(session)); - - CharacteristicDto dto1 = characteristicCaptor.getAllValues().get(0); - assertThat(dto1.getId()).isEqualTo(1); - assertThat(dto1.getKey()).isEqualTo("PORTABILITY"); - assertThat(dto1.getName()).isEqualTo("Portability"); - assertThat(dto1.getParentId()).isNull(); - assertThat(dto1.getOrder()).isEqualTo(1); - assertThat(dto1.getCreatedAt()).isEqualTo(oldDate); - assertThat(dto1.getUpdatedAt()).isEqualTo(now); - - CharacteristicDto dto2 = characteristicCaptor.getAllValues().get(1); - assertThat(dto2.getId()).isEqualTo(2); - assertThat(dto2.getKey()).isEqualTo("COMPILER"); - assertThat(dto2.getName()).isEqualTo("Compiler"); - assertThat(dto2.getParentId()).isEqualTo(1); - assertThat(dto2.getOrder()).isNull(); - assertThat(dto2.getCreatedAt()).isEqualTo(oldDate); - assertThat(dto2.getUpdatedAt()).isEqualTo(now); - } - - @Test - public void update_parent_when_restoring_characteristics() { - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - // Parent has changed - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setParentId(1).setOrder(1).setCreatedAt(oldDate).setUpdatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setCreatedAt(oldDate).setUpdatedAt(oldDate) - )); - - underTest.restoreCharacteristics( - session, new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY"), - now - ); - - verify(dao, times(2)).update(characteristicCaptor.capture(), eq(session)); - - CharacteristicDto dto1 = characteristicCaptor.getAllValues().get(0); - assertThat(dto1.getId()).isEqualTo(1); - assertThat(dto1.getKey()).isEqualTo("PORTABILITY"); - assertThat(dto1.getParentId()).isNull(); - assertThat(dto1.getUpdatedAt()).isEqualTo(now); - - CharacteristicDto dto2 = characteristicCaptor.getAllValues().get(1); - assertThat(dto2.getId()).isEqualTo(2); - assertThat(dto2.getKey()).isEqualTo("COMPILER"); - assertThat(dto2.getParentId()).isEqualTo(1); - assertThat(dto2.getUpdatedAt()).isEqualTo(now); - } - - @Test - public void disable_no_more_existing_characteristics_when_restoring_characteristics() { - CharacteristicDto dto1 = new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(1); - CharacteristicDto dto2 = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList(dto1, dto2)); - - underTest.restoreCharacteristics(session, new DebtModel(), now); - - verify(debtModelOperations).delete(dto1, now, session); - verify(debtModelOperations).delete(dto2, now, session); - } - @Test public void reset_model() { - when(characteristicsXMLImporter.importXML(any(Reader.class))).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2),// .setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1)// .setCreatedAt(oldDate) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( new RuleDto().setRepositoryKey("squid").setRuleKey("NPE") - .setDefaultSubCharacteristicId(10) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setDefaultRemediationCoefficient("2h") - .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) .setRemediationCoefficient("2h") .setRemediationOffset("15min") @@ -431,33 +238,26 @@ public class DebtModelBackupTest { .setName("Detect NPE") .setHtmlDescription("Detect java.lang.NullPointerException") .setSeverity(Severity.BLOCKER) - .setStatus(RuleStatus.BETA) - .setDebtSubCharacteristic("COMPILER"); + .setStatus(RuleStatus.BETA); newRule.setDebtRemediationFunction(newRule.debtRemediationFunctions().linearWithOffset("4h", "20min")); repo.done(); when(defLoader.load()).thenReturn(context); underTest.reset(); - verify(dao).selectEnabledCharacteristics(session); - verify(dao, times(2)).update(any(CharacteristicDto.class), eq(session)); - verifyNoMoreInteractions(dao); - verify(ruleDao).selectEnabledAndNonManual(session); - verify(ruleDao).update(eq(session), ruleCaptor.capture()); + verify(deprecatedRuleDao).update(eq(session), ruleCaptor.capture()); verifyNoMoreInteractions(ruleDao); verify(session).commit(); RuleDto rule = ruleCaptor.getValue(); - assertThat(rule.getDefaultSubCharacteristicId()).isEqualTo(2); assertThat(rule.getDefaultRemediationFunction()).isEqualTo("LINEAR_OFFSET"); assertThat(rule.getDefaultRemediationCoefficient()).isEqualTo("4h"); assertThat(rule.getDefaultRemediationOffset()).isEqualTo("20min"); assertThat(rule.getUpdatedAt()).isEqualTo(now); - assertThat(rule.getSubCharacteristicId()).isNull(); assertThat(rule.getRemediationFunction()).isNull(); assertThat(rule.getRemediationCoefficient()).isNull(); assertThat(rule.getRemediationOffset()).isNull(); @@ -466,21 +266,10 @@ public class DebtModelBackupTest { @Test public void reset_model_when_no_default_value() { - when(characteristicsXMLImporter.importXML(any(Reader.class))).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2).setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1).setCreatedAt(oldDate) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( new RuleDto().setRepositoryKey("squid").setRuleKey("NPE") - .setDefaultSubCharacteristicId(10) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setDefaultRemediationCoefficient("2h") - .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) .setRemediationCoefficient("2h") .setRemediationOffset("15min") @@ -498,18 +287,13 @@ public class DebtModelBackupTest { underTest.reset(); - verify(dao).selectEnabledCharacteristics(session); - verify(dao, times(2)).update(any(CharacteristicDto.class), eq(session)); - verifyNoMoreInteractions(dao); - verify(ruleDao).selectEnabledAndNonManual(session); - verify(ruleDao).update(eq(session), ruleCaptor.capture()); + verify(deprecatedRuleDao).update(eq(session), ruleCaptor.capture()); verifyNoMoreInteractions(ruleDao); verify(session).commit(); RuleDto rule = ruleCaptor.getValue(); - assertThat(rule.getDefaultSubCharacteristicId()).isNull(); assertThat(rule.getDefaultRemediationFunction()).isNull(); assertThat(rule.getDefaultRemediationCoefficient()).isNull(); assertThat(rule.getDefaultRemediationOffset()).isNull(); @@ -518,25 +302,14 @@ public class DebtModelBackupTest { @Test public void reset_model_on_custom_rules() { - when(characteristicsXMLImporter.importXML(any(Reader.class))).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2).setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1).setCreatedAt(oldDate) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( // Template rule new RuleDto().setId(5).setRepositoryKey("squid").setRuleKey("XPath") - .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) .setRemediationCoefficient("2h") .setRemediationOffset("15min"), // Custom rule new RuleDto().setId(6).setRepositoryKey("squid").setRuleKey("XPath_1369910135").setTemplateId(5) - .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) .setRemediationCoefficient("2h") .setRemediationOffset("15min") @@ -549,8 +322,7 @@ public class DebtModelBackupTest { .setName("XPath") .setHtmlDescription("XPath") .setSeverity(Severity.BLOCKER) - .setStatus(RuleStatus.BETA) - .setDebtSubCharacteristic("COMPILER"); + .setStatus(RuleStatus.BETA); newRule.setDebtRemediationFunction(newRule.debtRemediationFunctions().linearWithOffset("4h", "20min")); repo.done(); when(defLoader.load()).thenReturn(context); @@ -558,20 +330,18 @@ public class DebtModelBackupTest { underTest.reset(); verify(ruleDao).selectEnabledAndNonManual(session); - verify(ruleDao, times(2)).update(eq(session), ruleCaptor.capture()); + verify(deprecatedRuleDao, times(2)).update(eq(session), ruleCaptor.capture()); verifyNoMoreInteractions(ruleDao); verify(session).commit(); RuleDto rule = ruleCaptor.getAllValues().get(1); assertThat(rule.getId()).isEqualTo(6); - assertThat(rule.getDefaultSubCharacteristicId()).isEqualTo(2); assertThat(rule.getDefaultRemediationFunction()).isEqualTo("LINEAR_OFFSET"); assertThat(rule.getDefaultRemediationCoefficient()).isEqualTo("4h"); assertThat(rule.getDefaultRemediationOffset()).isEqualTo("20min"); assertThat(rule.getUpdatedAt()).isEqualTo(now); - assertThat(rule.getSubCharacteristicId()).isNull(); assertThat(rule.getRemediationFunction()).isNull(); assertThat(rule.getRemediationCoefficient()).isNull(); assertThat(rule.getRemediationOffset()).isNull(); @@ -580,25 +350,12 @@ public class DebtModelBackupTest { @Test public void reset_model_do_not_load_rule_definitions_if_no_rule() { - when(characteristicsXMLImporter.importXML(any(Reader.class))).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2).setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1).setCreatedAt(oldDate) - )); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(Collections.emptyList()); underTest.reset(); - verify(dao).selectEnabledCharacteristics(session); - verify(dao, times(2)).update(any(CharacteristicDto.class), eq(session)); - verifyNoMoreInteractions(dao); - verify(ruleDao).selectEnabledAndNonManual(session); - verify(ruleDao, never()).update(eq(session), any(RuleDto.class)); + verify(deprecatedRuleDao, never()).update(eq(session), any(RuleDto.class)); verifyZeroInteractions(defLoader); verify(session).commit(); @@ -606,30 +363,18 @@ public class DebtModelBackupTest { @Test public void restore_from_xml() { - when(characteristicsXMLImporter.importXML(anyString())).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - CharacteristicDto compiler = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1).setCreatedAt(oldDate); - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(1).setCreatedAt(oldDate), - new CharacteristicDto().setId(3).setKey("HARDWARE").setName("Hardware").setParentId(1).setCreatedAt(oldDate), - compiler)); - when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt() .setRuleKey(RuleKey.of("squid", "UselessImportCheck")) - .setSubCharacteristicKey("COMPILER") .setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h"))); when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setDefaultSubCharacteristicId(3).setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h") - // .setCreatedAt(oldDate).setUpdatedAt(oldDate) + .setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h") )); underTest.restoreFromXml(""); - verify(ruleOperations).updateRule(ruleCaptor.capture(), eq(compiler), eq("LINEAR"), eq("2h"), isNull(String.class), eq(session)); + verify(ruleOperations).updateRule(ruleCaptor.capture(), eq("LINEAR"), eq("2h"), isNull(String.class), eq(session)); verify(ruleDao).selectEnabledAndNonManual(session); verify(session).commit(); @@ -637,23 +382,14 @@ public class DebtModelBackupTest { @Test public void restore_from_xml_disable_rule_debt_when_not_in_xml_and_rule_have_default_debt_values() { - when(characteristicsXMLImporter.importXML(anyString())).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(1).setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1).setCreatedAt(oldDate))); - when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setDefaultSubCharacteristicId(2).setDefaultRemediationFunction("LINEAR_OFFSET").setDefaultRemediationCoefficient("2h").setDefaultRemediationOffset("15min") - // .setCreatedAt(oldDate).setUpdatedAt(oldDate) + .setDefaultRemediationFunction("LINEAR_OFFSET").setDefaultRemediationCoefficient("2h").setDefaultRemediationOffset("15min") )); underTest.restoreFromXml(""); - verify(ruleOperations).updateRule(ruleCaptor.capture(), isNull(CharacteristicDto.class), isNull(String.class), isNull(String.class), isNull(String.class), eq(session)); + verify(ruleOperations).updateRule(ruleCaptor.capture(), isNull(String.class), isNull(String.class), isNull(String.class), eq(session)); verify(ruleDao).selectEnabledAndNonManual(session); verify(session).commit(); @@ -661,71 +397,34 @@ public class DebtModelBackupTest { @Test public void restore_from_xml_and_language() { - when(characteristicsXMLImporter.importXML(anyString())).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - CharacteristicDto compiler = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1).setCreatedAt(oldDate); - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(1).setCreatedAt(oldDate), - compiler)); - when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt() - .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setSubCharacteristicKey("COMPILER").setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h"))); + .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h"))); when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck").setLanguage("java") - .setDefaultSubCharacteristicId(10) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setDefaultRemediationCoefficient("2h"), // Should be ignored new RuleDto().setId(2).setRepositoryKey("checkstyle").setLanguage("java2") - .setSubCharacteristicId(3) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setRemediationCoefficient("2h") )); underTest.restoreFromXml("", "java"); - verify(ruleOperations).updateRule(ruleCaptor.capture(), eq(compiler), eq("LINEAR"), eq("2h"), isNull(String.class), eq(session)); + verify(ruleOperations).updateRule(ruleCaptor.capture(), eq("LINEAR"), eq("2h"), isNull(String.class), eq(session)); verify(ruleDao).selectEnabledAndNonManual(session); verify(session).commit(); } - @Test - public void restore_from_xml_and_language_disable_no_more_existing_characteristics() { - when(characteristicsXMLImporter.importXML(anyString())).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1))); - - CharacteristicDto dto1 = new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(1); - // No more existing characteristic - CharacteristicDto dto2 = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList(dto1, dto2)); - - underTest.restoreFromXml("", "java"); - - verify(debtModelOperations).delete(dto2, now, session); - verify(session).commit(); - } - @Test public void restore_from_xml_and_language_with_rule_not_in_xml() { - when(characteristicsXMLImporter.importXML(anyString())).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability updated").setOrder(2).setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler updated").setParentId(1).setCreatedAt(oldDate) - )); - when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(Collections.emptyList()); when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( // Rule does not exits in XML -> debt will be disabled new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck").setLanguage("java") - .setDefaultSubCharacteristicId(2).setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h") - .setSubCharacteristicId(2) + .setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h") .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) .setRemediationCoefficient("2h") .setRemediationOffset("15min") @@ -733,7 +432,7 @@ public class DebtModelBackupTest { underTest.restoreFromXml("", "java"); - verify(ruleOperations).updateRule(ruleCaptor.capture(), isNull(CharacteristicDto.class), isNull(String.class), isNull(String.class), isNull(String.class), eq(session)); + verify(ruleOperations).updateRule(ruleCaptor.capture(), isNull(String.class), isNull(String.class), isNull(String.class), eq(session)); verify(ruleDao).selectEnabledAndNonManual(session); verify(session).commit(); @@ -741,16 +440,8 @@ public class DebtModelBackupTest { @Test public void restore_from_xml_add_warning_message_when_rule_from_xml_is_not_found() { - when(characteristicsXMLImporter.importXML(anyString())).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(1).setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1).setCreatedAt(oldDate))); - when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt() - .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setSubCharacteristicKey("COMPILER").setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h"))); + .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h"))); when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(Collections.emptyList()); @@ -764,24 +455,15 @@ public class DebtModelBackupTest { @Test public void restore_from_xml_add_error_message_when_illegal_argument_exception() { - when(characteristicsXMLImporter.importXML(anyString())).thenReturn(new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(1)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("COMPILER").setName("Compiler"), "PORTABILITY")); - - when(dao.selectEnabledCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(1).setCreatedAt(oldDate), - new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1).setCreatedAt(oldDate))); - when(rulesXMLImporter.importXML(anyString(), any(ValidationMessages.class))).thenReturn(newArrayList(new RuleDebt() - .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setSubCharacteristicKey("COMPILER").setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h"))); + .setRuleKey(RuleKey.of("squid", "UselessImportCheck")).setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("2h"))); when(ruleDao.selectEnabledAndNonManual(session)).thenReturn(newArrayList( new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setDefaultSubCharacteristicId(3).setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h") - // .setCreatedAt(oldDate).setUpdatedAt(oldDate) + .setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h") )); - when(ruleOperations.updateRule(any(RuleDto.class), any(CharacteristicDto.class), anyString(), anyString(), anyString(), eq(session))).thenThrow(IllegalArgumentException.class); + when(ruleOperations.updateRule(any(RuleDto.class), anyString(), anyString(), anyString(), eq(session))).thenThrow(IllegalArgumentException.class); assertThat(underTest.restoreFromXml("").getErrors()).hasSize(1); diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelLookupTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelLookupTest.java deleted file mode 100644 index 6d0a1d8014f..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelLookupTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; - -import static com.google.common.collect.Lists.newArrayList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class DebtModelLookupTest { - - @Mock - CharacteristicDao dao; - - CharacteristicDto characteristicDto = new CharacteristicDto() - .setId(1) - .setKey("MEMORY_EFFICIENCY") - .setName("Memory use") - .setOrder(2) - .setEnabled(true); - - DebtModelLookup service; - - @Before - public void setUp() { - service = new DebtModelLookup(dao); - } - - @Test - public void find_root_characteristics() { - when(dao.selectEnabledRootCharacteristics()).thenReturn(newArrayList(characteristicDto)); - assertThat(service.rootCharacteristics()).hasSize(1); - } - - @Test - public void find_all_characteristics() { - when(dao.selectEnabledCharacteristics()).thenReturn(newArrayList(characteristicDto)); - assertThat(service.allCharacteristics()).hasSize(1); - } - - @Test - public void find_characteristic_by_id() { - when(dao.selectById(1)).thenReturn(characteristicDto); - - DefaultDebtCharacteristic characteristic = (DefaultDebtCharacteristic) service.characteristicById(1); - assertThat(characteristic.id()).isEqualTo(1); - assertThat(characteristic.key()).isEqualTo("MEMORY_EFFICIENCY"); - assertThat(characteristic.name()).isEqualTo("Memory use"); - assertThat(characteristic.order()).isEqualTo(2); - assertThat(characteristic.parentId()).isNull(); - - assertThat(service.characteristicById(111)).isNull(); - } - - @Test - public void find_characteristic_by_key() { - when(dao.selectByKey("MEMORY_EFFICIENCY")).thenReturn(characteristicDto); - - DefaultDebtCharacteristic characteristic = (DefaultDebtCharacteristic) service.characteristicByKey("MEMORY_EFFICIENCY"); - assertThat(characteristic.id()).isEqualTo(1); - assertThat(characteristic.key()).isEqualTo("MEMORY_EFFICIENCY"); - assertThat(characteristic.name()).isEqualTo("Memory use"); - assertThat(characteristic.order()).isEqualTo(2); - assertThat(characteristic.parentId()).isNull(); - - assertThat(service.characteristicByKey("UNKNOWN")).isNull(); - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelOperationsTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelOperationsTest.java deleted file mode 100644 index 9df40ce53d6..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelOperationsTest.java +++ /dev/null @@ -1,491 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import java.util.Date; -import org.apache.ibatis.session.SqlSession; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.runners.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.DebtRemediationFunction; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; -import org.sonar.api.utils.DateUtils; -import org.sonar.api.utils.System2; -import org.sonar.core.permission.GlobalPermissions; -import org.sonar.db.DbSession; -import org.sonar.db.rule.RuleDto; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; -import org.sonar.server.db.DbClient; -import org.sonar.server.exceptions.BadRequestException; -import org.sonar.server.exceptions.ForbiddenException; -import org.sonar.server.exceptions.NotFoundException; -import org.sonar.server.rule.db.RuleDao; -import org.sonar.server.tester.UserSessionRule; - -import static com.google.common.collect.Lists.newArrayList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * TODO this class should use ServerTester instead of mocking db - */ -@RunWith(MockitoJUnitRunner.class) -public class DebtModelOperationsTest { - - @Rule - public UserSessionRule userSessionRule = UserSessionRule.standalone(); - - @Mock - CharacteristicDao dao; - - @Mock - RuleDao ruleDao; - - @Mock - DbClient dbClient; - - @Mock - DbSession session; - - @Mock - System2 system2; - - @Captor - ArgumentCaptor characteristicCaptor; - - @Captor - ArgumentCaptor ruleCaptor; - - Date now = DateUtils.parseDate("2014-03-19"); - - CharacteristicDto characteristicDto = new CharacteristicDto() - .setId(1) - .setKey("MEMORY_EFFICIENCY") - .setName("Memory use") - .setOrder(2) - .setEnabled(true); - - CharacteristicDto subCharacteristicDto = new CharacteristicDto() - .setId(2) - .setKey("EFFICIENCY") - .setName("Efficiency") - .setParentId(1) - .setEnabled(true); - - int currentId; - - DebtModelOperations service; - - @Before - public void setUp() { - when(system2.now()).thenReturn(now.getTime()); - - userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN); - - currentId = 10; - // Associate an id when inserting an object to simulate the db id generator - doAnswer(new Answer() { - public Object answer(InvocationOnMock invocation) { - Object[] args = invocation.getArguments(); - CharacteristicDto dto = (CharacteristicDto) args[1]; - dto.setId(++currentId); - return null; - } - }).when(dao).insert(any(SqlSession.class), any(CharacteristicDto.class)); - - when(dbClient.openSession(false)).thenReturn(session); - when(dbClient.deprecatedRuleDao()).thenReturn(ruleDao); - when(dbClient.debtCharacteristicDao()).thenReturn(dao); - service = new DebtModelOperations(dbClient, system2, userSessionRule); - } - - @Test - public void create_sub_characteristic() { - when(dao.selectById(session, 1)).thenReturn(characteristicDto); - - DefaultDebtCharacteristic result = (DefaultDebtCharacteristic) service.create("Compilation name", 1); - - assertThat(result.id()).isEqualTo(currentId); - assertThat(result.key()).isEqualTo("COMPILATION_NAME"); - assertThat(result.name()).isEqualTo("Compilation name"); - assertThat(result.parentId()).isEqualTo(1); - assertThat(result.createdAt()).isEqualTo(now); - } - - @Test - public void fail_to_create_sub_characteristic_when_parent_id_is_not_a_root_characteristic() { - when(dao.selectById(session, 1)).thenReturn(subCharacteristicDto); - - try { - service.create("Compilation", 1); - fail(); - } catch (BadRequestException e) { - assertThat(e.firstError().getKey()).isEqualTo("A sub characteristic can not have a sub characteristic as parent."); - } - } - - @Test - public void fail_to_create_sub_characteristic_when_parent_does_not_exists() { - when(dao.selectById(session, 1)).thenReturn(null); - - try { - service.create("Compilation", 1); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Characteristic with id 1 does not exists."); - } - } - - @Test - public void fail_to_create_sub_characteristic_when_name_already_used() { - when(dao.selectByName(session, "Compilation")).thenReturn(new CharacteristicDto()); - when(dao.selectById(session, 1)).thenReturn(characteristicDto); - - try { - service.create("Compilation", 1); - fail(); - } catch (BadRequestException e) { - assertThat(e.firstError().getKey()).isEqualTo("errors.is_already_used"); - assertThat(e.firstError().getParams()[0]).isEqualTo("Compilation"); - } - } - - @Test - public void fail_to_create_sub_characteristic_when_wrong_permission() { - userSessionRule.setGlobalPermissions(GlobalPermissions.DASHBOARD_SHARING); - - try { - service.create("Compilation", 1); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(ForbiddenException.class); - } - } - - @Test - public void create_characteristic() { - when(dao.selectMaxCharacteristicOrder(session)).thenReturn(2); - - DefaultDebtCharacteristic result = (DefaultDebtCharacteristic) service.create("Portability", null); - - assertThat(result.id()).isEqualTo(currentId); - assertThat(result.key()).isEqualTo("PORTABILITY"); - assertThat(result.name()).isEqualTo("Portability"); - assertThat(result.order()).isEqualTo(3); - assertThat(result.createdAt()).isEqualTo(now); - } - - @Test - public void create_first_characteristic() { - when(dao.selectMaxCharacteristicOrder(session)).thenReturn(0); - - DefaultDebtCharacteristic result = (DefaultDebtCharacteristic) service.create("Portability", null); - - assertThat(result.id()).isEqualTo(currentId); - assertThat(result.key()).isEqualTo("PORTABILITY"); - assertThat(result.name()).isEqualTo("Portability"); - assertThat(result.order()).isEqualTo(1); - assertThat(result.createdAt()).isEqualTo(now); - } - - @Test - public void rename_characteristic() { - when(dao.selectById(session, 10)).thenReturn(subCharacteristicDto); - - DefaultDebtCharacteristic result = (DefaultDebtCharacteristic) service.rename(10, "New Efficiency"); - - assertThat(result.key()).isEqualTo("EFFICIENCY"); - assertThat(result.name()).isEqualTo("New Efficiency"); - assertThat(result.updatedAt()).isEqualTo(now); - } - - @Test - public void not_rename_characteristic_when_renaming_with_same_name() { - when(dao.selectById(session, 10)).thenReturn(subCharacteristicDto); - - service.rename(10, "Efficiency"); - - verify(dao, never()).update(any(CharacteristicDto.class), eq(session)); - } - - @Test - public void fail_to_rename_unknown_characteristic() { - when(dao.selectById(session, 10)).thenReturn(null); - - try { - service.rename(10, "New Efficiency"); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Characteristic with id 10 does not exists."); - } - } - - @Test - public void move_up() { - when(dao.selectById(session, 10)).thenReturn(new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2)); - when(dao.selectEnabledRootCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(2).setKey("PORTABILITY").setOrder(1), - new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2) - )); - - DebtCharacteristic result = service.moveUp(10); - - verify(dao, times(2)).update(characteristicCaptor.capture(), eq(session)); - - assertThat(result.order()).isEqualTo(1); - assertThat(characteristicCaptor.getAllValues().get(0).getOrder()).isEqualTo(2); - assertThat(characteristicCaptor.getAllValues().get(0).getUpdatedAt()).isEqualTo(now); - assertThat(characteristicCaptor.getAllValues().get(1).getOrder()).isEqualTo(1); - assertThat(characteristicCaptor.getAllValues().get(1).getUpdatedAt()).isEqualTo(now); - } - - @Test - public void do_nothing_when_move_up_and_already_on_top() { - when(dao.selectById(session, 10)).thenReturn(new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(1)); - when(dao.selectEnabledRootCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(1), - new CharacteristicDto().setId(2).setKey("PORTABILITY").setOrder(2) - )); - - service.moveUp(10); - - verify(dao, never()).update(any(CharacteristicDto.class), eq(session)); - } - - @Test - public void move_down() { - when(dao.selectById(session, 10)).thenReturn(new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2)); - when(dao.selectEnabledRootCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2), - new CharacteristicDto().setId(2).setKey("PORTABILITY").setOrder(3) - )); - - DebtCharacteristic result = service.moveDown(10); - - verify(dao, times(2)).update(characteristicCaptor.capture(), eq(session)); - - assertThat(result.order()).isEqualTo(3); - assertThat(characteristicCaptor.getAllValues().get(0).getOrder()).isEqualTo(2); - assertThat(characteristicCaptor.getAllValues().get(0).getUpdatedAt()).isEqualTo(now); - assertThat(characteristicCaptor.getAllValues().get(1).getOrder()).isEqualTo(3); - assertThat(characteristicCaptor.getAllValues().get(1).getUpdatedAt()).isEqualTo(now); - } - - @Test - public void do_nothing_when_move_down_and_already_on_bottom() { - when(dao.selectById(session, 10)).thenReturn(new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2)); - when(dao.selectEnabledRootCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(2).setKey("PORTABILITY").setOrder(1), - new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2) - )); - - service.moveDown(10); - - verify(dao, never()).update(any(CharacteristicDto.class), eq(session)); - } - - @Test - public void fail_to_move_sub_characteristic() { - when(dao.selectById(session, 10)).thenReturn(new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setParentId(1)); - when(dao.selectEnabledRootCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2), - new CharacteristicDto().setId(2).setKey("PORTABILITY").setOrder(3) - )); - - try { - service.moveDown(10); - fail(); - } catch (BadRequestException e) { - assertThat(e.firstError().getKey()).isEqualTo("Sub characteristics can not be moved."); - } - verify(dao, never()).update(any(CharacteristicDto.class), eq(session)); - } - - @Test - public void fail_to_move_characteristic_with_no_order() { - when(dao.selectById(session, 10)).thenReturn(new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(null)); - when(dao.selectEnabledRootCharacteristics(session)).thenReturn(newArrayList( - new CharacteristicDto().setId(10).setKey("MEMORY_EFFICIENCY").setOrder(2), - new CharacteristicDto().setId(2).setKey("PORTABILITY").setOrder(3) - )); - - try { - service.moveDown(10); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("The order of the characteristic 'MEMORY_EFFICIENCY' should not be null"); - } - - verify(dao, never()).update(any(CharacteristicDto.class), eq(session)); - } - - @Test - public void delete_sub_characteristic() { - DbSession batchSession = mock(DbSession.class); - when(dbClient.openSession(true)).thenReturn(batchSession); - - when(ruleDao.selectRulesByDebtSubCharacteristicId(batchSession, 2)).thenReturn(newArrayList( - new RuleDto() - .setSubCharacteristicId(2) - .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) - .setRemediationCoefficient("2h").setRemediationOffset("5min") - .setDefaultSubCharacteristicId(10) - .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) - .setDefaultRemediationCoefficient("4h") - .setDefaultRemediationOffset("15min") - )); - when(dao.selectById(batchSession, 2)).thenReturn(subCharacteristicDto); - - service.delete(2); - - verify(ruleDao).update(eq(batchSession), ruleCaptor.capture()); - - RuleDto ruleDto = ruleCaptor.getValue(); - assertThat(ruleDto.getUpdatedAt()).isEqualTo(now); - - // Overridden debt data are disabled - assertThat(ruleDto.getSubCharacteristicId()).isEqualTo(-1); - assertThat(ruleDto.getRemediationFunction()).isNull(); - assertThat(ruleDto.getRemediationCoefficient()).isNull(); - assertThat(ruleDto.getRemediationOffset()).isNull(); - - // Default debt data should not be touched - assertThat(ruleDto.getDefaultSubCharacteristicId()).isEqualTo(10); - assertThat(ruleDto.getDefaultRemediationFunction()).isEqualTo("LINEAR_OFFSET"); - assertThat(ruleDto.getDefaultRemediationCoefficient()).isEqualTo("4h"); - assertThat(ruleDto.getDefaultRemediationOffset()).isEqualTo("15min"); - - verify(dao).update(characteristicCaptor.capture(), eq(batchSession)); - CharacteristicDto characteristicDto = characteristicCaptor.getValue(); - - // Sub characteristic is disable - assertThat(characteristicDto.getId()).isEqualTo(2); - assertThat(characteristicDto.isEnabled()).isFalse(); - assertThat(characteristicDto.getUpdatedAt()).isEqualTo(now); - } - - @Test - public void delete_sub_characteristic_disable_default_rules_debt_if_default_characteristic_is_deleted() { - DbSession batchSession = mock(DbSession.class); - when(dbClient.openSession(true)).thenReturn(batchSession); - - when(ruleDao.selectRulesByDebtSubCharacteristicId(batchSession, 2)).thenReturn(newArrayList( - new RuleDto() - .setSubCharacteristicId(10).setRemediationFunction("LINEAR_OFFSET").setRemediationCoefficient("2h").setRemediationOffset("5min") - .setDefaultSubCharacteristicId(2).setDefaultRemediationFunction("LINEAR_OFFSET").setDefaultRemediationCoefficient("4h").setDefaultRemediationOffset("15min") - )); - when(dao.selectById(batchSession, 2)).thenReturn(subCharacteristicDto); - - service.delete(2); - - verify(ruleDao).update(eq(batchSession), ruleCaptor.capture()); - RuleDto ruleDto = ruleCaptor.getValue(); - - // Default debt data are disabled - assertThat(ruleDto.getDefaultSubCharacteristicId()).isNull(); - assertThat(ruleDto.getDefaultRemediationFunction()).isNull(); - assertThat(ruleDto.getDefaultRemediationCoefficient()).isNull(); - assertThat(ruleDto.getDefaultRemediationOffset()).isNull(); - - // Overridden debt data should not be touched - assertThat(ruleDto.getSubCharacteristicId()).isEqualTo(10); - assertThat(ruleDto.getRemediationFunction()).isEqualTo("LINEAR_OFFSET"); - assertThat(ruleDto.getRemediationCoefficient()).isEqualTo("2h"); - assertThat(ruleDto.getRemediationOffset()).isEqualTo("5min"); - - verify(dao).update(characteristicCaptor.capture(), eq(batchSession)); - CharacteristicDto characteristicDto = characteristicCaptor.getValue(); - - // Sub characteristic is disable - assertThat(characteristicDto.getId()).isEqualTo(2); - assertThat(characteristicDto.isEnabled()).isFalse(); - assertThat(characteristicDto.getUpdatedAt()).isEqualTo(now); - } - - @Test - public void delete_characteristic() { - DbSession batchSession = mock(DbSession.class); - when(dbClient.openSession(true)).thenReturn(batchSession); - - when(ruleDao.selectRulesByDebtSubCharacteristicId(batchSession, subCharacteristicDto.getId())).thenReturn(newArrayList( - new RuleDto().setSubCharacteristicId(subCharacteristicDto.getId()) - .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) - .setRemediationCoefficient("2h") - .setRemediationOffset("5min") - )); - when(dao.selectCharacteristicsByParentId(1, batchSession)).thenReturn(newArrayList( - subCharacteristicDto - )); - when(dao.selectById(batchSession, 1)).thenReturn(characteristicDto); - - service.delete(1); - - verify(ruleDao).update(eq(batchSession), ruleCaptor.capture()); - - verify(dao, times(2)).update(characteristicCaptor.capture(), eq(batchSession)); - CharacteristicDto subCharacteristicDto = characteristicCaptor.getAllValues().get(0); - CharacteristicDto characteristicDto = characteristicCaptor.getAllValues().get(1); - - // Sub characteristic is disable - assertThat(subCharacteristicDto.getId()).isEqualTo(2); - assertThat(subCharacteristicDto.isEnabled()).isFalse(); - assertThat(subCharacteristicDto.getUpdatedAt()).isEqualTo(now); - - // Characteristic is disable - assertThat(characteristicDto.getId()).isEqualTo(1); - assertThat(characteristicDto.isEnabled()).isFalse(); - assertThat(characteristicDto.getUpdatedAt()).isEqualTo(now); - } - - @Test - public void not_delete_already_disabled_characteristic() { - DbSession batchSession = mock(DbSession.class); - when(dbClient.openSession(true)).thenReturn(batchSession); - - when(dao.selectById(batchSession, 1)).thenReturn(new CharacteristicDto() - .setId(1) - .setKey("MEMORY_EFFICIENCY") - .setName("Memory use") - .setOrder(2) - .setEnabled(false)); - - service.delete(1); - - verify(dao, never()).update(any(CharacteristicDto.class), eq(batchSession)); - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelPluginRepositoryTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelPluginRepositoryTest.java index 341abdaefeb..8450f55e0f2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelPluginRepositoryTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelPluginRepositoryTest.java @@ -22,6 +22,12 @@ package org.sonar.server.debt; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.Resources; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.Reader; +import java.util.Collection; +import java.util.List; +import java.util.Map; import org.apache.commons.io.IOUtils; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; @@ -30,13 +36,6 @@ import org.sonar.api.SonarPlugin; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.Reader; -import java.util.Collection; -import java.util.List; -import java.util.Map; - import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelServiceTest.java index 8609454557a..98883a214b4 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelServiceTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelServiceTest.java @@ -30,103 +30,43 @@ import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class DebtModelServiceTest { - @Mock - DebtModelOperations debtModelOperations; - - @Mock - DebtModelLookup debtModelLookup; - @Mock DebtModelBackup debtModelBackup; - DebtModelService service; + DebtModelService underTest; @Before public void setUp() { - service = new DebtModelService(debtModelOperations, debtModelLookup, debtModelBackup); - } - - @Test - public void find_root_characteristics() { - service.characteristics(); - verify(debtModelLookup).rootCharacteristics(); - } - - @Test - public void find_all_characteristics() { - service.allCharacteristics(); - verify(debtModelLookup).allCharacteristics(); - } - - @Test - public void find_characteristic_by_id() { - service.characteristicById(111); - verify(debtModelLookup).characteristicById(111); - } - - @Test - public void find_characteristic_by_key() { - service.characteristicByKey("MEMORY_EFFICIENCY"); - verify(debtModelLookup).characteristicByKey("MEMORY_EFFICIENCY"); - } - - @Test - public void create_characteristic() { - service.create("Compilation name", 1); - verify(debtModelOperations).create("Compilation name", 1); - } - - @Test - public void rename_characteristic() { - service.rename(10, "New Efficiency"); - verify(debtModelOperations).rename(10, "New Efficiency"); - } - - @Test - public void move_up() { - service.moveUp(10); - verify(debtModelOperations).moveUp(10); - } - - @Test - public void move_down() { - service.moveDown(10); - verify(debtModelOperations).moveDown(10); - } - - @Test - public void delete_characteristic() { - service.delete(2); - verify(debtModelOperations).delete(2); + underTest = new DebtModelService(debtModelBackup); } @Test public void reset_model() { - service.reset(); + underTest.reset(); verify(debtModelBackup).reset(); } @Test public void restore_xml() { - service.restoreFromXml(""); + underTest.restoreFromXml(""); verify(debtModelBackup).restoreFromXml(""); } @Test public void restore_from_xml_and_language() { - service.restoreFromXmlAndLanguage("", "xoo"); + underTest.restoreFromXmlAndLanguage("", "xoo"); verify(debtModelBackup).restoreFromXml("", "xoo"); } @Test public void backup() { - service.backup(); + underTest.backup(); verify(debtModelBackup).backup(); } @Test public void backup_fom_language() { - service.backupFromLanguage("xoo"); + underTest.backupFromLanguage("xoo"); verify(debtModelBackup).backup("xoo"); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelXMLExporterTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelXMLExporterTest.java index e1288517f9d..bccf8a653a8 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelXMLExporterTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelXMLExporterTest.java @@ -23,124 +23,71 @@ import com.google.common.io.Resources; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.List; -import java.util.regex.Pattern; import org.apache.commons.lang.CharUtils; import org.apache.commons.lang.SystemUtils; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLUnit; -import org.junit.Before; import org.junit.Test; import org.sonar.api.rule.RuleKey; import org.sonar.api.server.debt.DebtRemediationFunction; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertTrue; -import static org.sonar.server.debt.DebtModelXMLExporter.DebtModel; import static org.sonar.server.debt.DebtModelXMLExporter.RuleDebt; public class DebtModelXMLExporterTest { - private DebtModelXMLExporter xmlExporter; - - @Before - public void setup() { - xmlExporter = new DebtModelXMLExporter(); - } + DebtModelXMLExporter underTest = new DebtModelXMLExporter(); @Test public void export_empty() { - assertThat(xmlExporter.export(new DebtModel(), Collections.emptyList())).isEqualTo("" + SystemUtils.LINE_SEPARATOR); + assertThat(underTest.export(Collections.emptyList())).isEqualTo("" + SystemUtils.LINE_SEPARATOR); } @Test public void export_xml() throws Exception { - DebtModel debtModel = new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setId(1).setKey("USABILITY").setName("Usability").setOrder(1)) - .addRootCharacteristic(new DefaultDebtCharacteristic().setId(2).setKey("EFFICIENCY").setName("Efficiency").setOrder(2)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setId(3).setKey("MEMORY_USE").setName("Memory use").setParentId(2), "EFFICIENCY"); - List rules = newArrayList( new RuleDebt().setRuleKey(RuleKey.of("checkstyle", "Regexp")) - .setSubCharacteristicKey("MEMORY_USE").setFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()).setCoefficient("3d").setOffset("15min") + .setFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()).setCoefficient("3d").setOffset("15min") ); - assertSimilarXml(getFileContent("export_xml.xml"), xmlExporter.export(debtModel, rules)); - } - - public static void assertSimilarXml(String expectedXml, String xml) throws Exception { - XMLUnit.setIgnoreWhitespace(true); - Diff diff = XMLUnit.compareXML(xml, expectedXml); - String message = "Diff: " + diff.toString() + CharUtils.LF + "XML: " + xml; - assertTrue(message, diff.similar()); - } - - @Test - public void sort_root_characteristics_by_order_and_sub_characteristics_by_name() { - DebtModel debtModel = new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("EFFICIENCY").setName("Efficiency").setOrder(4)) - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("USABILITY").setName("Usability").setOrder(3)) - .addRootCharacteristic(new DefaultDebtCharacteristic().setKey("PORTABILITY").setName("Portability").setOrder(2)) - - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("RAM_EFFICIENCY").setName("RAM Efficiency"), "EFFICIENCY") - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("CPU_EFFICIENCY").setName("CPU Efficiency"), "EFFICIENCY") - .addSubCharacteristic(new DefaultDebtCharacteristic().setKey("OTHER_EFFICIENCY").setName("Other Efficiency"), "EFFICIENCY"); - - String xml = xmlExporter.export(debtModel, Collections.emptyList()); - - // root characteristics are sorted by the column "characteristic_order" - assertThat(Pattern.compile(".*PORTABILITY.*USABILITY.*EFFICIENCY.*", Pattern.DOTALL).matcher(xml).matches()).isTrue(); - assertThat(Pattern.compile(".*USABILITY.*PORTABILITY.*EFFICIENCY.*", Pattern.DOTALL).matcher(xml).matches()).isFalse(); - - // sub characteristics are sorted by name - assertThat(Pattern.compile(".*CPU Efficiency.*Other Efficiency.*RAM Efficiency.*", Pattern.DOTALL).matcher(xml).matches()).isTrue(); - assertThat(Pattern.compile(".*CPU Efficiency.*RAM Efficiency.*Other Efficiency.*", Pattern.DOTALL).matcher(xml).matches()).isFalse(); + assertSimilarXml(getFileContent("export_xml.xml"), underTest.export(rules)); } @Test public void pretty_print_exported_xml() { - DebtModel debtModel = new DebtModel() - .addRootCharacteristic(new DefaultDebtCharacteristic().setId(1).setKey("USABILITY").setName("Usability").setOrder(1)) - .addRootCharacteristic(new DefaultDebtCharacteristic().setId(2).setKey("EFFICIENCY").setName("Efficiency").setOrder(2)) - .addSubCharacteristic(new DefaultDebtCharacteristic().setId(3).setKey("MEMORY_USE").setName("Memory use").setParentId(2), "EFFICIENCY"); - List rules = newArrayList( new RuleDebt().setRuleKey(RuleKey.of("checkstyle", "Regexp")) - .setSubCharacteristicKey("MEMORY_USE").setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("3d") + .setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient("3d") ); - assertThat(xmlExporter.export(debtModel, rules)).isEqualTo( + assertThat(underTest.export(rules)).isEqualTo( "" + SystemUtils.LINE_SEPARATOR + " " + SystemUtils.LINE_SEPARATOR + - " USABILITY" + SystemUtils.LINE_SEPARATOR + - " Usability" + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " EFFICIENCY" + SystemUtils.LINE_SEPARATOR + - " Efficiency" + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " MEMORY_USE" + SystemUtils.LINE_SEPARATOR + - " Memory use" + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " checkstyle" + SystemUtils.LINE_SEPARATOR + - " Regexp" + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " remediationFunction" + SystemUtils.LINE_SEPARATOR + - " LINEAR" + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " remediationFactor" + SystemUtils.LINE_SEPARATOR + - " 3" + SystemUtils.LINE_SEPARATOR + - " d" + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + - " " + SystemUtils.LINE_SEPARATOR + + " checkstyle" + SystemUtils.LINE_SEPARATOR + + " Regexp" + SystemUtils.LINE_SEPARATOR + + " " + SystemUtils.LINE_SEPARATOR + + " remediationFunction" + SystemUtils.LINE_SEPARATOR + + " LINEAR" + SystemUtils.LINE_SEPARATOR + + " " + SystemUtils.LINE_SEPARATOR + + " " + SystemUtils.LINE_SEPARATOR + + " remediationFactor" + SystemUtils.LINE_SEPARATOR + + " 3" + SystemUtils.LINE_SEPARATOR + + " d" + SystemUtils.LINE_SEPARATOR + + " " + SystemUtils.LINE_SEPARATOR + " " + SystemUtils.LINE_SEPARATOR + "" + SystemUtils.LINE_SEPARATOR ); } - private String getFileContent(String file) throws Exception { - return Resources.toString(Resources.getResource(getClass(), "DebtModelXMLExporterTest/" + file), StandardCharsets.UTF_8); + public static void assertSimilarXml(String expectedXml, String xml) throws Exception { + XMLUnit.setIgnoreWhitespace(true); + Diff diff = XMLUnit.compareXML(xml, expectedXml); + String message = "Diff: " + diff.toString() + CharUtils.LF + "XML: " + xml; + assertTrue(message, diff.similar()); + } + + private static String getFileContent(String file) throws Exception { + return Resources.toString(Resources.getResource(DebtModelXMLExporterTest.class, "DebtModelXMLExporterTest/" + file), StandardCharsets.UTF_8); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtRulesXMLImporterTest.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtRulesXMLImporterTest.java index 97a8c6ed1a0..eb6677efb14 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtRulesXMLImporterTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtRulesXMLImporterTest.java @@ -34,15 +34,26 @@ import static org.sonar.server.debt.DebtModelXMLExporter.RuleDebt; public class DebtRulesXMLImporterTest { ValidationMessages validationMessages = ValidationMessages.create(); - DebtRulesXMLImporter importer = new DebtRulesXMLImporter(); + DebtRulesXMLImporter underTest = new DebtRulesXMLImporter(); @Test public void import_rules() throws Exception { String xml = getFileContent("import_rules.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); - assertThat(results).hasSize(2); + assertThat(results).extracting("ruleKey").containsOnly(RuleKey.of("javasquid", "rule1"), RuleKey.of("javasquid", "rule2")); + assertThat(validationMessages.getErrors()).isEmpty(); + assertThat(validationMessages.getWarnings()).isEmpty(); + } + + @Test + public void import_rules_with_deprecated_quality_model_format() throws Exception { + String xml = getFileContent("import_rules_with_deprecated_quality_model_format.xml"); + + List results = underTest.importXML(xml, validationMessages); + + assertThat(results).extracting("ruleKey").containsOnly(RuleKey.of("javasquid", "rule1"), RuleKey.of("javasquid", "rule2")); assertThat(validationMessages.getErrors()).isEmpty(); assertThat(validationMessages.getWarnings()).isEmpty(); } @@ -51,11 +62,10 @@ public class DebtRulesXMLImporterTest { public void import_linear() throws Exception { String xml = getFileContent("import_linear.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.ruleKey()).isEqualTo(RuleKey.of("checkstyle", "Regexp")); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3h"); @@ -66,11 +76,10 @@ public class DebtRulesXMLImporterTest { public void import_linear_having_offset_to_zero() throws Exception { String xml = getFileContent("import_linear_having_offset_to_zero.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.ruleKey()).isEqualTo(RuleKey.of("checkstyle", "Regexp")); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3h"); @@ -81,11 +90,10 @@ public class DebtRulesXMLImporterTest { public void import_linear_with_offset() throws Exception { String xml = getFileContent("import_linear_with_offset.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3h"); assertThat(ruleDebt.offset()).isEqualTo("1min"); @@ -95,11 +103,10 @@ public class DebtRulesXMLImporterTest { public void import_constant_issue() throws Exception { String xml = getFileContent("import_constant_issue.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()); assertThat(ruleDebt.coefficient()).isNull(); assertThat(ruleDebt.offset()).isEqualTo("3d"); @@ -109,11 +116,10 @@ public class DebtRulesXMLImporterTest { public void use_default_unit_when_no_unit() throws Exception { String xml = getFileContent("use_default_unit_when_no_unit.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3d"); assertThat(ruleDebt.offset()).isEqualTo("1d"); @@ -123,11 +129,10 @@ public class DebtRulesXMLImporterTest { public void replace_mn_by_min() throws Exception { String xml = getFileContent("replace_mn_by_min.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3min"); assertThat(ruleDebt.offset()).isNull(); @@ -137,11 +142,10 @@ public class DebtRulesXMLImporterTest { public void read_integer() throws Exception { String xml = getFileContent("read_integer.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.ruleKey()).isEqualTo(RuleKey.of("checkstyle", "Regexp")); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3h"); @@ -152,11 +156,10 @@ public class DebtRulesXMLImporterTest { public void convert_deprecated_linear_with_threshold_function_by_linear_function() throws Exception { String xml = getFileContent("convert_deprecated_linear_with_threshold_function_by_linear_function.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3h"); assertThat(ruleDebt.offset()).isNull(); @@ -168,11 +171,10 @@ public class DebtRulesXMLImporterTest { public void convert_constant_per_issue_with_coefficient_by_constant_per_issue_with_offset() throws Exception { String xml = getFileContent("convert_constant_per_issue_with_coefficient_by_constant_per_issue_with_offset.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()); assertThat(ruleDebt.coefficient()).isNull(); assertThat(ruleDebt.offset()).isEqualTo("3h"); @@ -182,7 +184,7 @@ public class DebtRulesXMLImporterTest { public void ignore_remediation_cost_having_zero_value() throws Exception { String xml = getFileContent("ignore_remediation_cost_having_zero_value.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).isEmpty(); } @@ -190,17 +192,7 @@ public class DebtRulesXMLImporterTest { public void ignore_deprecated_constant_per_file_function() throws Exception { String xml = getFileContent("ignore_deprecated_constant_per_file_function.xml"); - List results = importer.importXML(xml, validationMessages); - assertThat(results).isEmpty(); - - assertThat(validationMessages.getWarnings()).isNotEmpty(); - } - - @Test - public void ignore_rule_on_root_characteristics() throws Exception { - String xml = getFileContent("ignore_rule_on_root_characteristics.xml"); - - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).isEmpty(); assertThat(validationMessages.getWarnings()).isNotEmpty(); @@ -210,11 +202,10 @@ public class DebtRulesXMLImporterTest { public void import_badly_formatted_xml() throws Exception { String xml = getFileContent("import_badly_formatted_xml.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).hasSize(1); RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(ruleDebt.ruleKey()).isEqualTo(RuleKey.of("checkstyle", "Regexp")); assertThat(ruleDebt.function()).isEqualTo(DebtRemediationFunction.Type.LINEAR.name()); assertThat(ruleDebt.coefficient()).isEqualTo("3h"); @@ -224,33 +215,18 @@ public class DebtRulesXMLImporterTest { @Test public void ignore_invalid_value() throws Exception { String xml = getFileContent("ignore_invalid_value.xml"); - List results = importer.importXML(xml, validationMessages); + List results = underTest.importXML(xml, validationMessages); assertThat(results).isEmpty(); assertThat(validationMessages.getErrors()).isNotEmpty(); } - /** - * SONAR-5180 - */ - @Test - public void convert_network_use_key() throws Exception { - // Rule is linked to sub characteristic key NETWORK_USE_EFFICIENCY - String xml = getFileContent("convert_network_use_key.xml"); - - List results = importer.importXML(xml, validationMessages); - assertThat(results).hasSize(1); - - RuleDebt ruleDebt = results.get(0); - assertThat(ruleDebt.subCharacteristicKey()).isEqualTo("NETWORK_USE"); - } - @Test public void fail_on_bad_xml() throws Exception { String xml = getFileContent("fail_on_bad_xml.xml"); try { - new DebtCharacteristicsXMLImporter().importXML(xml); + underTest.importXML(xml, validationMessages); fail(); } catch (Exception e) { assertThat(e).isInstanceOf(IllegalStateException.class); diff --git a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtTesting.java b/server/sonar-server/src/test/java/org/sonar/server/debt/DebtTesting.java deleted file mode 100644 index a4d5075ebfd..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/debt/DebtTesting.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.debt; - -import org.apache.commons.lang.StringUtils; -import org.sonar.db.debt.CharacteristicDto; - -public class DebtTesting { - private DebtTesting() { - // only static helpers - } - - public static CharacteristicDto newCharacteristicDto(String key) { - return new CharacteristicDto() - .setKey(key) - .setName(StringUtils.capitalize(key)) - .setEnabled(true); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/ShowActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/ShowActionTest.java index fe4eec9bedb..8c3cf8fab17 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/ShowActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/ShowActionTest.java @@ -105,9 +105,6 @@ public class ShowActionTest { @Mock UserFinder userFinder; - @Mock - DebtModelService debtModel; - @Mock RuleService ruleService; @@ -146,7 +143,7 @@ public class ShowActionTest { new ShowAction( dbClient, issueService, issueChangelogService, commentService, new IssueActionsWriter(issueService, actionService, userSessionRule), - actionPlanService, userFinder, debtModel, ruleService, i18n, durations, userSessionRule))); + actionPlanService, userFinder, ruleService, i18n, durations, userSessionRule))); } @Test @@ -358,34 +355,6 @@ public class ShowActionTest { request.execute().assertJson(getClass(), "show_issue_with_technical_debt.json"); } - @Test - public void show_issue_with_user_characteristics() throws Exception { - DefaultIssue issue = createStandardIssue().setDebt(Duration.create(7260L)); - when(issueService.getByKey(issue.key())).thenReturn(issue); - - when(rule.debtCharacteristicKey()).thenReturn("K2"); - when(debtModel.characteristicById(1)).thenReturn(new DefaultDebtCharacteristic().setKey("K1").setId(1).setName("Maintainability")); - when(debtModel.characteristicById(2)).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1)); - when(debtModel.characteristicByKey("K2")).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1)); - - WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key()); - request.execute().assertJson(getClass(), "show_issue_with_characteristics.json"); - } - - @Test - public void show_issue_with_default_characteristics() throws Exception { - DefaultIssue issue = createStandardIssue().setDebt(Duration.create(7260L)); - when(issueService.getByKey(issue.key())).thenReturn(issue); - - when(rule.debtCharacteristicKey()).thenReturn("K2"); - when(debtModel.characteristicById(1)).thenReturn(new DefaultDebtCharacteristic().setKey("K1").setId(1).setName("Maintainability")); - when(debtModel.characteristicById(2)).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1)); - when(debtModel.characteristicByKey("K2")).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1)); - - WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key()); - request.execute().assertJson(getClass(), "show_issue_with_characteristics.json"); - } - @Test public void show_issue_with_dates() throws Exception { Date creationDate = DateUtils.parseDateTime("2014-01-22T19:10:03+0100"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoaderTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoaderTest.java index 13f073866cb..7203a2dda42 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoaderTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoaderTest.java @@ -160,7 +160,6 @@ public class DeprecatedRulesDefinitionLoaderTest { List ruleDebts = newArrayList( new DebtModelXMLExporter.RuleDebt() - .setSubCharacteristicKey("MEMORY_EFFICIENCY") .setRuleKey(RuleKey.of("checkstyle", "ConstantName")) .setFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setCoefficient("1d") @@ -181,7 +180,6 @@ public class DeprecatedRulesDefinitionLoaderTest { RulesDefinition.Rule rule = checkstyle.rule("ConstantName"); assertThat(rule).isNotNull(); assertThat(rule.key()).isEqualTo("ConstantName"); - assertThat(rule.debtSubCharacteristic()).isEqualTo("MEMORY_EFFICIENCY"); assertThat(rule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET); assertThat(rule.debtRemediationFunction().coefficient()).isEqualTo("1d"); assertThat(rule.debtRemediationFunction().offset()).isEqualTo("10min"); @@ -193,7 +191,6 @@ public class DeprecatedRulesDefinitionLoaderTest { List ruleDebts = newArrayList( new DebtModelXMLExporter.RuleDebt() - .setSubCharacteristicKey("MEMORY_EFFICIENCY") .setRuleKey(RuleKey.of("checkstyle", "ConstantName")) .setFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setCoefficient("1d") diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java index a35ef774a2c..24675023257 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java @@ -151,7 +151,6 @@ public class RegisterRulesMediumTest { assertThat(rule.param("min").type()).isEqualTo(RuleParamType.INTEGER); assertThat(rule.param("min").defaultValue()).isNull(); assertThat(rule.param("min").description()).isNull(); - assertThat(rule.debtSubCharacteristicKey()).isEqualTo(RulesDefinition.SubCharacteristics.INTEGRATION_TESTABILITY); assertThat(rule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET); assertThat(rule.debtRemediationFunction().coefficient()).isEqualTo("1h"); assertThat(rule.debtRemediationFunction().offset()).isEqualTo("30min"); @@ -245,7 +244,6 @@ public class RegisterRulesMediumTest { assertThat(rule.param("format").type()).isEqualTo(RuleParamType.TEXT); assertThat(rule.param("format").defaultValue()).isNull(); assertThat(rule.param("format").description()).isNull(); - assertThat(rule.debtSubCharacteristicKey()).isEqualTo(RulesDefinition.SubCharacteristics.INSTRUCTION_RELIABILITY); assertThat(rule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR); assertThat(rule.debtRemediationFunction().coefficient()).isEqualTo("2h"); assertThat(rule.debtRemediationFunction().offset()).isNull(); @@ -481,24 +479,6 @@ public class RegisterRulesMediumTest { assertThat(rule.tags()).isEmpty(); } - @Test - public void fail_if_debt_characteristic_is_root() { - try { - register(new Rules() { - @Override - public void init(RulesDefinition.NewRepository repository) { - RulesDefinition.NewRule rule = repository.createRule("x1").setName("x1 name").setHtmlDescription("x1 desc"); - rule - .setDebtSubCharacteristic("REUSABILITY") - .setDebtRemediationFunction(rule.debtRemediationFunctions().linearWithOffset("1h", "30min")); - } - }); - fail(); - } catch (MessageException e) { - assertThat(e).hasMessage("Rule 'xoo:x1' cannot be linked on the root characteristic 'REUSABILITY'"); - } - } - @Test public void update_custom_rule_on_template_change() { register(new Rules() { @@ -549,7 +529,6 @@ public class RegisterRulesMediumTest { assertThat(customRule.internalKey()).isEqualTo("new_internal"); assertThat(customRule.severity()).isEqualTo(Severity.BLOCKER); assertThat(customRule.status()).isEqualTo(RuleStatus.BETA); - assertThat(customRule.debtSubCharacteristicKey()).isEqualTo(RulesDefinition.SubCharacteristics.INTEGRATION_TESTABILITY); assertThat(customRule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET); assertThat(customRule.effortToFixDescription()).isEqualTo("Effort"); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java index 1e5afee08df..bb2fb1cca37 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java @@ -34,7 +34,6 @@ import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.System2; import org.sonar.db.DbTester; -import org.sonar.db.debt.CharacteristicDao; import org.sonar.db.qualityprofile.QualityProfileDao; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleParamDto; @@ -71,7 +70,7 @@ public class RegisterRulesTest { RuleDao ruleDao = new RuleDao(system); ActiveRuleDao activeRuleDao = new ActiveRuleDao(new QualityProfileDao(dbTester.myBatis(), system), ruleDao, system); dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), ruleDao, activeRuleDao, - new QualityProfileDao(dbTester.myBatis(), system), new CharacteristicDao(dbTester.myBatis())); + new QualityProfileDao(dbTester.myBatis(), system)); } @Test diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RubyRuleServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RubyRuleServiceTest.java index 5df867b9a98..886a6b4012f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RubyRuleServiceTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RubyRuleServiceTest.java @@ -90,8 +90,6 @@ public class RubyRuleServiceTest { params.put("severities", "MAJOR,MINOR"); params.put("statuses", "BETA,READY"); params.put("tags", "tag1,tag2"); - params.put("debtCharacteristics", "char1,char2"); - params.put("hasDebtCharacteristic", "true"); params.put(Param.PAGE, "1"); params.put("pageSize", "40"); service.find(params); @@ -106,8 +104,6 @@ public class RubyRuleServiceTest { assertThat(ruleQueryCaptor.getValue().getSeverities()).containsOnly("MAJOR", "MINOR"); assertThat(ruleQueryCaptor.getValue().getStatuses()).containsOnly(RuleStatus.BETA, RuleStatus.READY); assertThat(ruleQueryCaptor.getValue().getTags()).containsOnly("tag1", "tag2"); - assertThat(ruleQueryCaptor.getValue().getDebtCharacteristics()).containsOnly("char1", "char2"); - assertThat(ruleQueryCaptor.getValue().getHasDebtCharacteristic()).isTrue(); assertThat(ruleQueryCaptor.getValue().getQProfileKey()).isNull(); assertThat(ruleQueryCaptor.getValue().getActivation()).isNull(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java index 2112acc4bbb..b243bebe81d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java @@ -30,12 +30,10 @@ import org.junit.Test; import org.sonar.api.rule.RuleStatus; import org.sonar.api.server.rule.RuleParamType; import org.sonar.db.DbSession; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleParamDto; import org.sonar.db.rule.RuleTesting; import org.sonar.server.db.DbClient; -import org.sonar.server.debt.DebtTesting; import org.sonar.server.platform.Platform; import org.sonar.server.rule.db.RuleDao; import org.sonar.server.rule.index.RuleDoc; @@ -319,66 +317,6 @@ public class RuleBackendMediumTest { assertThat(((RuleDoc) index.getByKey(RuleTesting.XOO_X1)).id()).isEqualTo(ruleDto.getId()); } - @Test - public void insert_update_characteristics() { - - CharacteristicDto char1 = DebtTesting.newCharacteristicDto("c1"); - db.debtCharacteristicDao().insert(dbSession, char1); - dbSession.commit(); - - CharacteristicDto char11 = DebtTesting.newCharacteristicDto("c11") - .setParentId(char1.getId()); - db.debtCharacteristicDao().insert(dbSession, char11); - - dao.insert(dbSession, - RuleTesting.newXooX1() - .setDefaultSubCharacteristicId(char11.getId()) - .setRemediationFunction(null) - .setRemediationCoefficient(null) - .setRemediationOffset(null)); - dbSession.commit(); - - // 0. assert chars in DB - assertThat(db.debtCharacteristicDao().selectByKey("c1", dbSession)).isNotNull(); - assertThat(db.debtCharacteristicDao().selectByKey("c1", dbSession).getParentId()).isNull(); - assertThat(db.debtCharacteristicDao().selectByKey("c11", dbSession)).isNotNull(); - assertThat(db.debtCharacteristicDao().selectByKey("c11", dbSession).getParentId()).isEqualTo(char1.getId()); - - // 1. find char and subChar from rule - Rule rule = index.getByKey(RuleTesting.XOO_X1); - assertThat(rule.debtCharacteristicKey()).isEqualTo(char1.getKey()); - assertThat(rule.debtSubCharacteristicKey()).isEqualTo(char11.getKey()); - assertThat(rule.debtOverloaded()).isFalse(); - - // 3. set Non-default characteristics - RuleDto ruleDto = db.deprecatedRuleDao().getByKey(dbSession, RuleTesting.XOO_X1); - CharacteristicDto char2 = DebtTesting.newCharacteristicDto("c2"); - db.debtCharacteristicDao().insert(dbSession, char2); - - CharacteristicDto char21 = DebtTesting.newCharacteristicDto("c21") - .setParentId(char2.getId()); - db.debtCharacteristicDao().insert(dbSession, char21); - - ruleDto.setSubCharacteristicId(char21.getId()); - dao.update(dbSession, ruleDto); - dbSession.commit(); - - rule = index.getByKey(RuleTesting.XOO_X1); - - // Assert rule has debt Overloaded Char - assertThat(rule.debtOverloaded()).isTrue(); - - // 4. Get non-default chars from Rule - assertThat(rule.debtCharacteristicKey()).isEqualTo(char2.getKey()); - assertThat(rule.debtSubCharacteristicKey()).isEqualTo(char21.getKey()); - - // 5 Assert still get the default one - assertThat(rule.debtOverloaded()).isTrue(); - assertThat(rule.defaultDebtCharacteristicKey()).isEqualTo(char1.getKey()); - assertThat(rule.defaultDebtSubCharacteristicKey()).isEqualTo(char11.getKey()); - - } - @Test public void insert_update_debt_overload() { diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java index 58b06e97a79..091c3e74d04 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java @@ -98,7 +98,6 @@ public class RuleCreatorMediumTest { assertThat(rule.getStatus()).isEqualTo(RuleStatus.READY); assertThat(rule.getLanguage()).isEqualTo("java"); assertThat(rule.getConfigKey()).isEqualTo("S001"); - assertThat(rule.getDefaultSubCharacteristicId()).isEqualTo(1); assertThat(rule.getDefaultRemediationFunction()).isEqualTo("LINEAR_OFFSET"); assertThat(rule.getDefaultRemediationCoefficient()).isEqualTo("1h"); assertThat(rule.getDefaultRemediationOffset()).isEqualTo("5min"); @@ -504,7 +503,6 @@ public class RuleCreatorMediumTest { assertThat(rule.status()).isEqualTo(RuleStatus.READY); assertThat(rule.language()).isNull(); assertThat(rule.internalKey()).isNull(); - assertThat(rule.debtSubCharacteristicKey()).isNull(); assertThat(rule.debtRemediationFunction()).isNull(); assertThat(rule.tags()).isEmpty(); assertThat(rule.systemTags()).isEmpty(); @@ -530,7 +528,6 @@ public class RuleCreatorMediumTest { assertThat(rule.status()).isEqualTo(RuleStatus.READY); assertThat(rule.language()).isNull(); assertThat(rule.internalKey()).isNull(); - assertThat(rule.debtSubCharacteristicKey()).isNull(); assertThat(rule.debtRemediationFunction()).isNull(); assertThat(rule.tags()).isEmpty(); assertThat(rule.systemTags()).isEmpty(); @@ -674,7 +671,6 @@ public class RuleCreatorMediumTest { .setIsTemplate(true) .setLanguage("java") .setConfigKey("S001") - .setDefaultSubCharacteristicId(1) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1h") .setDefaultRemediationOffset("5min") @@ -694,7 +690,6 @@ public class RuleCreatorMediumTest { .setIsTemplate(true) .setLanguage("java") .setConfigKey("S002") - .setDefaultSubCharacteristicId(1) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1h") .setDefaultRemediationOffset("5min") @@ -713,7 +708,6 @@ public class RuleCreatorMediumTest { .setIsTemplate(true) .setLanguage("java") .setConfigKey("S003") - .setDefaultSubCharacteristicId(1) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1h") .setDefaultRemediationOffset("5min") diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java index 19a2adfaf23..1725000bed3 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java @@ -30,8 +30,6 @@ import org.sonar.api.rule.RuleKey; import org.sonar.core.permission.GlobalPermissions; import org.sonar.db.DbSession; import org.sonar.db.rule.RuleDto; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.server.db.DbClient; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.NotFoundException; @@ -58,9 +56,6 @@ public class RuleOperationsTest { @Mock RuleDao ruleDao; - @Mock - CharacteristicDao characteristicDao; - @Captor ArgumentCaptor ruleCaptor; @@ -72,28 +67,19 @@ public class RuleOperationsTest { public void setUp() { when(dbClient.openSession(false)).thenReturn(session); when(dbClient.deprecatedRuleDao()).thenReturn(ruleDao); - when(dbClient.debtCharacteristicDao()).thenReturn(characteristicDao); operations = new RuleOperations(dbClient); } @Test public void update_rule() { RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setSubCharacteristicId(6).setRemediationFunction("CONSTANT_ISSUE").setRemediationOffset("10min"); + .setRemediationFunction("CONSTANT_ISSUE").setRemediationOffset("10min"); RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - CharacteristicDto subCharacteristic = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(subCharacteristic); - - // Call when reindexing rule in E/S - when(characteristicDao.selectById(session, 2)).thenReturn(subCharacteristic); - CharacteristicDto characteristic = new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(2); - when(characteristicDao.selectById(session, 1)).thenReturn(characteristic); - operations.updateRule( - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") + new RuleChange().setRuleKey(ruleKey) .setDebtRemediationFunction("LINEAR_OFFSET").setDebtRemediationCoefficient("2h").setDebtRemediationOffset("20min"), authorizedUserSession ); @@ -104,7 +90,6 @@ public class RuleOperationsTest { RuleDto result = ruleCaptor.getValue(); assertThat(result.getId()).isEqualTo(1); - assertThat(result.getSubCharacteristicId()).isEqualTo(2); assertThat(result.getRemediationFunction()).isEqualTo("LINEAR_OFFSET"); assertThat(result.getRemediationCoefficient()).isEqualTo("2h"); assertThat(result.getRemediationOffset()).isEqualTo("20min"); @@ -113,21 +98,15 @@ public class RuleOperationsTest { @Test public void update_rule_set_overridden_values_to_null_when_new_values_are_equals_to_default_values() { RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setSubCharacteristicId(6).setRemediationFunction("CONSTANT_ISSUE").setRemediationOffset("10min") - .setDefaultSubCharacteristicId(2).setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("10min"); + .setRemediationFunction("CONSTANT_ISSUE").setRemediationOffset("10min") + .setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("10min"); RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - CharacteristicDto subCharacteristic = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(subCharacteristic); - when(characteristicDao.selectById(session, 2)).thenReturn(subCharacteristic); - CharacteristicDto characteristic = new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(2); - when(characteristicDao.selectById(session, 1)).thenReturn(characteristic); - operations.updateRule( // Same value as default values -> overridden values will be set to null - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") + new RuleChange().setRuleKey(ruleKey) .setDebtRemediationFunction("CONSTANT_ISSUE").setDebtRemediationOffset("10min"), authorizedUserSession ); @@ -138,25 +117,21 @@ public class RuleOperationsTest { RuleDto result = ruleCaptor.getValue(); assertThat(result.getId()).isEqualTo(1); - assertThat(result.getSubCharacteristicId()).isNull(); assertThat(result.getRemediationFunction()).isNull(); assertThat(result.getRemediationCoefficient()).isNull(); assertThat(result.getRemediationOffset()).isNull(); } @Test - public void not_update_rule_if_same_sub_characteristic_and_function() { + public void not_update_rule_if_same_function() { RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setSubCharacteristicId(2).setRemediationFunction("CONSTANT_ISSUE").setRemediationOffset("10min"); + .setRemediationFunction("CONSTANT_ISSUE").setRemediationOffset("10min"); RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - CharacteristicDto subCharacteristic = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(subCharacteristic); - operations.updateRule( - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") + new RuleChange().setRuleKey(ruleKey) .setDebtRemediationFunction("CONSTANT_ISSUE").setDebtRemediationOffset("10min"), authorizedUserSession ); @@ -165,57 +140,18 @@ public class RuleOperationsTest { verify(session, never()).commit(); } - @Test - public void update_rule_set_characteristic_if_different_from_default_one() { - RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setDefaultSubCharacteristicId(2).setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("10min"); - RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); - - when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - - CharacteristicDto subCharacteristic = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(subCharacteristic); - when(characteristicDao.selectById(session, 2)).thenReturn(subCharacteristic); - CharacteristicDto characteristic = new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(2); - when(characteristicDao.selectById(session, 1)).thenReturn(characteristic); - - operations.updateRule( - // Remediation function is not the same as default one -> Overridden value should be set - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") - .setDebtRemediationFunction("LINEAR_OFFSET").setDebtRemediationCoefficient("2h").setDebtRemediationOffset("20min"), - authorizedUserSession - ); - - verify(ruleDao).update(eq(session), ruleCaptor.capture()); - verify(session).commit(); - - RuleDto result = ruleCaptor.getValue(); - - assertThat(result.getId()).isEqualTo(1); - assertThat(result.getSubCharacteristicId()).isEqualTo(2); - assertThat(result.getRemediationFunction()).isEqualTo("LINEAR_OFFSET"); - assertThat(result.getRemediationCoefficient()).isEqualTo("2h"); - assertThat(result.getRemediationOffset()).isEqualTo("20min"); - } - @Test public void update_rule_set_remediation_function_if_different_from_default_one() { RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setDefaultSubCharacteristicId(6).setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("10min"); + .setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("10min"); RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - CharacteristicDto subCharacteristic = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(subCharacteristic); - when(characteristicDao.selectById(session, 2)).thenReturn(subCharacteristic); - CharacteristicDto characteristic = new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(2); - when(characteristicDao.selectById(session, 1)).thenReturn(characteristic); - operations.updateRule( // Characteristic is the not same as the default one -> Overridden values should be set - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") - .setDebtRemediationFunction("CONSTANT_ISSUE").setDebtRemediationOffset("10min"), + new RuleChange().setRuleKey(ruleKey) + .setDebtRemediationFunction("LINEAR").setDebtRemediationCoefficient("10min"), authorizedUserSession ); @@ -225,73 +161,21 @@ public class RuleOperationsTest { RuleDto result = ruleCaptor.getValue(); assertThat(result.getId()).isEqualTo(1); - assertThat(result.getSubCharacteristicId()).isEqualTo(2); - assertThat(result.getRemediationFunction()).isEqualTo("CONSTANT_ISSUE"); - assertThat(result.getRemediationCoefficient()).isNull(); - assertThat(result.getRemediationOffset()).isEqualTo("10min"); - } - - @Test - public void disable_rule_debt_when_update_rule_with_no_sub_characteristic() { - RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setDefaultSubCharacteristicId(6).setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("10min") - .setSubCharacteristicId(6) - .setRemediationFunction("CONSTANT_ISSUE") - .setRemediationOffset("10min"); - RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); - - when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - - operations.updateRule(new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey(null), authorizedUserSession); - - verify(ruleDao).update(eq(session), ruleCaptor.capture()); - verify(session).commit(); - - RuleDto result = ruleCaptor.getValue(); - - assertThat(result.getId()).isEqualTo(1); - assertThat(result.getSubCharacteristicId()).isEqualTo(-1); - assertThat(result.getRemediationFunction()).isNull(); - assertThat(result.getRemediationCoefficient()).isNull(); + assertThat(result.getRemediationFunction()).isEqualTo("LINEAR"); assertThat(result.getRemediationOffset()).isNull(); + assertThat(result.getRemediationCoefficient()).isEqualTo("10min"); } + @Test public void disable_rule_debt_when_update_rule_with_no_function() { RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setDefaultSubCharacteristicId(6).setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("10min"); - RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); - - when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - - CharacteristicDto subCharacteristic = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(subCharacteristic); - when(characteristicDao.selectById(session, 2)).thenReturn(subCharacteristic); - CharacteristicDto characteristic = new CharacteristicDto().setId(1).setKey("PORTABILITY").setName("Portability").setOrder(2); - when(characteristicDao.selectById(session, 1)).thenReturn(characteristic); - - operations.updateRule(new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER"), authorizedUserSession); - - verify(ruleDao).update(eq(session), ruleCaptor.capture()); - verify(session).commit(); - - RuleDto result = ruleCaptor.getValue(); - - assertThat(result.getId()).isEqualTo(1); - assertThat(result.getSubCharacteristicId()).isEqualTo(-1); - assertThat(result.getRemediationFunction()).isNull(); - assertThat(result.getRemediationCoefficient()).isNull(); - assertThat(result.getRemediationOffset()).isNull(); - } - - @Test - public void disable_characteristic_on_rule_having_no_debt_info() { - RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck"); + .setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("10min"); RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - operations.updateRule(new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey(null), authorizedUserSession); + operations.updateRule(new RuleChange().setRuleKey(ruleKey), authorizedUserSession); verify(ruleDao).update(eq(session), ruleCaptor.capture()); verify(session).commit(); @@ -299,28 +183,11 @@ public class RuleOperationsTest { RuleDto result = ruleCaptor.getValue(); assertThat(result.getId()).isEqualTo(1); - assertThat(result.getSubCharacteristicId()).isNull(); assertThat(result.getRemediationFunction()).isNull(); assertThat(result.getRemediationCoefficient()).isNull(); assertThat(result.getRemediationOffset()).isNull(); } - @Test - public void not_disable_characteristic_when_update_rule_if_already_disabled() { - RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck").setSubCharacteristicId(-1); - RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); - - when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - - operations.updateRule( - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey(null), - authorizedUserSession - ); - - verify(ruleDao, never()).update(eq(session), any(RuleDto.class)); - verify(session, never()).commit(); - } - @Test public void fail_to_update_rule_on_unknown_rule() { RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); @@ -329,31 +196,7 @@ public class RuleOperationsTest { try { operations.updateRule( - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") - .setDebtRemediationFunction("LINEAR_OFFSET").setDebtRemediationCoefficient("2h").setDebtRemediationOffset("20min"), - authorizedUserSession - ); - } catch (Exception e) { - assertThat(e).isInstanceOf(NotFoundException.class); - } - - verify(ruleDao, never()).update(eq(session), any(RuleDto.class)); - verify(session, never()).commit(); - } - - @Test - public void fail_to_update_rule_on_unknown_sub_characteristic() { - RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setSubCharacteristicId(2).setRemediationFunction("CONSTANT_ISSUE").setRemediationOffset("10min"); - RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); - - when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(null); - - try { - operations.updateRule( - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") + new RuleChange().setRuleKey(ruleKey) .setDebtRemediationFunction("LINEAR_OFFSET").setDebtRemediationCoefficient("2h").setDebtRemediationOffset("20min"), authorizedUserSession ); @@ -368,17 +211,14 @@ public class RuleOperationsTest { @Test public void fail_to_update_rule_on_invalid_coefficient() { RuleDto dto = new RuleDto().setId(1).setRepositoryKey("squid").setRuleKey("UselessImportCheck") - .setSubCharacteristicId(2).setRemediationFunction("LINEAR").setRemediationCoefficient("1h"); + .setRemediationFunction("LINEAR").setRemediationCoefficient("1h"); RuleKey ruleKey = RuleKey.of("squid", "UselessImportCheck"); when(ruleDao.getNullableByKey(session, ruleKey)).thenReturn(dto); - CharacteristicDto subCharacteristic = new CharacteristicDto().setId(2).setKey("COMPILER").setName("Compiler").setParentId(1); - when(characteristicDao.selectByKey("COMPILER", session)).thenReturn(subCharacteristic); - try { operations.updateRule( - new RuleChange().setRuleKey(ruleKey).setDebtCharacteristicKey("COMPILER") + new RuleChange().setRuleKey(ruleKey) .setDebtRemediationFunction("LINEAR").setDebtRemediationCoefficient("foo"), authorizedUserSession ); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java index 05fb9aaafd9..4de502c673f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java @@ -37,10 +37,8 @@ import org.sonar.db.qualityprofile.ActiveRuleKey; import org.sonar.db.qualityprofile.QualityProfileDto; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleParamDto; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.db.rule.RuleTesting; import org.sonar.server.db.DbClient; -import org.sonar.server.debt.DebtTesting; import org.sonar.server.qualityprofile.ActiveRule; import org.sonar.server.qualityprofile.QProfileTesting; import org.sonar.server.qualityprofile.RuleActivation; @@ -69,8 +67,6 @@ public class RuleUpdaterMediumTest { DbSession dbSession; BaseIndex ruleIndex = tester.get(RuleIndex.class); RuleUpdater updater = tester.get(RuleUpdater.class); - int softReliabilityId; - int hardReliabilityId; @Before public void before() { @@ -104,7 +100,6 @@ public class RuleUpdaterMediumTest { .setNoteData("my *note*") .setNoteUserLogin("me") .setTags(ImmutableSet.of("tag1")) - .setSubCharacteristicId(33) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()) .setRemediationCoefficient("1d") .setRemediationOffset("5min")); @@ -119,7 +114,6 @@ public class RuleUpdaterMediumTest { assertThat(rule.getNoteData()).isEqualTo("my *note*"); assertThat(rule.getNoteUserLogin()).isEqualTo("me"); assertThat(rule.getTags()).containsOnly("tag1"); - assertThat(rule.getSubCharacteristicId()).isEqualTo(33); assertThat(rule.getRemediationFunction()).isEqualTo(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()); assertThat(rule.getRemediationCoefficient()).isEqualTo("1d"); assertThat(rule.getRemediationOffset()).isEqualTo("5min"); @@ -135,7 +129,6 @@ public class RuleUpdaterMediumTest { // the following fields are not supposed to be updated .setTags(ImmutableSet.of("tag1")) - .setSubCharacteristicId(33) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()) .setRemediationCoefficient("1d") .setRemediationOffset("5min")); @@ -153,7 +146,6 @@ public class RuleUpdaterMediumTest { assertThat(rule.getNoteUpdatedAt()).isNotNull(); // no other changes assertThat(rule.getTags()).containsOnly("tag1"); - assertThat(rule.getSubCharacteristicId()).isEqualTo(33); assertThat(rule.getRemediationFunction()).isEqualTo(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()); assertThat(rule.getRemediationCoefficient()).isEqualTo("1d"); assertThat(rule.getRemediationOffset()).isEqualTo("5min"); @@ -221,13 +213,10 @@ public class RuleUpdaterMediumTest { @Test public void override_debt() { - insertDebtCharacteristics(dbSession); ruleDao.insert(dbSession, RuleTesting.newDto(RULE_KEY) - .setDefaultSubCharacteristicId(hardReliabilityId) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1d") .setDefaultRemediationOffset("5min") - .setSubCharacteristicId(null) .setRemediationFunction(null) .setRemediationCoefficient(null) .setRemediationOffset(null)); @@ -235,22 +224,17 @@ public class RuleUpdaterMediumTest { DefaultDebtRemediationFunction fn = new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE, null, "1min"); RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY) - .setDebtSubCharacteristic("SOFT_RELIABILITY") .setDebtRemediationFunction(fn); updater.update(update, userSessionRule); dbSession.clearCache(); // verify debt is overridden Rule indexedRule = tester.get(RuleIndex.class).getByKey(RULE_KEY); - assertThat(indexedRule.debtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.debtSubCharacteristicKey()).isEqualTo("SOFT_RELIABILITY"); assertThat(indexedRule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.CONSTANT_ISSUE); assertThat(indexedRule.debtRemediationFunction().coefficient()).isNull(); assertThat(indexedRule.debtRemediationFunction().offset()).isEqualTo("1min"); assertThat(indexedRule.debtOverloaded()).isTrue(); - assertThat(indexedRule.defaultDebtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.defaultDebtSubCharacteristicKey()).isEqualTo("HARD_RELIABILITY"); assertThat(indexedRule.defaultDebtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET); assertThat(indexedRule.defaultDebtRemediationFunction().coefficient()).isEqualTo("1d"); assertThat(indexedRule.defaultDebtRemediationFunction().offset()).isEqualTo("5min"); @@ -258,9 +242,7 @@ public class RuleUpdaterMediumTest { @Test public void override_debt_only_offset() { - insertDebtCharacteristics(dbSession); ruleDao.insert(dbSession, RuleTesting.newDto(RULE_KEY) - .setDefaultSubCharacteristicId(hardReliabilityId) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.name()) .setDefaultRemediationCoefficient("1d") .setDefaultRemediationOffset(null) @@ -276,15 +258,11 @@ public class RuleUpdaterMediumTest { // verify debt is overridden Rule indexedRule = tester.get(RuleIndex.class).getByKey(RULE_KEY); - assertThat(indexedRule.debtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.debtSubCharacteristicKey()).isEqualTo("HARD_RELIABILITY"); assertThat(indexedRule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR); assertThat(indexedRule.debtRemediationFunction().coefficient()).isEqualTo("2d"); assertThat(indexedRule.debtRemediationFunction().offset()).isNull(); assertThat(indexedRule.debtOverloaded()).isTrue(); - assertThat(indexedRule.defaultDebtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.defaultDebtSubCharacteristicKey()).isEqualTo("HARD_RELIABILITY"); assertThat(indexedRule.defaultDebtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR); assertThat(indexedRule.defaultDebtRemediationFunction().coefficient()).isEqualTo("1d"); assertThat(indexedRule.defaultDebtRemediationFunction().offset()).isNull(); @@ -292,9 +270,7 @@ public class RuleUpdaterMediumTest { @Test public void override_debt_from_linear_with_offset_to_constant() { - insertDebtCharacteristics(dbSession); ruleDao.insert(dbSession, RuleTesting.newDto(RULE_KEY) - .setDefaultSubCharacteristicId(hardReliabilityId) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1d") .setDefaultRemediationOffset("5min") @@ -310,94 +286,43 @@ public class RuleUpdaterMediumTest { // verify debt is overridden Rule indexedRule = tester.get(RuleIndex.class).getByKey(RULE_KEY); - assertThat(indexedRule.debtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.debtSubCharacteristicKey()).isEqualTo("HARD_RELIABILITY"); assertThat(indexedRule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.CONSTANT_ISSUE); assertThat(indexedRule.debtRemediationFunction().coefficient()).isNull(); assertThat(indexedRule.debtRemediationFunction().offset()).isEqualTo("10min"); assertThat(indexedRule.debtOverloaded()).isTrue(); - assertThat(indexedRule.defaultDebtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.defaultDebtSubCharacteristicKey()).isEqualTo("HARD_RELIABILITY"); assertThat(indexedRule.defaultDebtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET); assertThat(indexedRule.defaultDebtRemediationFunction().coefficient()).isEqualTo("1d"); assertThat(indexedRule.defaultDebtRemediationFunction().offset()).isEqualTo("5min"); } @Test - public void reset_debt() { - insertDebtCharacteristics(dbSession); + public void reset_remediation_function() { ruleDao.insert(dbSession, RuleTesting.newDto(RULE_KEY) - .setDefaultSubCharacteristicId(hardReliabilityId) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.name()) .setDefaultRemediationCoefficient("1d") .setDefaultRemediationOffset("5min") - .setSubCharacteristicId(softReliabilityId) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()) .setRemediationCoefficient(null) .setRemediationOffset("1min")); dbSession.commit(); - RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY) - .setDebtSubCharacteristic(RuleUpdate.DEFAULT_DEBT_CHARACTERISTIC); + RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setDebtRemediationFunction(null); updater.update(update, userSessionRule); dbSession.clearCache(); // verify debt is coming from default values Rule indexedRule = tester.get(RuleIndex.class).getByKey(RULE_KEY); - assertThat(indexedRule.debtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.debtSubCharacteristicKey()).isEqualTo("HARD_RELIABILITY"); assertThat(indexedRule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR); assertThat(indexedRule.debtRemediationFunction().coefficient()).isEqualTo("1d"); assertThat(indexedRule.debtRemediationFunction().offset()).isEqualTo("5min"); assertThat(indexedRule.debtOverloaded()).isFalse(); - assertThat(indexedRule.defaultDebtCharacteristicKey()).isEqualTo("RELIABILITY"); - assertThat(indexedRule.defaultDebtSubCharacteristicKey()).isEqualTo("HARD_RELIABILITY"); assertThat(indexedRule.defaultDebtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR); assertThat(indexedRule.defaultDebtRemediationFunction().coefficient()).isEqualTo("1d"); assertThat(indexedRule.defaultDebtRemediationFunction().offset()).isEqualTo("5min"); } - @Test - public void unset_debt() { - insertDebtCharacteristics(dbSession); - ruleDao.insert(dbSession, RuleTesting.newDto(RULE_KEY) - .setDefaultSubCharacteristicId(hardReliabilityId) - .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.name()) - .setDefaultRemediationCoefficient("1d") - .setDefaultRemediationOffset("5min") - .setSubCharacteristicId(softReliabilityId) - .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()) - .setRemediationCoefficient(null) - .setRemediationOffset("1min")); - dbSession.commit(); - - RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY) - .setDebtSubCharacteristic(null); - updater.update(update, userSessionRule); - - // verify db - dbSession.clearCache(); - RuleDto rule = ruleDao.getNullableByKey(dbSession, RULE_KEY); - assertThat(rule.getSubCharacteristicId()).isEqualTo(-1); - assertThat(rule.getRemediationFunction()).isNull(); - assertThat(rule.getRemediationCoefficient()).isNull(); - assertThat(rule.getRemediationOffset()).isNull(); - - assertThat(rule.getDefaultSubCharacteristicId()).isNotNull(); - assertThat(rule.getDefaultRemediationFunction()).isNotNull(); - assertThat(rule.getDefaultRemediationCoefficient()).isNotNull(); - assertThat(rule.getDefaultRemediationOffset()).isNotNull(); - - // verify index - Rule indexedRule = tester.get(RuleIndex.class).getByKey(RULE_KEY); - assertThat(indexedRule.debtCharacteristicKey()).isEqualTo("NONE"); - assertThat(indexedRule.debtSubCharacteristicKey()).isEqualTo("NONE"); - assertThat(indexedRule.debtRemediationFunction()).isNull(); - assertThat(indexedRule.debtOverloaded()).isTrue(); - } - @Test public void update_custom_rule() { // Create template rule @@ -706,19 +631,4 @@ public class RuleUpdaterMediumTest { assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("Not a custom or a manual rule"); } } - - private void insertDebtCharacteristics(DbSession dbSession) { - CharacteristicDto reliability = DebtTesting.newCharacteristicDto("RELIABILITY"); - db.debtCharacteristicDao().insert(dbSession, reliability); - - CharacteristicDto softReliability = DebtTesting.newCharacteristicDto("SOFT_RELIABILITY") - .setParentId(reliability.getId()); - db.debtCharacteristicDao().insert(dbSession, softReliability); - softReliabilityId = softReliability.getId(); - - CharacteristicDto hardReliability = DebtTesting.newCharacteristicDto("HARD_RELIABILITY") - .setParentId(reliability.getId()); - db.debtCharacteristicDao().insert(dbSession, hardReliability); - hardReliabilityId = hardReliability.getId(); - } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexMediumTest.java index e9fe91c82e5..6281782fcb2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexMediumTest.java @@ -43,14 +43,12 @@ import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; import org.sonar.db.DbSession; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.db.qualityprofile.ActiveRuleDto; import org.sonar.db.qualityprofile.QualityProfileDto; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleParamDto; import org.sonar.db.rule.RuleTesting; import org.sonar.server.db.DbClient; -import org.sonar.server.debt.DebtTesting; import org.sonar.server.qualityprofile.ActiveRule; import org.sonar.server.qualityprofile.QProfileTesting; import org.sonar.server.rule.Rule; @@ -304,142 +302,6 @@ public class RuleIndexMediumTest { } - @Test - public void search_by_has_debt_characteristic() { - CharacteristicDto char1 = DebtTesting.newCharacteristicDto("c1") - .setEnabled(true) - .setName("char1"); - db.debtCharacteristicDao().insert(dbSession, char1); - dbSession.commit(); - - CharacteristicDto char11 = DebtTesting.newCharacteristicDto("c11") - .setEnabled(true) - .setName("char11") - .setParentId(char1.getId()); - db.debtCharacteristicDao().insert(dbSession, char11); - - // Rule with default characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("findbugs", "S001")) - .setSubCharacteristicId(null) - .setRemediationFunction(null) - .setDefaultSubCharacteristicId(char11.getId()) - .setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h")); - // Rule with overridden characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("pmd", "S002")) - .setSubCharacteristicId(char11.getId()) - .setRemediationFunction("LINEAR").setRemediationCoefficient("2h") - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(null)); - // Rule without debt characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("xoo", "S001")) - .setSubCharacteristicId(null) - .setRemediationFunction(null).setRemediationCoefficient(null) - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(null).setDefaultRemediationCoefficient(null)); - // Rule with disabled debt characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("xoo", "S002")) - .setSubCharacteristicId(-1) - .setRemediationFunction(null).setRemediationCoefficient(null) - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(null).setDefaultRemediationCoefficient(null)); - dbSession.commit(); - - assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(null), new QueryContext(userSessionRule)).getTotal()).isEqualTo(4); - assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(true), new QueryContext(userSessionRule)).getTotal()).isEqualTo(2); - assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(false), new QueryContext(userSessionRule)).getTotal()).isEqualTo(2); - } - - @Test - public void facet_on_debt_characteristic() { - CharacteristicDto char1 = DebtTesting.newCharacteristicDto("c1") - .setEnabled(true) - .setName("char1"); - db.debtCharacteristicDao().insert(dbSession, char1); - dbSession.commit(); - - CharacteristicDto char11 = DebtTesting.newCharacteristicDto("c11") - .setEnabled(true) - .setName("char11") - .setParentId(char1.getId()); - db.debtCharacteristicDao().insert(dbSession, char11); - - // Rule with default characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("findbugs", "S001")) - .setSubCharacteristicId(null) - .setRemediationFunction(null) - .setDefaultSubCharacteristicId(char11.getId()) - .setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("2h")); - // Rule with overridden characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("pmd", "S002")) - .setSubCharacteristicId(char11.getId()) - .setRemediationFunction("LINEAR").setRemediationCoefficient("2h") - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(null)); - // Rule without debt characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("xoo", "S001")) - .setSubCharacteristicId(null) - .setRemediationFunction(null).setRemediationCoefficient(null) - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(null).setDefaultRemediationCoefficient(null)); - // Rule with disabled debt characteristic - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("xoo", "S002")) - .setSubCharacteristicId(-1) - .setRemediationFunction(null).setRemediationCoefficient(null) - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(null).setDefaultRemediationCoefficient(null)); - dbSession.commit(); - - QueryContext withDebtCharFacet = new QueryContext(userSessionRule).addFacets(Arrays.asList(RuleIndex.FACET_DEBT_CHARACTERISTICS)); - - // Facet show results on characs, subcharacs and uncharacterized rules - Result result1 = index.search(new RuleQuery(), withDebtCharFacet); - assertThat(result1.getFacetValues(RuleIndex.FACET_DEBT_CHARACTERISTICS)).containsOnly( - new FacetValue("c1", 2L), - new FacetValue("c11", 2L), - new FacetValue("", 1L), - new FacetValue("NONE", 1L) - ); - - // Facet is sticky when using a charac filter - Result result2 = index.search(new RuleQuery().setDebtCharacteristics(Arrays.asList("c1")), withDebtCharFacet); - assertThat(result2.getFacetValues(RuleIndex.FACET_DEBT_CHARACTERISTICS)).containsOnly( - new FacetValue("c1", 2L), - new FacetValue("c11", 2L), - new FacetValue("", 1L), - new FacetValue("NONE", 1L) - ); - - // Facet is sticky when using a sub-charac filter - Result result3 = index.search(new RuleQuery().setDebtCharacteristics(Arrays.asList("c11")), withDebtCharFacet); - assertThat(result3.getFacetValues(RuleIndex.FACET_DEBT_CHARACTERISTICS)).containsOnly( - new FacetValue("c1", 2L), - new FacetValue("c11", 2L), - new FacetValue("", 1L), - new FacetValue("NONE", 1L) - ); - - // Facet is sticky when using hasCharac filter - Result result4 = index.search(new RuleQuery().setHasDebtCharacteristic(false), withDebtCharFacet); - assertThat(result4.getFacetValues(RuleIndex.FACET_DEBT_CHARACTERISTICS)).containsOnly( - new FacetValue("c1", 2L), - new FacetValue("c11", 2L), - new FacetValue("", 1L), - new FacetValue("NONE", 1L) - ); - - // Facet applies other filters - Result result5 = index.search(new RuleQuery().setRepositories(Arrays.asList("xoo")), withDebtCharFacet); - assertThat(result5.getFacetValues(RuleIndex.FACET_DEBT_CHARACTERISTICS)).containsOnly( - new FacetValue("", 1L), - new FacetValue("NONE", 1L) - ); - Result result6 = index.search(new RuleQuery().setRepositories(Arrays.asList("findbugs")), withDebtCharFacet); - assertThat(result6.getFacetValues(RuleIndex.FACET_DEBT_CHARACTERISTICS)).containsOnly( - new FacetValue("c1", 1L), - new FacetValue("c11", 1L) - ); - } - @Test public void search_by_any_of_repositories() { dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("findbugs", "S001"))); @@ -486,128 +348,6 @@ public class RuleIndexMediumTest { assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2); } - @Test - public void search_by_characteristics() { - CharacteristicDto char1 = DebtTesting.newCharacteristicDto("RELIABILITY"); - db.debtCharacteristicDao().insert(dbSession, char1); - - CharacteristicDto char11 = DebtTesting.newCharacteristicDto("SOFT_RELIABILITY") - .setParentId(char1.getId()); - db.debtCharacteristicDao().insert(dbSession, char11); - dbSession.commit(); - - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S001")) - .setSubCharacteristicId(char11.getId())); - - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("javascript", "S002"))); - - dbSession.commit(); - dbSession.clearCache(); - - RuleQuery query; - Result results; - - // 0. we have 2 rules in index - results = index.search(new RuleQuery(), new QueryContext(userSessionRule)); - assertThat(results.getHits()).hasSize(2); - - // filter by non-subChar - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of("toto")); - assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty(); - - // filter by subChar - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey())); - assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1); - - // filter by Char - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char1.getKey())); - assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1); - - // filter by Char and SubChar - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey(), char1.getKey())); - assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1); - - // match by Char - query = new RuleQuery().setQueryText(char1.getKey()); - assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1); - - // match by SubChar - query = new RuleQuery().setQueryText(char11.getKey()); - assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1); - - // match by SubChar & Char - query = new RuleQuery().setQueryText(char11.getKey() + " " + char1.getKey()); - assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1); - } - - @Test - public void search_by_characteristics_with_default_and_overridden_char() { - CharacteristicDto char1 = DebtTesting.newCharacteristicDto("RELIABILITY"); - db.debtCharacteristicDao().insert(dbSession, char1); - - CharacteristicDto char11 = DebtTesting.newCharacteristicDto("SOFT_RELIABILITY") - .setParentId(char1.getId()); - db.debtCharacteristicDao().insert(dbSession, char11); - dbSession.commit(); - - CharacteristicDto char2 = DebtTesting.newCharacteristicDto("TESTABILITY"); - db.debtCharacteristicDao().insert(dbSession, char2); - - CharacteristicDto char21 = DebtTesting.newCharacteristicDto("UNIT_TESTABILITY") - .setParentId(char2.getId()); - db.debtCharacteristicDao().insert(dbSession, char21); - dbSession.commit(); - - // Rule with only default sub characteristic -> should be find by char11 and char1 - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S001")) - .setSubCharacteristicId(char11.getId()) - .setDefaultSubCharacteristicId(null)); - - // Rule with only sub characteristic -> should be find by char11 and char1 - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S002")) - .setSubCharacteristicId(null) - .setDefaultSubCharacteristicId(char11.getId())); - - // Rule with both default sub characteristic and overridden sub characteristic -> should only be find by char21 and char2 - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S003")) - .setSubCharacteristicId(char21.getId())) - .setDefaultSubCharacteristicId(char11.getId()); - - // Rule with both default sub characteristic and overridden sub characteristic and with same values -> should be find by char11 and - // char1 - dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S004")) - .setSubCharacteristicId(char11.getId())) - .setDefaultSubCharacteristicId(char11.getId()); - - dbSession.commit(); - dbSession.clearCache(); - - RuleQuery query; - Result results; - - // 0. we have 4 rules in index - results = index.search(new RuleQuery(), new QueryContext(userSessionRule)); - assertThat(results.getHits()).hasSize(4); - - // filter by subChar - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey())); - assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S001", "S002", "S004"); - - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char21.getKey())); - assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S003"); - - // filter by Char - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char1.getKey())); - assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S001", "S002", "S004"); - - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char2.getKey())); - assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S003"); - - // filter by Char and SubChar - query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey(), char1.getKey(), char2.getKey(), char21.getKey())); - assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S001", "S002", "S003", "S004"); - } - @Test public void search_by_any_of_severities() { dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S001")).setSeverity(Severity.BLOCKER)); @@ -727,7 +467,7 @@ public class RuleIndexMediumTest { // 4. get all active rules on profile result = index.search(new RuleQuery().setActivation(true) - .setQProfileKey(qualityProfileDto2.getKey()), + .setQProfileKey(qualityProfileDto2.getKey()), new QueryContext(userSessionRule)); assertThat(result.getHits()).hasSize(1); assertThat(result.getHits().get(0).name()).isEqualTo(rule1.getName()); @@ -764,7 +504,7 @@ public class RuleIndexMediumTest { ActiveRuleDto.createFor(qualityProfileDto2, rule3) .setSeverity("BLOCKER") .setInheritance(ActiveRule.Inheritance.INHERITED.name()) - ); + ); dbSession.commit(); @@ -786,52 +526,52 @@ public class RuleIndexMediumTest { // 3. get Inherited Rules on profile1 result = index.search(new RuleQuery().setActivation(true) - .setQProfileKey(qualityProfileDto1.getKey()) - .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.INHERITED.name())), + .setQProfileKey(qualityProfileDto1.getKey()) + .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.INHERITED.name())), new QueryContext(userSessionRule) - ); + ); assertThat(result.getHits()).hasSize(0); // 4. get Inherited Rules on profile2 result = index.search(new RuleQuery().setActivation(true) - .setQProfileKey(qualityProfileDto2.getKey()) - .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.INHERITED.name())), + .setQProfileKey(qualityProfileDto2.getKey()) + .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.INHERITED.name())), new QueryContext(userSessionRule) - ); + ); assertThat(result.getHits()).hasSize(2); // 5. get Overridden Rules on profile1 result = index.search(new RuleQuery().setActivation(true) - .setQProfileKey(qualityProfileDto1.getKey()) - .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.OVERRIDES.name())), + .setQProfileKey(qualityProfileDto1.getKey()) + .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.OVERRIDES.name())), new QueryContext(userSessionRule) - ); + ); assertThat(result.getHits()).hasSize(0); // 6. get Overridden Rules on profile2 result = index.search(new RuleQuery().setActivation(true) - .setQProfileKey(qualityProfileDto2.getKey()) - .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.OVERRIDES.name())), + .setQProfileKey(qualityProfileDto2.getKey()) + .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.OVERRIDES.name())), new QueryContext(userSessionRule) - ); + ); assertThat(result.getHits()).hasSize(1); // 7. get Inherited AND Overridden Rules on profile1 result = index.search(new RuleQuery().setActivation(true) - .setQProfileKey(qualityProfileDto1.getKey()) - .setInheritance(ImmutableSet.of( - ActiveRule.Inheritance.INHERITED.name(), ActiveRule.Inheritance.OVERRIDES.name())), + .setQProfileKey(qualityProfileDto1.getKey()) + .setInheritance(ImmutableSet.of( + ActiveRule.Inheritance.INHERITED.name(), ActiveRule.Inheritance.OVERRIDES.name())), new QueryContext(userSessionRule) - ); + ); assertThat(result.getHits()).hasSize(0); // 8. get Inherited AND Overridden Rules on profile2 result = index.search(new RuleQuery().setActivation(true) - .setQProfileKey(qualityProfileDto2.getKey()) - .setInheritance(ImmutableSet.of( - ActiveRule.Inheritance.INHERITED.name(), ActiveRule.Inheritance.OVERRIDES.name())), + .setQProfileKey(qualityProfileDto2.getKey()) + .setInheritance(ImmutableSet.of( + ActiveRule.Inheritance.INHERITED.name(), ActiveRule.Inheritance.OVERRIDES.name())), new QueryContext(userSessionRule) - ); + ); assertThat(result.getHits()).hasSize(3); } @@ -1139,7 +879,8 @@ public class RuleIndexMediumTest { assertThat(index.search(new RuleQuery(), new QueryContext(userSessionRule)).getHits()).hasSize(9); // 1 Facet with no filters at all - Map> facets = index.search(new RuleQuery(), new QueryContext(userSessionRule).addFacets(Arrays.asList("languages", "repositories", "tags"))).getFacets(); + Map> facets = index.search(new RuleQuery(), new QueryContext(userSessionRule).addFacets(Arrays.asList("languages", "repositories", "tags"))) + .getFacets(); assertThat(facets.keySet()).hasSize(3); assertThat(facets.get(RuleIndex.FACET_LANGUAGES)).extracting("key").containsOnly("cpp", "java", "cobol"); assertThat(facets.get(RuleIndex.FACET_REPOSITORIES)).extracting("key").containsOnly("xoo", "foo"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java index 12f67add0a9..bd56a79bba7 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java @@ -31,9 +31,6 @@ import org.mockito.stubbing.Answer; import org.sonar.api.i18n.I18n; import org.sonar.api.resources.Language; import org.sonar.api.resources.Languages; -import org.sonar.api.server.debt.DebtCharacteristic; -import org.sonar.api.server.debt.DebtModel; -import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; import org.sonar.core.permission.GlobalPermissions; import org.sonar.db.qualityprofile.QualityProfileDto; import org.sonar.server.qualityprofile.QProfileLoader; @@ -61,15 +58,12 @@ public class AppActionTest { @Mock I18n i18n; - @Mock - DebtModel debtModel; - @Mock QProfileLoader profileLoader; @Test public void should_generate_app_init_info() throws Exception { - AppAction app = new AppAction(languages, ruleRepositories, i18n, debtModel, profileLoader, userSessionRule); + AppAction app = new AppAction(languages, ruleRepositories, i18n, profileLoader, userSessionRule); WsTester tester = new WsTester(new RulesWs(app)); userSessionRule.setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN); @@ -85,7 +79,7 @@ public class AppActionTest { when(whitespace.getKey()).thenReturn("ws"); when(whitespace.getName()).thenReturn("Whitespace"); when(languages.get("xoo")).thenReturn(xoo); - when(languages.all()).thenReturn(new Language[]{xoo, whitespace}); + when(languages.all()).thenReturn(new Language[] {xoo, whitespace}); RuleRepositories.Repository repo1 = mock(RuleRepositories.Repository.class); when(repo1.key()).thenReturn("xoo"); @@ -104,23 +98,6 @@ public class AppActionTest { } }); - DefaultDebtCharacteristic char1 = new DefaultDebtCharacteristic() - .setId(1).setKey("PORTABILITY").setName("Portability").setOrder(2); - DefaultDebtCharacteristic char1sub1 = new DefaultDebtCharacteristic() - .setId(11).setKey("LANGUAGE").setName("Language").setParentId(1); - DefaultDebtCharacteristic char1sub2 = new DefaultDebtCharacteristic() - .setId(12).setKey("COMPILER").setName("Compiler").setParentId(1); - DefaultDebtCharacteristic char1sub3 = new DefaultDebtCharacteristic() - .setId(13).setKey("HARDWARE").setName("Hardware").setParentId(1); - - DefaultDebtCharacteristic char2 = new DefaultDebtCharacteristic() - .setId(2).setKey("REUSABILITY").setName("Reusability").setOrder(1); - DefaultDebtCharacteristic char2sub1 = new DefaultDebtCharacteristic() - .setId(21).setKey("MODULARITY").setName("Modularity").setParentId(2); - - when(debtModel.characteristics()).thenReturn(ImmutableList.of(char1, char2)); - when(debtModel.allCharacteristics()).thenReturn(ImmutableList.of(char1sub1, char1sub2, char1sub3, char1, char2sub1, char2)); - tester.newGetRequest("api/rules", "app").execute().assertJson(this.getClass(), "app.json"); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleMappingTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleMappingTest.java index b5543d32383..20843d83a14 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleMappingTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleMappingTest.java @@ -22,7 +22,6 @@ package org.sonar.server.rule.ws; import org.junit.Rule; import org.junit.Test; import org.sonar.api.resources.Languages; -import org.sonar.api.server.debt.DebtModel; import org.sonar.api.server.ws.WebService.Param; import org.sonar.api.server.ws.internal.SimpleGetRequest; import org.sonar.server.rule.index.RuleNormalizer; @@ -40,11 +39,10 @@ public class RuleMappingTest { Languages languages = new Languages(); MacroInterpreter macroInterpreter = mock(MacroInterpreter.class); - DebtModel debtModel = mock(DebtModel.class); @Test public void toQueryOptions_load_all_fields() { - RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule); + RuleMapping mapping = new RuleMapping(languages, macroInterpreter, userSessionRule); SimpleGetRequest request = new SimpleGetRequest(); request.setParam(Param.PAGE, "1"); request.setParam(Param.PAGE_SIZE, "10"); @@ -55,7 +53,7 @@ public class RuleMappingTest { @Test public void toQueryOptions_load_only_few_simple_fields() { - RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule); + RuleMapping mapping = new RuleMapping(languages, macroInterpreter, userSessionRule); SimpleGetRequest request = new SimpleGetRequest(); request.setParam(Param.PAGE, "1"); request.setParam(Param.PAGE_SIZE, "10"); @@ -70,7 +68,7 @@ public class RuleMappingTest { @Test public void toQueryOptions_langName_requires_lang() { - RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule); + RuleMapping mapping = new RuleMapping(languages, macroInterpreter, userSessionRule); SimpleGetRequest request = new SimpleGetRequest(); request.setParam(Param.PAGE, "1"); request.setParam(Param.PAGE_SIZE, "10"); @@ -82,7 +80,7 @@ public class RuleMappingTest { @Test public void toQueryOptions_debt_requires_group_of_fields() { - RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule); + RuleMapping mapping = new RuleMapping(languages, macroInterpreter, userSessionRule); SimpleGetRequest request = new SimpleGetRequest(); request.setParam(Param.PAGE, "1"); request.setParam(Param.PAGE_SIZE, "10"); @@ -97,7 +95,7 @@ public class RuleMappingTest { @Test public void toQueryOptions_html_note_requires_markdown_note() { - RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule); + RuleMapping mapping = new RuleMapping(languages, macroInterpreter, userSessionRule); SimpleGetRequest request = new SimpleGetRequest(); request.setParam(Param.PAGE, "1"); request.setParam(Param.PAGE_SIZE, "10"); @@ -108,21 +106,8 @@ public class RuleMappingTest { } @Test - public void toQueryOptions_debt_characteristics() { - RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule); - SimpleGetRequest request = new SimpleGetRequest(); - request.setParam(Param.PAGE, "1"); - request.setParam(Param.PAGE_SIZE, "10"); - request.setParam(Param.FIELDS, "debtChar"); - QueryContext queryContext = mapping.newQueryOptions(SearchOptions.create(request)); - - assertThat(queryContext.getFieldsToReturn()).containsOnly( - RuleNormalizer.RuleField.CHARACTERISTIC.field()); - } - - @Test - public void toQueryOptions_debt_overloaded() { - RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule); + public void toQueryOptions_remediation_function_overloaded() { + RuleMapping mapping = new RuleMapping(languages, macroInterpreter, userSessionRule); SimpleGetRequest request = new SimpleGetRequest(); request.setParam(Param.PAGE, "1"); request.setParam(Param.PAGE_SIZE, "10"); @@ -130,8 +115,6 @@ public class RuleMappingTest { QueryContext queryContext = mapping.newQueryOptions(SearchOptions.create(request)); assertThat(queryContext.getFieldsToReturn()).containsOnly( - RuleNormalizer.RuleField.CHARACTERISTIC_OVERLOADED.field(), - RuleNormalizer.RuleField.SUB_CHARACTERISTIC_OVERLOADED.field(), RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE_OVERLOADED.field()); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java index 6bcb2bcfcb4..2805464f2af 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java @@ -32,7 +32,6 @@ import org.sonar.api.server.debt.DebtRemediationFunction; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.DateUtils; import org.sonar.db.DbSession; -import org.sonar.db.debt.CharacteristicDto; import org.sonar.db.qualityprofile.ActiveRuleDto; import org.sonar.db.qualityprofile.ActiveRuleParamDto; import org.sonar.db.qualityprofile.QualityProfileDao; @@ -41,7 +40,6 @@ import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleParamDto; import org.sonar.db.rule.RuleTesting; import org.sonar.server.db.DbClient; -import org.sonar.server.debt.DebtTesting; import org.sonar.server.qualityprofile.QProfileTesting; import org.sonar.server.qualityprofile.db.ActiveRuleDao; import org.sonar.server.rule.db.RuleDao; @@ -70,8 +68,6 @@ public class SearchActionMediumTest { RulesWs ws; RuleDao ruleDao; DbSession dbSession; - int softReliabilityId; - int hardReliabilityId; @Before public void setUp() { @@ -180,41 +176,12 @@ public class SearchActionMediumTest { "\"rules\":[{\"key\":\"other:rule\",\"langName\":\"unknown\"}]}"); } - @Test - public void search_debt_rules() throws Exception { - insertDebtCharacteristics(dbSession); - - ruleDao.insert(dbSession, RuleTesting.newXooX1() - .setDefaultSubCharacteristicId(hardReliabilityId) - .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) - .setDefaultRemediationCoefficient("1h") - .setDefaultRemediationOffset("15min") - - .setSubCharacteristicId(null) - .setRemediationFunction(null) - .setRemediationCoefficient(null) - .setRemediationOffset(null) - ); - dbSession.commit(); - - WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); - request.setParam(WebService.Param.FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn"); - request.setParam(WebService.Param.FACETS, "debt_characteristics"); - WsTester.Result result = request.execute(); - result.assertJson(this.getClass(), "search_debt_rule.json"); - } - @Test public void search_debt_rules_with_default_and_overridden_debt_values() throws Exception { - insertDebtCharacteristics(dbSession); - ruleDao.insert(dbSession, RuleTesting.newXooX1() - .setDefaultSubCharacteristicId(hardReliabilityId) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1h") .setDefaultRemediationOffset("15min") - - .setSubCharacteristicId(softReliabilityId) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setRemediationCoefficient("2h") .setRemediationOffset("25min") @@ -222,22 +189,17 @@ public class SearchActionMediumTest { dbSession.commit(); WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); - request.setParam(WebService.Param.FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn"); + request.setParam(WebService.Param.FIELDS, "debtRemFn,debtOverloaded,defaultDebtRemFn"); WsTester.Result result = request.execute(); result.assertJson(this.getClass(), "search_debt_rules_with_default_and_overridden_debt_values.json"); } @Test public void search_debt_rules_with_default_linear_offset_and_overridden_constant_debt() throws Exception { - insertDebtCharacteristics(dbSession); - ruleDao.insert(dbSession, RuleTesting.newXooX1() - .setDefaultSubCharacteristicId(hardReliabilityId) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1h") .setDefaultRemediationOffset("15min") - - .setSubCharacteristicId(softReliabilityId) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.name()) .setRemediationCoefficient(null) .setRemediationOffset("5min") @@ -245,22 +207,17 @@ public class SearchActionMediumTest { dbSession.commit(); WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); - request.setParam(WebService.Param.FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn"); + request.setParam(WebService.Param.FIELDS, "debtRemFn,debtOverloaded,defaultDebtRemFn"); WsTester.Result result = request.execute(); result.assertJson(this.getClass(), "search_debt_rules_with_default_linear_offset_and_overridden_constant_debt.json"); } @Test public void search_debt_rules_with_default_linear_offset_and_overridden_linear_debt() throws Exception { - insertDebtCharacteristics(dbSession); - ruleDao.insert(dbSession, RuleTesting.newXooX1() - .setDefaultSubCharacteristicId(hardReliabilityId) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) .setDefaultRemediationCoefficient("1h") .setDefaultRemediationOffset("15min") - - .setSubCharacteristicId(softReliabilityId) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR.name()) .setRemediationCoefficient("1h") .setRemediationOffset(null) @@ -268,69 +225,11 @@ public class SearchActionMediumTest { dbSession.commit(); WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); - request.setParam(WebService.Param.FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn"); + request.setParam(WebService.Param.FIELDS, "debtRemFn,debtOverloaded,defaultDebtRemFn"); WsTester.Result result = request.execute(); result.assertJson(this.getClass(), "search_debt_rules_with_default_linear_offset_and_overridden_linear_debt.json"); } - @Test - public void debt_characteristics_is_sticky_facet() throws Exception { - insertDebtCharacteristics(dbSession); - - ruleDao.insert(dbSession, RuleTesting.newXooX1() - .setDefaultSubCharacteristicId(hardReliabilityId) - .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) - .setDefaultRemediationCoefficient("1h") - .setDefaultRemediationOffset("15min") - - .setSubCharacteristicId(null) - .setRemediationFunction(null) - .setRemediationCoefficient(null) - .setRemediationOffset(null) - ); - ruleDao.insert(dbSession, RuleTesting.newXooX2() - .setDefaultSubCharacteristicId(hardReliabilityId) - .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) - .setDefaultRemediationCoefficient("1h") - .setDefaultRemediationOffset("15min") - - .setSubCharacteristicId(softReliabilityId) - .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) - .setRemediationCoefficient("30min") - .setRemediationOffset("5min") - ); - ruleDao.insert(dbSession, RuleTesting.newXooX3() - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) - .setDefaultRemediationCoefficient("2min") - .setDefaultRemediationOffset("1min") - - .setSubCharacteristicId(null) - .setRemediationFunction(null) - .setRemediationCoefficient(null) - .setRemediationOffset(null) - ); - ruleDao.insert(dbSession, RuleTesting.newDto(RuleKey.of("xoo", "x4")).setLanguage("xoo") - .setDefaultSubCharacteristicId(softReliabilityId) - .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name()) - .setDefaultRemediationCoefficient("2min") - .setDefaultRemediationOffset("1min") - - .setSubCharacteristicId(-1) - .setRemediationFunction(null) - .setRemediationCoefficient(null) - .setRemediationOffset(null) - ); - dbSession.commit(); - - WsTester.Result result = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD) - .setParam(WebService.Param.FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn") - .setParam("debt_characteristics", "SOFT_RELIABILITY") - .setParam(WebService.Param.FACETS, "debt_characteristics") - .execute(); - result.assertJson(this.getClass(), "search_debt_rules_sticky.json"); - } - @Test public void search_template_rules() throws Exception { RuleDto templateRule = RuleTesting.newXooX1().setIsTemplate(true); @@ -643,19 +542,4 @@ public class SearchActionMediumTest { .setSeverity("BLOCKER"); } - private void insertDebtCharacteristics(DbSession dbSession) { - CharacteristicDto reliability = DebtTesting.newCharacteristicDto("RELIABILITY").setName("Reliability"); - db.debtCharacteristicDao().insert(dbSession, reliability); - - CharacteristicDto softReliability = DebtTesting.newCharacteristicDto("SOFT_RELIABILITY").setName("Soft Reliability") - .setParentId(reliability.getId()); - db.debtCharacteristicDao().insert(dbSession, softReliability); - softReliabilityId = softReliability.getId(); - - CharacteristicDto hardReliability = DebtTesting.newCharacteristicDto("HARD_RELIABILITY").setName("Hard Reliability") - .setParentId(reliability.getId()); - db.debtCharacteristicDao().insert(dbSession, hardReliability); - hardReliabilityId = hardReliability.getId(); - } - } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java index c04b4d82a53..7732ef92b17 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java @@ -32,12 +32,10 @@ import org.sonar.db.DbSession; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto.Format; import org.sonar.db.rule.RuleParamDto; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; +import org.sonar.db.rule.RuleTesting; import org.sonar.server.db.DbClient; import org.sonar.server.rule.NewRule; import org.sonar.server.rule.RuleService; -import org.sonar.db.rule.RuleTesting; import org.sonar.server.rule.db.RuleDao; import org.sonar.server.tester.ServerTester; import org.sonar.server.tester.UserSessionRule; @@ -51,7 +49,7 @@ public class ShowActionMediumTest { public static ServerTester tester = new ServerTester(); @Rule public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester).login() - .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN); + .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN); WsTester wsTester; @@ -86,7 +84,7 @@ public class ShowActionMediumTest { .setLanguage("xoo") .setTags(newHashSet("tag1", "tag2")) .setSystemTags(newHashSet("systag1", "systag2")) - ); + ); RuleParamDto param = RuleParamDto.createFor(ruleDto).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"); ruleDao.insertRuleParam(session, ruleDto, param); session.commit(); @@ -99,11 +97,6 @@ public class ShowActionMediumTest { @Test public void show_rule_with_default_debt_infos() throws Exception { - CharacteristicDto characteristicDto = new CharacteristicDto().setKey("API").setName("Api").setEnabled(true); - tester.get(CharacteristicDao.class).insert(session, characteristicDto); - CharacteristicDto subCharacteristicDto = new CharacteristicDto().setKey("API_ABUSE").setName("API Abuse").setEnabled(true).setParentId(characteristicDto.getId()); - tester.get(CharacteristicDao.class).insert(session, subCharacteristicDto); - RuleDto ruleDto = ruleDao.insert(session, RuleTesting.newDto(RuleKey.of("java", "S001")) .setName("Rule S001") @@ -112,15 +105,13 @@ public class ShowActionMediumTest { .setStatus(RuleStatus.BETA) .setConfigKey("InternalKeyS001") .setLanguage("xoo") - .setDefaultSubCharacteristicId(subCharacteristicDto.getId()) .setDefaultRemediationFunction("LINEAR_OFFSET") .setDefaultRemediationCoefficient("5d") .setDefaultRemediationOffset("10h") - .setSubCharacteristicId(null) .setRemediationFunction(null) .setRemediationCoefficient(null) .setRemediationOffset(null) - ); + ); session.commit(); session.clearCache(); @@ -133,11 +124,6 @@ public class ShowActionMediumTest { @Test public void show_rule_with_overridden_debt() throws Exception { - CharacteristicDto characteristicDto = new CharacteristicDto().setKey("API").setName("Api").setEnabled(true); - tester.get(CharacteristicDao.class).insert(session, characteristicDto); - CharacteristicDto subCharacteristicDto = new CharacteristicDto().setKey("API_ABUSE").setName("API Abuse").setEnabled(true).setParentId(characteristicDto.getId()); - tester.get(CharacteristicDao.class).insert(session, subCharacteristicDto); - RuleDto ruleDto = ruleDao.insert(session, RuleTesting.newDto(RuleKey.of("java", "S001")) .setName("Rule S001") @@ -146,15 +132,13 @@ public class ShowActionMediumTest { .setStatus(RuleStatus.BETA) .setConfigKey("InternalKeyS001") .setLanguage("xoo") - .setDefaultSubCharacteristicId(null) .setDefaultRemediationFunction(null) .setDefaultRemediationCoefficient(null) .setDefaultRemediationOffset(null) - .setSubCharacteristicId(subCharacteristicDto.getId()) .setRemediationFunction("LINEAR_OFFSET") .setRemediationCoefficient("5d") .setRemediationOffset("10h") - ); + ); session.commit(); session.clearCache(); @@ -165,16 +149,6 @@ public class ShowActionMediumTest { @Test public void show_rule_with_default_and_overridden_debt_infos() throws Exception { - CharacteristicDto defaultCharacteristic = new CharacteristicDto().setKey("API").setName("Api").setEnabled(true); - tester.get(CharacteristicDao.class).insert(session, defaultCharacteristic); - CharacteristicDto defaultSubCharacteristic = new CharacteristicDto().setKey("API_ABUSE").setName("API Abuse").setEnabled(true).setParentId(defaultCharacteristic.getId()); - tester.get(CharacteristicDao.class).insert(session, defaultSubCharacteristic); - - CharacteristicDto characteristic = new CharacteristicDto().setKey("OS").setName("Os").setEnabled(true); - tester.get(CharacteristicDao.class).insert(session, characteristic); - CharacteristicDto subCharacteristic = new CharacteristicDto().setKey("OS_RELATED_PORTABILITY").setName("Portability").setEnabled(true).setParentId(characteristic.getId()); - tester.get(CharacteristicDao.class).insert(session, subCharacteristic); - RuleDto ruleDto = ruleDao.insert(session, RuleTesting.newDto(RuleKey.of("java", "S001")) .setName("Rule S001") @@ -183,15 +157,13 @@ public class ShowActionMediumTest { .setStatus(RuleStatus.BETA) .setConfigKey("InternalKeyS001") .setLanguage("xoo") - .setDefaultSubCharacteristicId(defaultSubCharacteristic.getId()) .setDefaultRemediationFunction("LINEAR") .setDefaultRemediationCoefficient("5min") .setDefaultRemediationOffset(null) - .setSubCharacteristicId(subCharacteristic.getId()) .setRemediationFunction("LINEAR_OFFSET") .setRemediationCoefficient("5d") .setRemediationOffset("10h") - ); + ); session.commit(); session.clearCache(); @@ -211,15 +183,13 @@ public class ShowActionMediumTest { .setStatus(RuleStatus.BETA) .setConfigKey("InternalKeyS001") .setLanguage("xoo") - .setDefaultSubCharacteristicId(null) .setDefaultRemediationFunction(null) .setDefaultRemediationCoefficient(null) .setDefaultRemediationOffset(null) - .setSubCharacteristicId(null) .setRemediationFunction(null) .setRemediationCoefficient(null) .setRemediationOffset(null) - ); + ); session.commit(); session.clearCache(); @@ -228,33 +198,6 @@ public class ShowActionMediumTest { request.execute().assertJson(getClass(), "show_rule_with_no_default_and_no_overridden_debt.json"); } - @Test - public void show_rule_with_overridden_disable_debt() throws Exception { - RuleDto ruleDto = ruleDao.insert(session, - RuleTesting.newDto(RuleKey.of("java", "S001")) - .setName("Rule S001") - .setDescription("Rule S001 description") - .setSeverity(Severity.MINOR) - .setStatus(RuleStatus.BETA) - .setConfigKey("InternalKeyS001") - .setLanguage("xoo") - .setDefaultSubCharacteristicId(null) - .setDefaultRemediationFunction(null) - .setDefaultRemediationCoefficient(null) - .setDefaultRemediationOffset(null) - .setSubCharacteristicId(-1) - .setRemediationFunction(null) - .setRemediationCoefficient(null) - .setRemediationOffset(null) - ); - session.commit(); - session.clearCache(); - - WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") - .setParam("key", ruleDto.getKey().toString()); - request.execute().assertJson(getClass(), "show_rule_with_overridden_disable_debt.json"); - } - @Test public void encode_html_description_of_custom_rule() throws Exception { // Template rule diff --git a/server/sonar-server/src/test/java/org/sonar/server/startup/RegisterDebtModelTest.java b/server/sonar-server/src/test/java/org/sonar/server/startup/RegisterDebtModelTest.java deleted file mode 100644 index 35b3daaed1a..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/startup/RegisterDebtModelTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.startup; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.sonar.db.debt.CharacteristicDao; -import org.sonar.db.debt.CharacteristicDto; -import org.sonar.server.debt.DebtModelBackup; - -import java.util.Collections; - -import static com.google.common.collect.Lists.newArrayList; -import static org.mockito.Mockito.*; - -@RunWith(MockitoJUnitRunner.class) -public class RegisterDebtModelTest { - - @Mock - CharacteristicDao dao; - - @Mock - DebtModelBackup debtModelBackup; - - RegisterDebtModel registerDebtModel; - - @Before - public void setUp() { - registerDebtModel = new RegisterDebtModel(dao, debtModelBackup); - } - - @Test - public void create_debt_model() { - when(dao.selectEnabledCharacteristics()).thenReturn(Collections.emptyList()); - - registerDebtModel.start(); - - verify(debtModelBackup).reset(); - } - - @Test - public void not_create_debt_model_if_already_exists() { - when(dao.selectEnabledCharacteristics()).thenReturn(newArrayList(new CharacteristicDto())); - - registerDebtModel.start(); - - verifyZeroInteractions(debtModelBackup); - } -} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/step/LoadDebtModelStepTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/step/LoadDebtModelStepTest/shared.xml deleted file mode 100644 index 7b9e2db655f..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/computation/step/LoadDebtModelStepTest/shared.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtModelXMLExporterTest/export_xml.xml b/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtModelXMLExporterTest/export_xml.xml index 58efbf3938c..ef18e12ef83 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtModelXMLExporterTest/export_xml.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtModelXMLExporterTest/export_xml.xml @@ -1,32 +1,20 @@ - USABILITY - Usability - - - EFFICIENCY - Efficiency - - MEMORY_USE - Memory use - - checkstyle - Regexp - - remediationFunction - LINEAR_OFFSET - - - remediationFactor - 3 - d - - - offset - 15 - min - - - + checkstyle + Regexp + + remediationFunction + LINEAR_OFFSET + + + remediationFactor + 3 + d + + + offset + 15 + min + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules.xml b/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules.xml index e928211c84f..af3b906764e 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules.xml @@ -1,58 +1,33 @@ - USABILITY - Usability - Estimate usability + javasquid + rule1 + + remediationFactor + 3.0 + h + + + remediationFunction + linear + - EFFICIENCY - Efficiency - - MEMORY_EFFICIENCY - Memory use - - checkstyle - Regexp - - remediationFactor - 3.0 - h - - - remediationFunction - linear - - - - - - PORTABILITY - Portability - - COMPILER_RELATED_PORTABILITY - Compiler related portability - - - HARDWARE_RELATED_PORTABILITY - Hardware related portability - - checkstyle - Regexp2 - - remediationFactor - 3.0 - h - - - remediationFunction - linear_offset - - - offset - 1.0 - h - - - + javasquid + rule2 + + remediationFactor + 3.0 + h + + + remediationFunction + linear_offset + + + offset + 1.0 + h + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules_with_deprecated_quality_model_format.xml b/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules_with_deprecated_quality_model_format.xml new file mode 100644 index 00000000000..f8f7e9b6d5d --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/debt/DebtRulesXMLImporterTest/import_rules_with_deprecated_quality_model_format.xml @@ -0,0 +1,58 @@ + + + USABILITY + Usability + Estimate usability + + + EFFICIENCY + Efficiency + + MEMORY_EFFICIENCY + Memory use + + javasquid + rule1 + + remediationFactor + 3.0 + h + + + remediationFunction + linear + + + + + + PORTABILITY + Portability + + COMPILER_RELATED_PORTABILITY + Compiler related portability + + + HARDWARE_RELATED_PORTABILITY + Hardware related portability + + javasquid + rule2 + + remediationFactor + 3.0 + h + + + remediationFunction + linear_offset + + + offset + 1.0 + h + + + + + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic.xml b/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic.xml deleted file mode 100644 index b1bc93c12f7..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/not_disable_already_disabled_rules.xml b/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/not_disable_already_disabled_rules.xml index 8f1a5ba3428..84281aa3891 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/not_disable_already_disabled_rules.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/not_disable_already_disabled_rules.xml @@ -1,7 +1,5 @@ - - - - - - - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/update_rule_fields.xml b/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/update_rule_fields.xml index 946c1f6437a..43d756f1fb6 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/update_rule_fields.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/rule/RegisterRulesTest/update_rule_fields.xml @@ -1,7 +1,5 @@ - - - - - - - - - - - - - - - - - description", - "severity": "MINOR", - "status": "BETA", - "isTemplate": false, - "debtOverloaded": true, - "lang": "xoo" - } -} - diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/resources_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/resources_controller.rb index 5b7e125356c..c13baa7a803 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/resources_controller.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/resources_controller.rb @@ -185,7 +185,6 @@ class Api::ResourcesController < Api::ApiController measures_conditions << 'project_measures.person_id IS NULL' add_rule_filters(measures_conditions, measures_values) - add_characteristic_filters(measures_conditions, measures_values) measures=ProjectMeasure.all(:joins => :snapshot, :select => select_columns_for_measures, @@ -281,7 +280,7 @@ class Api::ResourcesController < Api::ApiController end def select_columns_for_measures - select_columns='project_measures.id,project_measures.value,project_measures.metric_id,project_measures.snapshot_id,project_measures.rule_id,project_measures.text_value,project_measures.characteristic_id,project_measures.measure_data' + select_columns='project_measures.id,project_measures.value,project_measures.metric_id,project_measures.snapshot_id,project_measures.rule_id,project_measures.text_value,project_measures.measure_data' if params[:includetrends]=='true' select_columns+=',project_measures.variation_value_1,project_measures.variation_value_2,project_measures.variation_value_3,project_measures.variation_value_4,project_measures.variation_value_5' end @@ -311,24 +310,6 @@ class Api::ResourcesController < Api::ApiController end - def add_characteristic_filters(measures_conditions, measures_values) - @characteristics=[] - @characteristic_by_id={} - if params[:characteristics].present? - @characteristics=Characteristic.all(:select => 'characteristics.id,characteristics.kee,characteristics.name', - :conditions => ['characteristics.kee IN (?)', params[:characteristics].split(',')]) - if @characteristics.empty? - measures_conditions<<'project_measures.characteristic_id=-1' - else - @characteristics.each { |c| @characteristic_by_id[c.id]=c } - measures_conditions<<'project_measures.characteristic_id IN (:characteristics)' - measures_values[:characteristics]=@characteristic_by_id.keys - end - else - measures_conditions<<'project_measures.characteristic_id IS NULL' - end - end - def to_json(objects) resources = objects[:sorted_resources] snapshots_by_rid = objects[:snapshots_by_rid] @@ -439,11 +420,6 @@ class Api::ResourcesController < Api::ApiController json_measure[:rule_key] = rule.key if rule json_measure[:rule_name] = rule.name if rule end - if measure.characteristic_id - characteristic=@characteristic_by_id[measure.characteristic_id] - json_measure[:ctic_key]=(characteristic ? characteristic.kee : '') - json_measure[:ctic_name]=(characteristic ? characteristic.name : '') - end end end json @@ -523,11 +499,6 @@ class Api::ResourcesController < Api::ApiController xml.rule_key(rule.key) if rule xml.rule_name(rule.name) if rule end - if measure.characteristic_id - characteristic=@characteristic_by_id[measure.characteristic_id] - xml.ctic_key(characteristic ? characteristic.kee : '') - xml.ctic_name(characteristic ? characteristic.name : '') - end end end end diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/timemachine_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/timemachine_controller.rb index ce04dd62885..037dadd20df 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/timemachine_controller.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/timemachine_controller.rb @@ -22,22 +22,19 @@ require 'fastercsv' class Api::TimemachineController < Api::ApiController MAX_IN_ELEMENTS=990 - class MetadataId < Struct.new(:metric_id, :characteristic_id) + class MetadataId < Struct.new(:metric_id) end - class Metadata < Struct.new(:metric, :characteristic) + class Metadata < Struct.new(:metric) def to_id @id ||= begin - MetadataId.new(self.metric.id, self.characteristic && self.characteristic.id) + MetadataId.new(self.metric.id) end end def to_s label=self.metric.key - if self.characteristic - label+="(#{characteristic.key})" - end label end end @@ -53,8 +50,6 @@ class Api::TimemachineController < Api::ApiController # Optional parameters : # - fromDateTime # - toDateTime - # - model - # - characteristics # def index begin @@ -95,16 +90,9 @@ class Api::TimemachineController < Api::ApiController sql_conditions << 'project_measures.metric_id IN (:metrics)' sql_values[:metrics] = @metrics.select{|m| m.id} - if @characteristics.empty? - sql_conditions<<'project_measures.characteristic_id IS NULL' - else - sql_conditions<<'project_measures.characteristic_id IN (:characteristics)' - sql_values[:characteristics]=@characteristics.select{|c| c.id} - end - measures = ProjectMeasure.find(:all, :joins => :snapshot, - :select => 'project_measures.id,project_measures.value,project_measures.text_value,project_measures.metric_id,project_measures.snapshot_id,project_measures.characteristic_id,snapshots.created_at', + :select => 'project_measures.id,project_measures.value,project_measures.text_value,project_measures.metric_id,project_measures.snapshot_id,snapshots.created_at', :conditions => [sql_conditions.join(' AND '), sql_values], :order => 'snapshots.created_at') @@ -118,7 +106,7 @@ class Api::TimemachineController < Api::ApiController @sids< 'characteristics.id,characteristics.kee,characteristics.name', - :joins => :quality_model, - :conditions => ['quality_models.name=? AND characteristics.kee IN (?)', params[:model], params[:characteristics].split(',')]) - else - @characteristics=[] - end - end - def load_metadata load_metrics - load_characteristics @metadata=[] @metrics.each do |metric| - if @characteristics.empty? - @metadata< metadata.metric.key} - if metadata.characteristic - col[:model]=characteristic.model.name - col[:characteristic]=characteristic.kee - end cols< ['characteristics.kee=? AND characteristics.enabled=?', params[:characteristic], true]) - end - options[:characteristic]=@characteristic if params[:period] && Api::Utils.valid_period_index?(params[:period]) @period=params[:period].to_i options[:period]=@period diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/helpers/components_helper.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/helpers/components_helper.rb index 64f83d1f554..ffb0b1727f3 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/helpers/components_helper.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/helpers/components_helper.rb @@ -68,7 +68,7 @@ module ComponentsHelper return nil if items.nil? items.each do |item| metric = Metric.by_name(metric_name) - return item if (item && metric && item.metric_id==metric.id && item.characteristic_id.nil? && item.person_id.nil?) + return item if (item && metric && item.metric_id==metric.id && item.person_id.nil?) end nil end diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/models/drilldown.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/models/drilldown.rb index bbd44a080e0..2da5ce2ba10 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/models/drilldown.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/models/drilldown.rb @@ -122,13 +122,6 @@ class DrilldownColumn conditions += ' AND project_measures.rule_id IS NULL ' end - if options[:characteristic] - conditions += ' AND project_measures.characteristic_id=:characteristic_id' - condition_values[:characteristic_id]=options[:characteristic].id - else - conditions += ' AND project_measures.characteristic_id IS NULL' - end - if @person_id conditions += ' AND project_measures.person_id=:person_id' condition_values[:person_id]=@person_id diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/models/measure_filter.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/models/measure_filter.rb index 255f6355966..f96887b5ded 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/models/measure_filter.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/models/measure_filter.rb @@ -277,7 +277,7 @@ class MeasureFilter < ActiveRecord::Base measures = [] snapshot_ids.each_slice(999) do |safe_for_oracle_ids| measures.concat(ProjectMeasure.all(:conditions => - ['rule_priority is null and rule_id is null and characteristic_id is null and person_id is null and snapshot_id in (?) and metric_id in (?)', safe_for_oracle_ids, metric_ids] + ['rule_priority is null and rule_id is null and person_id is null and snapshot_id in (?) and metric_id in (?)', safe_for_oracle_ids, metric_ids] )) end measures.each do |measure| @@ -313,7 +313,7 @@ class MeasureFilter < ActiveRecord::Base @base_row = Row.new(base_snapshot) unless metric_ids.empty? base_measures = ProjectMeasure.all(:conditions => - ['rule_priority is null and rule_id is null and characteristic_id is null and person_id is null and snapshot_id=? and metric_id in (?)', base_snapshot.id, metric_ids] + ['rule_priority is null and rule_id is null and person_id is null and snapshot_id=? and metric_id in (?)', base_snapshot.id, metric_ids] ) base_measures.each do |base_measure| @base_row.add_measure(base_measure) diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/models/project_measure.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/models/project_measure.rb index 4b42ca50ded..ed9b2dc0e24 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/models/project_measure.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/models/project_measure.rb @@ -28,7 +28,6 @@ class ProjectMeasure < ActiveRecord::Base belongs_to :snapshot belongs_to :rule belongs_to :project - belongs_to :characteristic belongs_to :person, :class_name => 'Project', :foreign_key => 'person_id' def metric @@ -245,8 +244,6 @@ class ProjectMeasure < ActiveRecord::Base if rule_measure? if rule_id "#{metric_key}_rule_#{rule_id}" - elsif characteristic_id - "#{metric_key}_c_#{characteristic_id}" end else metric_key diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/models/snapshot.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/models/snapshot.rb index fd175224e56..ebbd2eb771f 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/models/snapshot.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/models/snapshot.rb @@ -25,12 +25,10 @@ class Snapshot < ActiveRecord::Base belongs_to :root_project, :class_name => 'Project', :foreign_key => 'root_project_id' belongs_to :parent_snapshot, :class_name => 'Snapshot', :foreign_key => 'parent_snapshot_id' belongs_to :root_snapshot, :class_name => 'Snapshot', :foreign_key => 'root_snapshot_id' - belongs_to :characteristic - has_many :measures, :class_name => 'ProjectMeasure', :conditions => 'rule_id IS NULL AND characteristic_id IS NULL AND person_id IS NULL' - has_many :rulemeasures, :class_name => 'ProjectMeasure', :conditions => 'rule_id IS NOT NULL AND characteristic_id IS NULL AND person_id IS NULL', :include => 'rule' - has_many :characteristic_measures, :class_name => 'ProjectMeasure', :conditions => 'rule_id IS NULL AND characteristic_id IS NOT NULL AND person_id IS NULL' - has_many :person_measures, :class_name => 'ProjectMeasure', :conditions => 'rule_id IS NULL AND characteristic_id IS NULL AND person_id IS NOT NULL' + has_many :measures, :class_name => 'ProjectMeasure', :conditions => 'rule_id IS NULL AND person_id IS NULL' + has_many :rulemeasures, :class_name => 'ProjectMeasure', :conditions => 'rule_id IS NOT NULL AND person_id IS NULL', :include => 'rule' + has_many :person_measures, :class_name => 'ProjectMeasure', :conditions => 'rule_id IS NULL AND person_id IS NOT NULL' has_many :events, :dependent => :destroy, :order => 'event_date DESC' @@ -184,13 +182,6 @@ class Snapshot < ActiveRecord::Base nil end - def characteristic_measure(metric, characteristic) - characteristic_measures.each do |m| - return m if m.metric_id==metric.id && m.characteristic==characteristic - end - nil - end - def f_measure(metric) m=measure(metric) m && m.formatted_value diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/models/trends_chart.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/models/trends_chart.rb index fd1bb816517..2510866597d 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/models/trends_chart.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/models/trends_chart.rb @@ -27,7 +27,7 @@ class TrendsChart " and s.status=? " + " and s.project_id=? " + " and m.metric_id in (?) " + - " and m.rule_priority is null and m.characteristic_id is null and m.person_id is null" + " and m.rule_priority is null and m.person_id is null" if (options[:from]) sql += ' and s.created_at>=?' end diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/drilldown/measures.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/drilldown/measures.html.erb index 56d086e1fa9..f31229f1407 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/views/drilldown/measures.html.erb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/views/drilldown/measures.html.erb @@ -32,17 +32,11 @@ <% end %>
- <% if @characteristic %> -

<%= @highlighted_metric.short_name -%> / <%= h(@characteristic.name(true)) -%>

+

<%= @highlighted_metric.short_name -%>

-

<%= format_measure(@snapshot.characteristic_measure(@highlighted_metric, @characteristic)) %>

- <% else %> -

<%= @highlighted_metric.short_name -%>

- -

- <%= format_measure(@snapshot.measure(@highlighted_metric.key), :period => @period) %> -

- <% end %> +

+ <%= format_measure(@snapshot.measure(@highlighted_metric.key), :period => @period) %> +

<% if @highlighted_metric!=@metric %>

<%= message('drilldown.drilldown_on') -%>  diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/models/characteristic.rb b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/1102_delete_measures_with_characteristic_id.rb similarity index 53% rename from server/sonar-web/src/main/webapp/WEB-INF/app/models/characteristic.rb rename to server/sonar-web/src/main/webapp/WEB-INF/db/migrate/1102_delete_measures_with_characteristic_id.rb index 2633ee39b42..12e885a0a8b 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/models/characteristic.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/1102_delete_measures_with_characteristic_id.rb @@ -17,40 +17,15 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -class Characteristic < ActiveRecord::Base - NAME_MAX_SIZE=100 - - FUNCTION_CONSTANT_ISSUE = "constant_issue"; - FUNCTION_LINEAR = "linear"; - FUNCTION_LINEAR_WITH_OFFSET = "linear_offset"; - - DAY = "d" - HOUR = "h" - MINUTE = "mn" - - belongs_to :parent, :class_name => 'Characteristic', :foreign_key => 'parent_id' - - # Needed for Views Plugin. Remove it when the plugin will not used it anymore - belongs_to :rule - - validates_uniqueness_of :name, :scope => [:enabled], :case_sensitive => false, :if => Proc.new { |c| c.enabled } - validates_length_of :name, :in => 1..NAME_MAX_SIZE, :allow_blank => false - - def root? - parent_id.nil? - end - - def requirement? - rule_id.nil? - end - - def key - kee - end +# +# SonarQube 5.5 +# SONAR-7364 +# +class DeleteMeasuresWithCharacteristicId < ActiveRecord::Migration - def name(rule_name_if_empty=false) - read_attribute(:name) + def self.up + execute_java_migration('org.sonar.db.version.v55.DeleteMeasuresWithCharacteristicId') end end diff --git a/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/1103_drop_table_characteristics.rb b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/1103_drop_table_characteristics.rb new file mode 100644 index 00000000000..65b6c24cae9 --- /dev/null +++ b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/1103_drop_table_characteristics.rb @@ -0,0 +1,30 @@ +# +# SonarQube, open source software quality management tool. +# Copyright (C) 2008-2014 SonarSource +# mailto:contact AT sonarsource DOT com +# +# SonarQube is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# SonarQube is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# +# SonarQube 5.5 +# SONAR-7364 +class DropTableCharacteristics < ActiveRecord::Migration + + def self.up + drop_table 'characteristics' + end + +end + diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index 7dbf4985a90..13ed09f521f 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -1433,12 +1433,6 @@ widget.measure_filter_treemap.property.chartTitle.name=Chart Title widget.measure_filter_treemap.property.maxItems.name=Max Components widget.measure_filter_treemap.property.maxItems.desc=Maximum number of components to show -widget.technical_debt_pyramid.name=Technical Debt Pyramid -widget.technical_debt_pyramid.description=Displays the technical debt by characteristics. Characteristics located at the bottom should be addressed before those on top. -widget.technical_debt_pyramid.technical_debt=Technical Debt -widget.technical_debt_pyramid.total=Total -widget.technical_debt_pyramid.no_info_available=No information available. - widget.debt_overview.name=Technical Debt Synopsis widget.debt_overview.description=Display the SQALE rating and the technical debt ratio. widget.debt_overview.on_new_code=On New Code diff --git a/sonar-db/src/main/java/org/sonar/db/DaoModule.java b/sonar-db/src/main/java/org/sonar/db/DaoModule.java index bedee4a4bb1..96c1d3f6449 100644 --- a/sonar-db/src/main/java/org/sonar/db/DaoModule.java +++ b/sonar-db/src/main/java/org/sonar/db/DaoModule.java @@ -35,7 +35,6 @@ import org.sonar.db.dashboard.ActiveDashboardDao; import org.sonar.db.dashboard.DashboardDao; import org.sonar.db.dashboard.WidgetDao; import org.sonar.db.dashboard.WidgetPropertyDao; -import org.sonar.db.debt.CharacteristicDao; import org.sonar.db.duplication.DuplicationDao; import org.sonar.db.event.EventDao; import org.sonar.db.issue.ActionPlanDao; @@ -108,7 +107,6 @@ public class DaoModule extends Module { QualityProfileDao.class, PurgeDao.class, RuleDao.class, - CharacteristicDao.class, ResourceIndexDao.class, ResourceDao.class, ResourceKeyUpdaterDao.class, diff --git a/sonar-db/src/main/java/org/sonar/db/DbClient.java b/sonar-db/src/main/java/org/sonar/db/DbClient.java index be249d0e6be..601a4532267 100644 --- a/sonar-db/src/main/java/org/sonar/db/DbClient.java +++ b/sonar-db/src/main/java/org/sonar/db/DbClient.java @@ -35,7 +35,6 @@ import org.sonar.db.dashboard.ActiveDashboardDao; import org.sonar.db.dashboard.DashboardDao; import org.sonar.db.dashboard.WidgetDao; import org.sonar.db.dashboard.WidgetPropertyDao; -import org.sonar.db.debt.CharacteristicDao; import org.sonar.db.duplication.DuplicationDao; import org.sonar.db.event.EventDao; import org.sonar.db.issue.ActionPlanDao; @@ -75,7 +74,6 @@ public class DbClient { private final Database database; private final MyBatis myBatis; private final QualityProfileDao qualityProfileDao; - private final CharacteristicDao debtCharacteristicDao; private final LoadedTemplateDao loadedTemplateDao; private final PropertiesDao propertiesDao; private final SnapshotDao snapshotDao; @@ -130,7 +128,6 @@ public class DbClient { for (Dao dao : daos) { map.put(dao.getClass(), dao); } - debtCharacteristicDao = getDao(map, CharacteristicDao.class); qualityProfileDao = getDao(map, QualityProfileDao.class); loadedTemplateDao = getDao(map, LoadedTemplateDao.class); propertiesDao = getDao(map, PropertiesDao.class); @@ -217,10 +214,6 @@ public class DbClient { return qualityProfileDao; } - public CharacteristicDao debtCharacteristicDao() { - return debtCharacteristicDao; - } - public LoadedTemplateDao loadedTemplateDao() { return loadedTemplateDao; } diff --git a/sonar-db/src/main/java/org/sonar/db/MyBatis.java b/sonar-db/src/main/java/org/sonar/db/MyBatis.java index 5cf731bcd2f..5076f23dc21 100644 --- a/sonar-db/src/main/java/org/sonar/db/MyBatis.java +++ b/sonar-db/src/main/java/org/sonar/db/MyBatis.java @@ -56,8 +56,6 @@ import org.sonar.db.dashboard.WidgetDto; import org.sonar.db.dashboard.WidgetMapper; import org.sonar.db.dashboard.WidgetPropertyDto; import org.sonar.db.dashboard.WidgetPropertyMapper; -import org.sonar.db.debt.CharacteristicDto; -import org.sonar.db.debt.CharacteristicMapper; import org.sonar.db.debt.RequirementMigrationDto; import org.sonar.db.deprecated.WorkQueue; import org.sonar.db.duplication.DuplicationMapper; @@ -205,7 +203,6 @@ public class MyBatis { confBuilder.loadAlias("PermissionTemplate", PermissionTemplateDto.class); confBuilder.loadAlias("PermissionTemplateUser", PermissionTemplateUserDto.class); confBuilder.loadAlias("PermissionTemplateGroup", PermissionTemplateGroupDto.class); - confBuilder.loadAlias("Characteristic", CharacteristicDto.class); confBuilder.loadAlias("UserWithPermission", UserWithPermissionDto.class); confBuilder.loadAlias("GroupWithPermission", GroupWithPermissionDto.class); confBuilder.loadAlias("QualityProfile", QualityProfileDto.class); @@ -237,7 +234,7 @@ public class MyBatis { SchemaMigrationMapper.class, WidgetMapper.class, WidgetPropertyMapper.class, UserMapper.class, GroupMapper.class, UserGroupMapper.class, UserTokenMapper.class, FileSourceMapper.class, ActionPlanMapper.class, ActionPlanStatsMapper.class, - NotificationQueueMapper.class, CharacteristicMapper.class, + NotificationQueueMapper.class, GroupMembershipMapper.class, QualityProfileMapper.class, ActiveRuleMapper.class, MeasureMapper.class, MetricMapper.class, CustomMeasureMapper.class, QualityGateMapper.class, QualityGateConditionMapper.class, ComponentMapper.class, SnapshotMapper.class, ProjectQgateAssociationMapper.class, EventMapper.class, diff --git a/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDao.java b/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDao.java deleted file mode 100644 index 9649d124602..00000000000 --- a/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDao.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.debt; - -import com.google.common.collect.Lists; -import java.util.Collection; -import java.util.List; -import javax.annotation.CheckForNull; -import org.apache.ibatis.session.SqlSession; -import org.sonar.db.Dao; -import org.sonar.db.DbSession; -import org.sonar.db.MyBatis; - -import static com.google.common.collect.Lists.newArrayList; - -public class CharacteristicDao implements Dao { - - private final MyBatis mybatis; - - public CharacteristicDao(MyBatis mybatis) { - this.mybatis = mybatis; - } - - /** - * @return enabled root characteristics and characteristics - */ - public List selectEnabledCharacteristics() { - SqlSession session = mybatis.openSession(false); - try { - return selectEnabledCharacteristics(session); - } finally { - MyBatis.closeQuietly(session); - } - } - - public List selectEnabledCharacteristics(SqlSession session) { - return session.getMapper(CharacteristicMapper.class).selectEnabledCharacteristics(); - } - - /** - * @return all characteristics - */ - public List selectCharacteristics() { - SqlSession session = mybatis.openSession(false); - try { - return selectCharacteristics(session); - } finally { - MyBatis.closeQuietly(session); - } - } - - public List selectCharacteristics(SqlSession session) { - return session.getMapper(CharacteristicMapper.class).selectCharacteristics(); - } - - /** - * @return only enabled root characteristics, order by order - */ - public List selectEnabledRootCharacteristics() { - SqlSession session = mybatis.openSession(false); - try { - return selectEnabledRootCharacteristics(session); - } finally { - MyBatis.closeQuietly(session); - } - } - - /** - * @return only enabled root characteristics, order by order - */ - public List selectEnabledRootCharacteristics(SqlSession session) { - return session.getMapper(CharacteristicMapper.class).selectEnabledRootCharacteristics(); - } - - public List selectCharacteristicsByParentId(int parentId) { - SqlSession session = mybatis.openSession(false); - try { - return selectCharacteristicsByParentId(parentId, session); - } finally { - MyBatis.closeQuietly(session); - } - } - - public List selectCharacteristicsByParentId(int parentId, SqlSession session) { - return session.getMapper(CharacteristicMapper.class).selectCharacteristicsByParentId(parentId); - } - - public List selectCharacteristicsByIds(Collection ids) { - SqlSession session = mybatis.openSession(false); - try { - return selectCharacteristicsByIds(ids, session); - } finally { - MyBatis.closeQuietly(session); - } - } - - public List selectCharacteristicsByIds(Collection ids, SqlSession session) { - List dtos = newArrayList(); - List> partitionList = Lists.partition(newArrayList(ids), 1000); - for (List partition : partitionList) { - dtos.addAll(session.getMapper(CharacteristicMapper.class).selectCharacteristicsByIds(partition)); - } - return dtos; - } - - @CheckForNull - public CharacteristicDto selectByKey(String key) { - SqlSession session = mybatis.openSession(false); - try { - return selectByKey(key, session); - } finally { - MyBatis.closeQuietly(session); - } - } - - @CheckForNull - public CharacteristicDto selectByKey(String key, SqlSession session) { - return session.getMapper(CharacteristicMapper.class).selectByKey(key); - } - - @CheckForNull - public CharacteristicDto selectById(int id) { - SqlSession session = mybatis.openSession(false); - try { - return selectById(session, id); - } finally { - MyBatis.closeQuietly(session); - } - } - - @CheckForNull - public CharacteristicDto selectById(SqlSession session, int id) { - return session.getMapper(CharacteristicMapper.class).selectById(id); - } - - @CheckForNull - public CharacteristicDto selectByName(String name) { - SqlSession session = mybatis.openSession(false); - try { - return selectByName(session, name); - } finally { - MyBatis.closeQuietly(session); - } - } - - @CheckForNull - public CharacteristicDto selectByName(SqlSession session, String name) { - return session.getMapper(CharacteristicMapper.class).selectByName(name); - } - - public int selectMaxCharacteristicOrder() { - SqlSession session = mybatis.openSession(false); - try { - return selectMaxCharacteristicOrder(session); - } finally { - MyBatis.closeQuietly(session); - } - } - - public int selectMaxCharacteristicOrder(SqlSession session) { - Integer result = session.getMapper(CharacteristicMapper.class).selectMaxCharacteristicOrder(); - return result != null ? result : 0; - } - - public void insert(SqlSession session, CharacteristicDto dto) { - session.getMapper(CharacteristicMapper.class).insert(dto); - } - - public void insert(CharacteristicDto dto) { - SqlSession session = mybatis.openSession(false); - try { - insert(session, dto); - session.commit(); - } finally { - MyBatis.closeQuietly(session); - } - } - - public void insert(DbSession session, Collection items) { - for (CharacteristicDto item : items) { - insert(session, item); - } - } - - public void insert(DbSession session, CharacteristicDto item, CharacteristicDto... others) { - insert(session, Lists.asList(item, others)); - } - - public void update(CharacteristicDto dto, SqlSession session) { - session.getMapper(CharacteristicMapper.class).update(dto); - } - - public void update(CharacteristicDto dto) { - SqlSession session = mybatis.openSession(false); - try { - update(dto, session); - session.commit(); - } finally { - MyBatis.closeQuietly(session); - } - } - -} diff --git a/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDto.java b/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDto.java deleted file mode 100644 index d8c9b084687..00000000000 --- a/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicDto.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.debt; - -import java.io.Serializable; -import java.util.Date; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.sonar.api.technicaldebt.batch.internal.DefaultCharacteristic; - -public class CharacteristicDto implements Serializable { - - private Integer id; - private String kee; - private String name; - private Integer parentId; - private Integer characteristicOrder; - private Date createdAt; - private Date updatedAt; - private boolean enabled; - - public Integer getId() { - return id; - } - - public CharacteristicDto setId(Integer id) { - this.id = id; - return this; - } - - public String getKey() { - return kee; - } - - public CharacteristicDto setKey(String s) { - this.kee = s; - return this; - } - - public String getName() { - return name; - } - - public CharacteristicDto setName(String s) { - this.name = s; - return this; - } - - @CheckForNull - public Integer getParentId() { - return parentId; - } - - public CharacteristicDto setParentId(@Nullable Integer i) { - this.parentId = i; - return this; - } - - @CheckForNull - public Integer getOrder() { - return characteristicOrder; - } - - public CharacteristicDto setOrder(@Nullable Integer i) { - this.characteristicOrder = i; - return this; - } - - public Date getCreatedAt() { - return createdAt; - } - - public CharacteristicDto setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - return this; - } - - @CheckForNull - public Date getUpdatedAt() { - return updatedAt; - } - - public CharacteristicDto setUpdatedAt(@Nullable Date updatedAt) { - this.updatedAt = updatedAt; - return this; - } - - public boolean isEnabled() { - return enabled; - } - - public CharacteristicDto setEnabled(boolean enabled) { - this.enabled = enabled; - return this; - } - - public DefaultCharacteristic toCharacteristic(@Nullable DefaultCharacteristic parent) { - return new DefaultCharacteristic() - .setId(id) - .setKey(kee) - .setName(name) - .setOrder(characteristicOrder) - .setParent(parent) - .setRoot(parent) - .setCreatedAt(createdAt) - .setUpdatedAt(updatedAt); - } - - public static CharacteristicDto toDto(DefaultCharacteristic characteristic, @Nullable Integer parentId) { - return new CharacteristicDto() - .setKey(characteristic.key()) - .setName(characteristic.name()) - .setOrder(characteristic.order()) - .setParentId(parentId) - .setEnabled(true) - .setCreatedAt(characteristic.createdAt()) - .setUpdatedAt(characteristic.updatedAt()); - } - -} diff --git a/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicMapper.java b/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicMapper.java deleted file mode 100644 index 070c02fdb44..00000000000 --- a/sonar-db/src/main/java/org/sonar/db/debt/CharacteristicMapper.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.debt; - -import java.util.List; -import org.apache.ibatis.annotations.Param; - -public interface CharacteristicMapper { - - List selectEnabledCharacteristics(); - - List selectCharacteristics(); - - List selectEnabledRootCharacteristics(); - - List selectCharacteristicsByParentId(int parentId); - - List selectCharacteristicsByIds(@Param("ids") List ids); - - CharacteristicDto selectByKey(String key); - - CharacteristicDto selectById(int id); - - CharacteristicDto selectByName(String name); - - Integer selectMaxCharacteristicOrder(); - - void insert(CharacteristicDto characteristic); - - int update(CharacteristicDto characteristic); - - void deleteRequirementsFromCharacteristicsTable(); - - List selectDeprecatedRequirements(); -} diff --git a/sonar-db/src/main/java/org/sonar/db/measure/MeasureDto.java b/sonar-db/src/main/java/org/sonar/db/measure/MeasureDto.java index 630df5eb55f..8bc470b9ec1 100644 --- a/sonar-db/src/main/java/org/sonar/db/measure/MeasureDto.java +++ b/sonar-db/src/main/java/org/sonar/db/measure/MeasureDto.java @@ -45,7 +45,6 @@ public class MeasureDto { private Long snapshotId; private Integer metricId; private Integer ruleId; - private Integer characteristicId; private Long developerId; // TODO to delete – not in db @@ -201,16 +200,6 @@ public class MeasureDto { return this; } - @CheckForNull - public Integer getCharacteristicId() { - return characteristicId; - } - - public MeasureDto setCharacteristicId(@Nullable Integer characteristicId) { - this.characteristicId = characteristicId; - return this; - } - @CheckForNull public Long getDeveloperId() { return developerId; @@ -249,7 +238,6 @@ public class MeasureDto { .add("snapshotId", snapshotId) .add("metricId", metricId) .add("ruleId", ruleId) - .add("characteristicId", characteristicId) .add("developerId", developerId) .add("metricKey", metricKey) .toString(); diff --git a/sonar-db/src/main/java/org/sonar/db/measure/PastMeasureDto.java b/sonar-db/src/main/java/org/sonar/db/measure/PastMeasureDto.java index b45122b5098..7f32a678832 100644 --- a/sonar-db/src/main/java/org/sonar/db/measure/PastMeasureDto.java +++ b/sonar-db/src/main/java/org/sonar/db/measure/PastMeasureDto.java @@ -29,7 +29,6 @@ public class PastMeasureDto { private Double value; private Integer metricId; private Integer ruleId; - private Integer characteristicId; private Integer personId; public Long getId() { @@ -64,16 +63,6 @@ public class PastMeasureDto { return this; } - @CheckForNull - public Integer getCharacteristicId() { - return characteristicId; - } - - public PastMeasureDto setCharacteristicId(@Nullable Integer characteristicId) { - this.characteristicId = characteristicId; - return this; - } - @CheckForNull public Integer getPersonId() { return personId; diff --git a/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java b/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java index ec8ebbc2ba8..14aa4f3b3d7 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java +++ b/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java @@ -29,7 +29,7 @@ import org.sonar.db.MyBatis; public class DatabaseVersion { - public static final int LAST_VERSION = 1101; + public static final int LAST_VERSION = 1103; /** * The minimum supported version which can be upgraded. Lower @@ -52,7 +52,6 @@ public class DatabaseVersion { "authors", "ce_activity", "ce_queue", - "characteristics", "dashboards", "duplications_index", "events", diff --git a/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java b/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java index 1c472d444fb..6e9c1d24bf6 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java +++ b/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java @@ -70,6 +70,7 @@ import org.sonar.db.version.v54.MigrateUsersIdentity; import org.sonar.db.version.v54.RemoveComponentPageProperties; import org.sonar.db.version.v54.RemovePreviewPermission; import org.sonar.db.version.v55.AddRulesLongDateColumns; +import org.sonar.db.version.v55.DeleteMeasuresWithCharacteristicId; import org.sonar.db.version.v55.FeedRulesLongDateColumns; public class MigrationStepModule extends Module { @@ -139,7 +140,8 @@ public class MigrationStepModule extends Module { // 5.5 AddRulesLongDateColumns.class, - FeedRulesLongDateColumns.class + FeedRulesLongDateColumns.class, + DeleteMeasuresWithCharacteristicId.class ); } } diff --git a/sonar-db/src/main/java/org/sonar/db/version/v55/DeleteMeasuresWithCharacteristicId.java b/sonar-db/src/main/java/org/sonar/db/version/v55/DeleteMeasuresWithCharacteristicId.java new file mode 100644 index 00000000000..9e835b71d3a --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/version/v55/DeleteMeasuresWithCharacteristicId.java @@ -0,0 +1,54 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.version.v55; + +import java.sql.SQLException; +import org.sonar.db.Database; +import org.sonar.db.version.BaseDataChange; +import org.sonar.db.version.MassUpdate; +import org.sonar.db.version.Select; +import org.sonar.db.version.SqlStatement; + +public class DeleteMeasuresWithCharacteristicId extends BaseDataChange { + + public DeleteMeasuresWithCharacteristicId(Database db) { + super(db); + } + + @Override + public void execute(Context context) throws SQLException { + MassUpdate massUpdate = context.prepareMassUpdate(); + massUpdate.select("SELECT id FROM project_measures WHERE characteristic_id IS NOT NULL"); + massUpdate.update("DELETE FROM project_measures WHERE id=?"); + massUpdate.rowPluralName("measures with characteristic"); + massUpdate.execute(new MigrationHandler()); + } + + private static class MigrationHandler implements MassUpdate.Handler { + + @Override + public boolean handle(Select.Row row, SqlStatement update) throws SQLException { + Long id = row.getNullableLong(1); + update.setLong(1, id); + return true; + } + } + +} diff --git a/sonar-db/src/main/resources/org/sonar/db/debt/CharacteristicMapper.xml b/sonar-db/src/main/resources/org/sonar/db/debt/CharacteristicMapper.xml deleted file mode 100644 index a5f7aa7848a..00000000000 --- a/sonar-db/src/main/resources/org/sonar/db/debt/CharacteristicMapper.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - c.id, - c.kee as kee, - c.name as name, - c.parent_id as parentId, - c.characteristic_order as characteristicOrder, - c.enabled as enabled, - c.created_at as createdAt, - c.updated_at as updatedAt - - - - - - - - - - - - - - - - - - - - - - INSERT INTO characteristics (kee, name, parent_id, characteristic_order, enabled, created_at, updated_at) - VALUES (#{kee,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{parentId,jdbcType=INTEGER}, - #{characteristicOrder,jdbcType=INTEGER}, #{enabled,jdbcType=BOOLEAN}, #{createdAt,jdbcType=TIMESTAMP}, - #{updatedAt,jdbcType=TIMESTAMP}) - - - - update characteristics set - name=#{name}, - parent_id=#{parentId}, - characteristic_order=#{characteristicOrder}, - enabled=#{enabled}, - updated_at=#{updatedAt} - where id=#{id} - - - - - - DELETE FROM characteristics WHERE rule_id IS NOT NULL - - - diff --git a/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml b/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml index 93a1fa7c7d8..d0747a1a205 100644 --- a/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml @@ -6,7 +6,6 @@ pm.id, pm.metric_id as metricId, pm.rule_id as ruleId, - pm.characteristic_id as characteristicId, pm.person_id as developerId, pm.snapshot_id as snapshotId, pm.value as value, @@ -163,7 +162,7 @@